code-splitting是webpack最引人矚目的特性之一,此特性將代碼分離到不一樣的bundle文件中。詳細介紹官網code-split,此次實現則在筆者上次文件打包之上作開發。webpack
官網上有三種方式實現git
1本質則是多個入口的chunk,2則在以common.js爲入口文件,將多入口的chunk切分爲按切割文件,經過jsonp加載。在這裏筆者則介紹最爲複雜的3的實現,github
對於webpack 的切割文件的引入本質就是jsonp,動態引入一個約定好格式的js,並運行。web
__webpack_require__.e = function requireEnsure(chunkId) { .... var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.src = __webpack_require__.p + "" + chunkId + ".bundle.js"; head.appendChild(script); .... }
切割文件去除註釋以下:json
webpackJsonp([1],[function(){},function(){}])
而在入口文件的webpackJsonpCallback函數內,則是將切割的文件包含的modules依次放入存儲在modules內數組
function webpackJsonpCallback(chunkIds, moreModules){ .... for(moduleId in moreModules) { if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { modules[moduleId] = moreModules[moduleId]; } } } ....
因此實現以上功能需求以下:數據結構
例子app
require('d'); function a() { require.ensure(['./a'], function () { require('c'); }); } require.ensure(['./b'], function () { require('./m'); }); require('./e');
實現思路:異步
數據結構以下:async
{ filename: '/Users/zhujian/Documents/workspace/webpack/simple-webpack/example/main.js', id: 0, requires: [{ name: 'd', range: [8, 11], id: 1 }], rangeRequires: [[0, 7]], asyncs: [{ requires: [{ name: './a', id: 2 }, { name: 'c', range: [88, 91], id: 3 }], asyncs: [], rangeRequires: [80, 87], ensureRequires: [34, 58] }, { requires: [{ name: './b', id: 4 }, { name: './m', range: [156, 161], id: 5 }], asyncs: [], rangeRequires: [148, 155], ensureRequires: [106, 130] }], }
因爲各個依賴文件的源碼都包含在modlues內,因此chunks包含的是具體各個切割文件所包需module的moduleId。
實現思路:
數據結構以下
{ '0': { id: 0, modules: { '0': 'include', '1': 'include', '2': 'include' } }, '1': { id: 1, modules: { '1': 'in-parent', '3': 'include', '4': 'include', '5': 'include', '6': 'include' }, parentId: 0 }, '2': { id: 2, modules: { '5': 'include', '6': 'include' }, parentId: 0 } }
實現思路:
如:
本人的簡易版webpack實現simple-webpack
(完)