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
(完)