在最開始使用Webpack的時候, 都是將全部的js文件所有打包到一個build.js
文件中(文件名取決與在webpack.config.js
文件中output.filename
), 可是在大型項目中, build.js
可能過大, 致使頁面加載時間過長. 這個時候就須要code splitting
, code splitting
就是將文件分割成塊(chunk)
, 咱們能夠定義一些分割點(split point)
, 根據這些分割點對文件進行分塊, 並實現按需加載.javascript
require.ensure
進行按需加載.下面的代碼是基於vue-cli
的webpack-simple
模板生成的演示文檔html
//cmd
vue init webpack-simple code_spliting_demo
複製代碼
咱們假設項目中引入了jquery.js
和respond.js
, 那麼咱們能夠在webpack.config.js
中配置多入口來進行將這兩個第三方類庫單獨打包.vue
在webpack.config.js
進行配置java
//webpack.config.js
//在entry中添加相應第三方類庫
entry: {
bundle: './src/main.js',
vendor: ['./src/lib/jquery-1.10.2.min.js', './src/lib/respond.min.js']
}
//在plugins中添加CommonChunkPlugin
plugins:[
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
filename: 'vendor.bundle.js'
})
]
複製代碼
執行npm run build
, 此時dist
目錄下生成了兩個文件, 分別是build.js
和vendor.bundle.js
node
在index.html
中引入, 注意: vendor.bundle.js
優先於build.js
引入jquery
//index.html
<script src="/dist/vendor.bundle.js"></script>
<script src="/dist/build.js"></script>
複製代碼
咱們能夠在router
中進行配置, 實現組件的按需加載, 在一些單個組件文件較大的時候, 採用按需加載可以減小build.js
的體積, 優化加載速度(若是組件的體積較小, 那麼採用按需加載會增長額外的http請求
, 反倒增長了加載時間)webpack
這裏, 咱們增長3個組件,分別是A.vue
, B.vue
, C.vue
web
//A.vue
<template>
<h1>這裏是A.vue組件</h1>
</template>
//B.vue
<template>
<h1>這裏是B.vue組件</h1>
</template>
//C.vue
<template>
<h1>這裏是C.vue組件</h1>
</template>
複製代碼
在路由中進行配置 (注意:這裏是爲了方便, 是在app.js
中添加的路由, 在實際的項目中, 路由應該單獨抽取出來)vue-router
//app.js
import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
//AMD規範的異步載入
const ComA = resolve => require(['./components/A.vue' ], resolve);
const ComB = resolve => require(['./components/B.vue' ], resolve);
const ComC = resolve => require(['./components/C.vue' ], resolve);
const router = new VueRouter({
routes: [
{
name: 'component-A',
path: '/a',
component: ComA
},
{
name: 'component-B',
path: '/b',
component: ComB
},
{
name: 'component-C',
path: '/c',
component: ComC
}
]
})
new Vue({
el: '#app',
router: router,
render: h => h(App)
})
複製代碼
在webpack.config.js
中進行配置output.chunkFilename
,vue-cli
//webpack.config.js
output: {
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
filename: 'build.js',
//添加chundkFilename
chunkFilename: '[name].[chunkhash:5].chunk.js'
}
複製代碼
執行npm run build
, 此時dist
目錄下生成了5個文件, 多出的3個文件,就是對應的A.vue
, B.vue
, C.vue
這三個組件
剛纔在路由引入的時候, 使用的是AMD規範
的異步載入. webpack
提供了require.ensure()
這個方法實現CMD規範
的異步載入. 這一樣也是webpack
推薦的載入方式.想深刻了解ensure
, 請點擊《webpack代碼分離 ensure 看了還不懂,你打我》
require.ensure()
方法對路由進行配置//app.js
import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
//AMD風格的異步加載
// const ComA = resolve => require(['./components/A.vue' ], resolve);
// const ComB = resolve => require(['./components/B.vue' ], resolve);
// const ComC = resolve => require(['./components/C.vue' ], resolve);
//CMD風格的異步加載
const ComA = resolve => require.ensure([], () => resolve(require('./components/A.vue')));
const ComB = resolve => require.ensure([], () => resolve(require('./components/B.vue')));
const ComC = resolve => require.ensure([], () => resolve(require('./components/C.vue')));
const router = new VueRouter({
routes: [
{
name: 'component-A',
path: '/a',
component: ComA
},
{
name: 'component-B',
path: '/b',
component: ComB
},
{
name: 'component-C',
path: '/c',
component: ComC
}
]
})
new Vue({
el: '#app',
router: router,
render: h => h(App)
})
複製代碼
npm run build
後, dist
目錄下一樣生成5個文件