这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战webpack
本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序须要的每一个模块,而后将全部这些模块打包成一个或多个 bundle。经过代码分割成单元片断并按需加载。web
webpack 不只可让咱们编写模块,并且还支持任何模块格式(至少在咱们到达 ESM 以前),而且能够同时处理资源和资产,这也是 webpack 存在的缘由。markdown
如下是webpack.config.js的基本配置,更多配置请移步webpack配置oop
const path = require('path');
module.exports = {
mode: 'development',
entry: './foo.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'foo.bundle.js',
},
};
复制代码
入口起点(entry point)指示 webpack 应该使用哪一个模块,来做为构建其内部依赖图的开始。post
进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。优化
每一个依赖项随即被处理,最后输出到称之为 bundles 的文件中。ui
output 属性告诉 webpack 在哪里输出它所建立的 bundles,以及如何命名这些文件,默认值为 ./dist。url
基本上,整个应用程序结构,都会被编译到你指定的输出路径的文件夹中。spa
模块,在 Webpack 里一切皆模块,一个模块对应着一个文件。Webpack 会从配置的 Entry 开始递归找出全部依赖的模块。插件
代码块,一个 Chunk 由多个模块组合而成,用于代码合并与分割。
loader是文件转换器,能够将全部类型的文件转换为 webpack 可以处理的有效模块。
本质上,webpack 只能理解 JavaScript 和 JSON 文件,这是 webpack 开箱可用的自带能力。loader 让 webpack 可以去处理其余类型的文件,并将它们转换为应用程序的依赖图(和最终的 bundle)能够直接引用的模块。
webpack 就像一条生产线,要通过一系列处理流程后才能将源文件转换成输出结果。 这条生产线上的每一个处理流程的职责都是单一的,多个流程之间有存在依赖关系,只有完成当前处理后才能交给下一个流程去处理。 插件就像是一个插入到生产线中的一个功能,在特定的时机对生产线上的资源作处理。
处理一个文件能够使用多个loader,loader的执行顺序和配置中的顺序是相反的,即最后一个loader最早执行,第一个loader最后执行
第一个执行的loader接收源文件内容做为参数,其它loader接收前一个执行的loader的返回值做为参数,最后执行的loader会返回此模块的JavaScript源码
loader 用于转换某些类型的模块,而插件则能够用于执行范围更广的任务。包括:打包优化,资源管理,注入环境变量。
在webpack运行的生命周期中会广播出许多事件,plugin能够监听这些事件,在合适的时机经过webpack提供的API改变输出结果。
webpack 经过 Tapable 来组织这条复杂的生产线。 webpack 在运行过程当中会广播事件,插件只须要监听它所关心的事件,就能加入到这条生产线中,去改变生产线的运做。 webpack 的事件流机制保证了插件的有序性,使得整个系统扩展性很好。
对于loader,它是一个转换器,单纯的文件转换过程
plugin是一个扩展器,它丰富了webpack自己,针对是loader结束后,webpack打包的整个过程,它并不直接操做文件,而是基于事件机制工做,会监听webpack打包过程当中的某些节点,执行普遍的任务
Webpack 的运行流程是一个串行的过程,从启动到结束会依次执行如下流程 :
在以上过程当中,Webpack 会在特定的时间点广播出特定的事件,插件在监听到感兴趣的事件后会执行特定的逻辑,而且插件能够调用 Webpack 提供的 API 改变 Webpack 的运行结果。
若是这篇文章帮到了你,记得点赞👍收藏加关注哦😊,但愿点赞多多多多...
文中若有错误,欢迎在评论区指正