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

相关文章
|
25天前
|
监控 前端开发 JavaScript
Webpack 中 HMR 插件的工作原理
【10月更文挑战第23天】可以进一步深入探讨 HMR 工作原理的具体细节、不同场景下的应用案例,以及与其他相关技术的结合应用等方面的内容。通过全面、系统地了解 HMR 插件的工作原理,能够更好地利用这一功能,为项目的成功开发提供有力保障。同时,要不断关注技术的发展动态,以便及时掌握最新的 HMR 技术和最佳实践。
|
25天前
|
缓存 前端开发 JavaScript
Webpack 动态加载的原理
【10月更文挑战第23天】Webpack 动态加载通过巧妙的机制和策略,实现了模块的按需加载和高效运行,提升了应用程序的性能和用户体验。同时,它也为前端开发提供了更大的灵活性和可扩展性,适应了不断变化的业务需求和技术发展。
|
25天前
|
缓存 前端开发 JavaScript
webpack 原理
【10月更文挑战第23天】Webpack 原理是一个复杂但又非常重要的体系。它通过模块解析、依赖管理、加载器和插件的协作,实现了对各种模块的高效打包和处理,为现代前端项目的开发和部署提供了强大的支持。同时,通过代码分割、按需加载、热模块替换等功能,提升了应用程序的性能和用户体验。随着前端技术的不断发展,Webpack 也在不断演进和完善,以适应不断变化的需求和挑战。
|
1月前
|
缓存 前端开发 JavaScript
Webpack 打包的基本原理
【10月更文挑战第5天】
|
1月前
|
前端开发 JavaScript
ES6模块化和webpack打包
【10月更文挑战第5天】
|
1月前
|
缓存 前端开发 JavaScript
深入了解Webpack:模块打包的革命
【10月更文挑战第11天】深入了解Webpack:模块打包的革命
|
1月前
|
缓存 前端开发 JavaScript
Webpack技术深度解析:模块打包与性能优化
【10月更文挑战第13天】Webpack技术深度解析:模块打包与性能优化
|
1月前
|
前端开发 JavaScript 开发者
深入了解Webpack:现代JavaScript应用的打包利器
【10月更文挑战第11天】 深入了解Webpack:现代JavaScript应用的打包利器
|
2月前
|
JavaScript 前端开发
手写一个简易bundler打包工具带你了解Webpack原理
该文章通过手写一个简易的打包工具bundler,帮助读者理解Webpack的工作原理,包括模块解析、依赖关系构建、转换源代码以及生成最终输出文件的整个流程。
|
4月前
|
缓存 JSON 前端开发
Webpack打包优化实践
【7月更文挑战第17天】Webpack的打包优化是一个持续的过程,需要开发者根据项目的实际情况选择合适的优化策略。通过拆分代码、压缩代码、使用Tree Shaking、优化加载器配置、利用缓存以及进行性能分析,我们可以有效提升Webpack的打包效率和应用的加载
下一篇
无影云桌面