Open MrSeaWave opened 3 years ago
loader:webpack自身只支持js和json这两种格式的文件,对于其他文件需要通过loader将其转换为commonJS规范的文件后,webpack才能解析到 plugin:是用于在webpack打包编译过程里,在对应的事件节点里执行自定义操作,比如资源管理、打包优化、环境变量注入等,目的是解决 loader 无法实现的其他事
loader:让webpack能够处理非js文件(自身职能理解js),然后你就可以利用 webpack 的打包能力,对它们进行处理。 例如:css-loader、style-loader、postcss-loader、sass-loader
plugins:从打包优化和压缩,一直到重新定义环境中的变量. 例如:uglify-webpack-plugin、clean-webpack-plugin、babel-polyfill
通俗点讲loader是转换,plugin是执行比转换更复杂的任务,比如合并压缩等
加载文件完成后,输出文件前,不同的plugins有不同的执行时机。
Loader 本身仅仅只是一个函数,接收模块代码的内容,然后返回代码内容转化后的结果,并且一个文件还可以链式的经过多个loader转化(比如scss-loader => css-loader => style-loader)。
一个 Loader 的职责是单一的,只需要完成一种转化。 如果一个源文件需要经历多步转化才能正常使用,就通过多个 Loader 去转化。 在调用多个 Loader 去转化一个文件时,每个 Loader 会链式的顺序执行, 第一个 Loader 将会拿到需处理的原内容,上一个 Loader 处理后的结果会传给下一个接着处理,最后的 Loader 将处理后的最终结果返回给 Webpack。
module.exports = function(source) {
// source 为 compiler 传递给 Loader 的一个文件的原内容
// 该函数需要返回处理后的内容,这里简单起见,直接把原内容返回了,相当于该 Loader 没有做任何转换
return source;
};
plugin 的实现可以是一个类,使用时传入相关配置来创建一个实例,然后放到配置的 plugins 字段中,而 plugin 实例中最重要的方法是 apply,该方法在 webpack compiler 安装插件时会被调用一次,apply 接收 webpack compiler 对象实例的引用,你可以在 compiler 对象实例上注册各种事件钩子函数,来影响 webpack 的所有构建流程,以便完成更多其他的构建任务。
class BasicPlugin{
// 在构造函数中获取用户给该插件传入的配置
constructor(options){
}
// Webpack 会调用 BasicPlugin 实例的 apply 方法给插件实例传入 compiler 对象
apply(compiler){
compiler.plugin('compilation',function(compilation) {
})
}
}
// 导出 Plugin
module.exports = BasicPlugin;
Webpack 启动后,在读取配置的过程中会先执行 new BasicPlugi(options) 初始化一个 BasicPlugin 获得其实例。 在初始化 compiler 对象后,再调用 basicPlugin.apply(compiler) 给插件实例传入 compiler 对象。 插件实例在获取到 compiler 对象后,就可以通过 compiler.plugin(事件名称, 回调函数) 监听到 Webpack 广播出来的事件。 并且可以通过 compiler 对象去操作 Webpack。
开发 Plugin 最主要的就是理解 compiler 和 compilation,它们是Plugin 和 Webpack 之间的桥梁。这两者提供的各种 hooks 和 api,则是开发plugin 所必不可少的材料,通过 compiler 和 compilation 的生命周期 hooks,也可以更好地深入了解 webpack 的整个构建工作是如何进行的。
webpack 是一个用于现代JavaScript 应用程序的静态模块打包工具。