雖然把咱們用到的JS文件所有打包一個能夠節省請求數,但若是打包後的JS文件過大,那麼也容易出現白屏現象,許多操做失靈。並且一些區域是點到纔出現,那麼相關的JS其實能夠剝離出這個大JS文件外。這就涉及到異步加載了。異步加載是SPA的重要構建方式之一。javascript
咱們沿着上一篇的目錄,此次學習webpack的require.ensure API。此文件也叫作ensure.html,涉及到avalon, jquery,還有兩個業務代碼ensure.js與ensure_a.js.css
先看咱們的頁面:html
<!DOCTYPE html> <html> <head> <title>require.ensure</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width"> <script src="dist/common.js"></script> <script src="dist/ensure.js"></script> </head> <body ms-controller="test"> <p><button type="button" ms-click="click">{{aaa}}</button></p> <div id="add"></div> </body> </html>
咱們的目的是在點擊按鈕後,再動態生成一個HTML區域,裏面使用avalon進行渲染。java
//ensure.js var avalon = require("avalon") avalon.define({ $id: "test", aaa: "測試require.ensure效果", click: function () { avalon.log("進入點擊事件回調") if (!avalon.vmodels.bbb) { require.ensure(["jquery"], function () {//這裏是異步的 console.log("進入require.ensure回調") require("./ensure_a.js") console.log("調用完require.ensure") }) } } })
它須要動態加載另外一個業務代碼,而且必須待到jquery加載回來才執行。jquery
var avalon = require("avalon") var $ = require("jquery") avalon.log("這是異步加載的腳本") $("#add").html("{{bbb}}") var vm = avalon.define({ $id: "bbb", bbb: "這是新加的內容" }) avalon.scan($("#add")[0], vm)
最後咱們看重頭戲的webpack.config.js, 爲了抽象異步的部分爲一個獨立的文件,咱們須要爲它指定名字,這使用output.chunkFilename配置項實現,還須要指定路徑,這使用output.publicPath配置項實現。webpack
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', ensure: './dev/ensure' }, output: { path: path.join(__dirname, "dist"), filename: "[name].js", publicPath:"dist/", //給require.ensure用 chunkFilename: "[name].chunk.js"//給require.ensure用 }, //頁面引用的文件 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的,須要在這裏進行別名 } } }
而後執行webpack命令就能看到效果:web