webpack 打包時到底如何組織js


問題一:引入前端庫,方法也是不一樣的

比如 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 前引入就可以了

 

拋磚引玉,請高手批評指正!謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM