這是上一篇《webpack打包avalon+oniui+jquery》的姐妹篇,avalon 的高級應用篇。大家要知道,現在最流行的網頁架構就是SPA,SPA能提高用戶體驗。用戶許多數據都在保存到本地,第二次跳回此子頁時,不用重新遠程請求數據與頁面。
avalon的mmRouter吸收了 backbone.History與angular路由器模塊的優點,簡單易用,性能優良(router匹配方法使用字典樹實現,比純正則匹配快許多)。
我們沿用上一篇的目錄,在dev下建立一個mmRouter目錄,將mmRouter用到的兩個模板引進來
這次我們添加了兩個頁面,就需要添加兩個入口JS文件。webpack里面也做了相應調整,並且使用webpack.optimize.CommonsChunkPlugin將共用部分抽取出來
var webpack = require("webpack");
var path = require("path");
var commonsPlugin = new webpack.optimize.CommonsChunkPlugin('common.js');
module.exports = {
entry: {
index: './dev/index', //我們開發時的入口文件
router: './dev/router',
router2: './dev/router2'
},
output: {
path: path.join(__dirname, "dist"),
filename: "[name].js"}, //頁面引用的文件
module: {
loaders: [
{test: /\.css$/, loader: 'style-loader!css-loader'}
],
preLoaders: [
{test: /\.js$/, loader: "amdcss-loader"}
]
},
plugins: [commonsPlugin],
resolve: {
extensions: ['.js', "", ".css"],
alias: {
jquery: path.join(__dirname, 'dev/jquery/jquery.js'),
avalon: path.join(__dirname, 'dev/avalon/avalon.shim'), //在正常情況下我們以CommonJS風格引用avalon,以require('avalon')
'../avalon': path.join(__dirname, 'dev/avalon/avalon.js')//由於oniui都以是../avalon來引用avalon的,需要在這里進行別名
}
}
}
我們來看第一個頁面,是做一個切換卡。當我們點擊鏈接時,改變地址欄,然后mmHistory被監聽到,通知mmRouter在所有路由規則中進行匹配,匹配到了,就進入對應回調,修改VM中的對應屬性,進行切換!
var avalon = require("avalon")
require("./mmRouter/mmRouter")
var vm = avalon.define({
$id: "test",
tabs: [
{trigger: "切換卡1", panel: "面板1"},
{trigger: "切換卡2", panel: "面板2"},
{trigger: "切換卡3", panel: "面板3"}
],
currentIndex: 1
});
avalon.router.get("/:id", function (a) {
avalon.log(typeof a, a, "這在回調里")
vm.currentIndex = a
});
avalon.history.start();
avalon.scan(0, vm);
setTimeout(function(){
avalon.router.navigate("1")//默認切換到中間項
},400)
router.html
<!DOCTYPE html>
<html>
<head>
<title>mmRouter組件</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<script src="dist/common.js"></script>
<script src="dist/router.js"></script>
<style>
.tabs{
list-style: none;
margin: 0px;
padding: 0px;
}
.tabs li{
float: left;
display: inline-block;
width:200px;
height:30px;
line-height: 30px;
text-align: center;
background: green;
border-left: 1px dashed darkkhaki;
}
.tabs li a{
cursor: pointer;
text-decoration: none;
display: inline-block;
height: 100%;
width: 100%;
color: #999;
}
.tabs li.active{
background: goldenrod;
}
.tabs li.active a{
color:#fff;
}
.tabs li:first-child{
border-left: 0 none;
}
.tabs:after{
content: "";
clear: both;
display: table;
}
.panel{
width:604px;
height:120px;
background: floralwhite;
}
</style>
</head>
<body ms-controller="test">
<h1>mmRouter綜合實例一: avalon.get</h1>
<ul class="tabs">
<li ms-repeat="tabs" ms-class="active:$index == currentIndex">
<a ms-href="#!/{{$index}}">{{el.trigger}}</a>
</li>
</ul>
<div class="panel" ms-repeat="tabs" ms-visible="$index == currentIndex">{{el.panel}}</div>
</body>
</html>
再看另一個頁面
var avalon = require("avalon")
require("./mmRouter/mmRouter")
var vm = avalon.define({
$id: "test",
path: ""
});
avalon.router.get("/:id/*path", function (a) {
avalon.log(typeof a, a, "math more")
vm.path = this.path
});
avalon.router.get("/:id", function (a) {
avalon.log(typeof a, a, "這在回調里")
vm.path = this.path
});
avalon.history.start();
avalon.scan(0, vm);
router2.html
<!DOCTYPE html>
<html>
<head>
<title>mmRouter組件</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<script src="dist/common.js"></script>
<script src="dist/router2.js"></script>
</head>
<body ms-controller="test">
<ul>
<li><a href="#!/aaa">aaa</a></li>
<li><a href="#!/bbb">bbb</a></li>
<li><a href="#!/ccc">ccc</a></li>
<li><a href="#!/ddd/222">ddd</a></li>
<li><a href="#!/eee">eee</a></li>
</ul>
<h1>{{path}}</h1>
</body>
</html>
然后運行webpack命令
