webpack提取公共模組-CommonsChunkPlugin
CommonsChunkPlugin官方文件解釋:
CommonsChunkPlugin 外掛,是一個可選的用於建立一個獨立檔案(又稱作 chunk)的功能,這個檔案包括多個入口 chunk 的公共模組。通過將公共模組拆出來,最終合成的檔案能夠在最開始的時候載入一次,便存到快取中供後續使用。這個帶來速度上的提升,因為瀏覽器會迅速將公共的程式碼從快取中取出來,而不是每次訪問一個新頁面時,再去載入一個更大的檔案。
而在實際專案中,本人是這樣的應用的,專案結構如下圖:
其中的index
和login
用到了 m1.js,m2.js
的方法,程式碼如下:
import {xiaoyu} from '../m1.js'
import {dayu} from '../m2.js'
在webpack.config.js
是這麼配置的:
entry:{
'index':['./src/page/index/index.js'],
'login':['./src/page/login/index.js']
},
output:{
path:path.resolve(__dirname, 'dist'),
filename:'js/[name].js'
},
所以最後打包,會在./dist/
下面分別打包出index.js和login.js
, 看了一下打包後的檔案。
毫無意外,這兩個檔案裡面都打包了 m1.js,m2.js
其實完全可以把
m1.js,m2.js
單獨提取出來合成一個檔案引入到需要的頁面上去,這樣就不用重複的打包了,這個時候就用到CommonsChunkPlugin這個外掛
在webpack.config.js
配置如下
plugins:[
new webpack.optimize.CommonsChunkPlugin({
name : 'common',
filename : 'js/base.js'
})
]
加入後再重新打包
會發現 dist
下面的js資料夾下面會多出一個base.js
的打包檔案,裡面就是把 m1.js,m2.js
只需要在主檔案下面引入
base.js
就可以了
還有一個問題就是
m1.js,m2.js
是我分別在用到的時候 import
引入進來的,如果有一個檔案存放的就是共用方法,那我難道要把這個檔案import
引入到所有的檔案裡面去嗎?
這個問題CommonsChunkPlugin也是能解決的:
首先需求如下圖
在common下面的檔案是我的公用方法,那麼我可以把common下的方法一同打包到base.js
,這樣就直接一個檔案全域性引用了
webpack.config.js
配置如下
entry:{//首先在入口引入公共檔案,取名'common'
'commom':['./src/page/common/index.js']
'index':['./src/page/index/index.js'],
'login':['./src/page/login/index.js']
},
output:{
path:path.resolve(__dirname, 'dist'),
filename:'js/[name].js'
},
plugins:[
new webpack.optimize.CommonsChunkPlugin({
name : 'common',//這裡的'common'回去找上面入口處引入的common
filename : 'js/base.js'
})
]
最後,在這裡記錄一個使用CommonsChunkPlugin時的坑
打包時報錯webpackJsonp is not defined
其實就是你打包的公共模組 base.js並沒有引用,引用時必須放在打包的其他的js檔案的上面