webpack是一个现代js应用程序的静态模块打包工具。当webpack处理应用程序时,它会递归地构建一个依赖关系图,其中包括应用程序需要的每个模块,然后将这些模块打包成一个或多个bundle。webpack有代码转换,文件优化,代码分割,模块合并等功能。
在了解webpack原理前,先介绍几个核心概念:
entry:入口,可抽象成输入。
module:模块,一个模块对应着一个文件。Webpack 会从配置的 Entry 开始递归找出所有依赖的模块。
chunk:代码块,一个chunk由多个模块组合而成,用于代码的合并和分割。
loader:模块转换器,用于把模块原内容按照需求转换成新内容。Loader 就像是一个翻译员,能把源文件经过转化后输出新的结果,并且一个文件还可以链式的经过多个翻译员翻译。
plugin:扩展插件,在webpack构建流程中的特定机会广播出对应的事件,插件可以监听这些事件的发生,在特定时机做对应的事情。Webpack 通过 Plugin 机制让其更加灵活,以适应各种应用场景。
在开发 Plugin 时最常用的两个对象就是 Compiler 和 Compilation,它们是 Plugin 和 Webpack 之间的桥梁。Compiler 和 Compilation 的区别在于:Compiler 代表了整个 Webpack 从启动到关闭的生命周期,而 Compilation 只是代表了一次新的编译。
Webpack 的运行流程是一个串行的过程,从启动到结束会依次执行以下流程:
在以上过程中,Webpack 会在特定的时间点广播出特定的事件,插件在监听到感兴趣的事件后会执行特定的逻辑,并且插件可以调用 Webpack 提供的 API 改变 Webpack 的运行结果。
输出文件分析
Webpack 输出的 bundle.js
是什么样子呢? 为什么原来一个个的模块文件被合并成了一个单独的文件?为什么 bundle.js
能直接运行在浏览器中?
bundle.js
能直接运行在浏览器中的原因在于输出的文件中通过 __webpack_require__
函数定义了一个可以在浏览器中执行的加载函数来模拟 Node.js 中的 require
语句。
一个个独立的模块文件被合并到了一个单独的 bundle.js
的原因在于浏览器不能像 Node.js 那样快速地去本地加载一个个模块文件,而必须通过网络请求去加载还未得到的文件。 如果模块数量很多,加载时间会很长,因此把所有模块都存放在了数组中,执行一次网络加载。
Webpack 还做了缓存优化: 执行加载过的模块不会再执行第二次,执行结果会缓存在内存中,当某个模块第二次被访问时会直接去内存中读取被缓存的返回值。
原文链接:https://segmentfault.com/a/1190000015088834?utm_source=tag-newest
原文:https://www.cnblogs.com/lora404/p/12487639.html