webpack打包编译结果的原理分析

简介: webpack打包编译结果的原理分析
/**
 * 这是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?")
    }
})


模块化代码如下图:


20200630123740967.png


结果和webpack得出的一样,如下:


20200630123821123.png

相关文章
|
1月前
|
JavaScript 前端开发
webpack成长指北第9章---webpack如何对icon字体进行打包
webpack成长指北第9章---webpack如何对icon字体进行打包
28 1
|
1月前
|
前端开发 JavaScript
webpack成长指北第7章---webpack的css\less\scss样式打包
webpack成长指北第7章---webpack的css\less\scss样式打包
41 0
|
1月前
|
前端开发 JavaScript
webpack成长指北第8章---webpack的CSS Modules打包
webpack成长指北第8章---webpack的CSS Modules打包
19 0
|
4月前
webpack 使用打包报错 ERROR in node_modules\@types\node\ts4.8\assert.d.ts
webpack 使用打包报错 ERROR in node_modules\@types\node\ts4.8\assert.d.ts
106 0
|
4月前
|
JavaScript 数据库
使用 Webpack 打包 node 程序,node_modules 真的被干掉啦
使用 Webpack 打包 node 程序,node_modules 真的被干掉啦
67 0
|
2月前
|
缓存 前端开发 算法
Webpack 进阶:深入理解其工作原理与优化策略
Webpack 进阶:深入理解其工作原理与优化策略
43 2
|
3月前
|
前端开发 JavaScript 开发者
webpack打包机制,构建过程和配置
webpack打包机制,构建过程和配置
19 0
|
3月前
|
JavaScript 前端开发
在项目中引入webpack打包工具
在项目中引入webpack打包工具
|
3月前
|
资源调度 前端开发 JavaScript
vue - ES6模块化、promise、webpack打包(所在在学的朋友们先看这篇,看了不吃亏)...
vue - ES6模块化、promise、webpack打包(所在在学的朋友们先看这篇,看了不吃亏)...
|
4月前
|
JSON JavaScript 前端开发
对webpack的理解——打包样式资源
对webpack的理解——打包样式资源
23 0

热门文章

最新文章