/** * 这是webpack打包的编译结果的原理,首先一个立即执行函数,这样使得调用js后立即执行 */ (function (modules) { // 使用一个对象来缓存所有的模块,这样使的不会重复导入模块 var storeResult = {}; function __webpack_require(modulePath) { // 如果缓存里面导入过该模块,那么不需要在重新导入模块,返回改模块导出的结果 if (storeResult[modulePath]) { return storeResult[modulePath]; } // 获取执行的结果函数 var func = modules[modulePath]; var module = { exports: {} } // 执行函数获取结果 func(module, module.exports, __webpack_require); var moduleResult = module.exports; // 获取模块导出的结果 storeResult[modulePath] = moduleResult; return moduleResult; } // 运行'./src/index.js' 这个函数,所有使用一个函数来运行 return __webpack_require('./src/index.js') })({ // 采用回调参数的形式传递所有的模块,所有的模块以路径作为key,value是一个函数,来执行所有模块里面的东西 './src/index.js': function (module, exports, __webpack_require) { // var b = __webpack_require('./src/b.js') // console.log(b); // 使用eval的作用是为了适应js的虚拟引擎,然后通过浏览器可以认识的锚点,来定位打包后错误的位置 //# sourceURL=webpack:///./src/index.js? eval(" var b = __webpack_require('./src/b.js');\n console.log(b);//# sourceURL=webpack:///./src/index.js?") }, './src/a.js': function (module, exports, __webpack_require) { // console.log("this is a module"); // module.exports = "a"; eval("console.log(\"this is a module\");\n module.exports = \"a\";//# sourceURL=webpack:///./src/a.js?") }, './src/b.js': function (module, exports, __webpack_require) { // var a = __webpack_require("./src/a.js"); // console.log("this is b module"); // console.log(a); // module.exports = "b"; eval("var a = __webpack_require(\"./src/a.js\");\nconsole.log(\"this is b module\");\nconsole.log(a);\n module.exports =\"b\";\n//# sourceURL=webpack:///./src/b.js?") } })
模块化代码如下图:
结果和webpack得出的一样,如下: