問題一:引入前端庫,方法也是不一樣的
比如 lodash.js ,作為一個 chunk 用 html-webpack-plugin 打包到頁面里,會生成一個全局變量 window._ ,在其它 js 中不必 require('lodash'); 就可以直接使用 window._
比如 webpack-zepto,作為一個 chunk 用 html-webpack-plugin 打包到頁面里,不會生成 window.$ ,如果在其它 js 中直接使用 window.$ ,就會報錯。需要在其它 js 中 var $ = require('webpack-zepto'); 這樣 zepto 和頁面 js 會打包到一個文件里,體積太大,而且不利於瀏覽器緩存
為了有效利用瀏覽器緩存,避免單個 js 體積太大,我們希望每個前端庫打包成一個 js ,和頁面邏輯分開
問題二:CommonsChunkPlugin
針對上一個問題,大家會提出使用 CommonsChunkPlugin ,參考這里
然而,使用 CommonsChunkPlugin 后,被指定的公共文件成了 js 的入口,其它 js 包括其它前端庫都依賴這個 js ,如:
entry : {
'lodash' : ['lodash'],
'zepto' : ['webpack-zepto'],
},
plugins : [
new CommonsChunkPlugin({
names : ['zepto', 'lodash']
}),
...
]
打包后的 zepto.js
/******/ (function(modules) { // webpackBootstrap
/******/ // install a JSONP callback for chunk loading
/******/ var parentJsonpFunction = window["webpackJsonp"];
/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkIds, moreModules) {
打包后的 lodash.js
webpackJsonp([2],{
/***/ 0:
/***/ function(module, exports, __webpack_require__) {
那么必須指定 zepto.js 放在 lodash.js 的前面,不然就會報 webpackJsonp 未定義的錯誤!
然而原本 zepto 和 lodash 是沒有相互依賴的關系的,能忍?
還有更不能妥協的場景,我要引入一個 jsA,它原本沒有任何依賴,但它必須放在 head 里,因為它加載時會執行 document.write
打包時,我可以指定 jsA 放在 head 里,然而現在它依賴於 zepto 了,就必須把 zepto + jsA 放在 head 里
目前的解決方案:
不使用 CommonsChunkPlugin,每一個前端庫,新建一個 js 專門 require 它,並生成一個全局變量,如:
lib/_zepto.js
window.$ = require("webpack-zepto");
然后作為一個 chunk 打包到頁面中
這樣解決了以上兩個問題:
1. 每個前端庫打包成一個獨立 js,可以有效利用瀏覽器緩存,生成全局變量,頁面 js 中可以直接使用
2. 不相互依賴的前端庫位置隨意,只要確保它們都在頁面邏輯 js 前引入就可以了
拋磚引玉,請高手批評指正!謝謝!
