webpack模块化道理简析
1.webpack的中心道理
统统皆模块:在webpack中,css,html.js,静态资本文件等都能够视作模块;便于管理,利于反复应用;
按需加载:举行代码支解,完成按需加载。
2.
webpack
模块化道理:以js
为例,剖析webpack
构建common.js
的模块化体式格局。
①构建示例代码
//b.js let b =3 export {b}; //a.js let b = require('./b.js') let a = b+123; //webpack.config.js let path = require("path") module.exports = { entry: './a.js', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'build')}, module: { loaders: [{ test: /\.js$/, loader: 'babel-loader', query: { presets: ['es2015']}}}}
②剖析
bundle.js
a.团体构造:全部
bundle.js
全部是一个实行函数,传进去的参数是一个个的模块,也是一个的函数,经由过程函数的作用于到达模块化的结果。(function (modules) {………………})([ //模块初始化 function (module, exports, __webpack_require__) { /* 模块a.js的代码 */}, function (module, exports, __webpack_require__) { /* 模块b.js的代码 */}]);
b.模块初始化
//1.定义一个模块缓存的容器 var installedModules = {}; //2.webpack的require完成 function __webpack_require__(moduleId) {//传参是模块ID //3.推断模块是不是缓存,如果缓存了就不必加载,直接返还这个已缓存的模块 if(installedModules[moduleId]) { return installedModules[moduleId].exports;} // 4.如果没有被缓存,则缓存这个模块 var module = installedModules[moduleId] = { i: moduleId, //模块ID l: false, //标识模块是不是加载 exports: {} }; //5.实行模块函数,modules代表一系列的模块函数,要动态绑定module.exports,绑定this;能够交织一连援用。 modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); // 6.标记模块已被加载 module.l = true; // 7.返回该模块的exports return module.exports;} //8.require第一个 模块 return __webpack_require__(0); }
c.模块函数
//a.js模块 function(module, exports, __webpack_require__) { "use strict"; var b = __webpack_require__(1);//反复挪用 var a = b + 123;} //b.js模块 function(module, exports, __webpack_require__) { "use strict"; var b = 3; exports.b = b;}
d.下面是实行的流程图,指定一个初始模块,一切被援用的模块会相应的轮回加载。
ps
几个小题目1.在模块加载的时刻,末了通报的一个参数是
__webpack_require__
,是全局定义的函数,为何是全局的呢,由于自实行函数的this
指向全局。2.
commond.js
须要注重模块导出的题目①
exports
不能直接赋值,无用,由于源码中返回的是module.exports
;②能够在
exports
上增添属性,比方exports.fn=
;如许module.exports
会变化,终究导出的是module.exports
也会变化;//node.js部份源码,node也是经由过程闭包完成模块的断绝 (function(exports,module,require,__dirname,__filename){ this = module.exports //this是指向module.exports的 module.exports = exports = {} return module.exports})()