参考几篇文章后简单整理、
1 . loader运行在打包文件之前(loader为在模块加载时的预处理文件) 2. plugins在整个编译周期都起作用。
1.loader
从本质上来说其实就是一个node
模块。相当于一台榨汁机(loader)
将相关类型的文件代码(code)
给它。根据我们设置的规则,经过它的一系列加工后还给我们加工好的果汁(code)
。在Webpack中,一切皆模块,我们常见的Javascript、CSS、Less、Typescript、Jsx、图片等文件都是模块,不同模块的加载是通过模块加载器来统一管理的,当我们需要使用不同的 Loader 来解析不同类型的文件时,我们可以在module.rules字段下配置相关规则。
loader
编写原则
- 单一原则: 每个
Loader
只做一件事; - 链式调用:
Webpack
会按顺序链式调用每个Loader
; - 统一原则: 遵循
Webpack
制定的设计规则和结构,输入与输出均为字符串,各个Loader
完全独立,即插即用;
常见loader
file-loader
: 文件加载url-loader
: 文件加载,可以设置阈值,小于时把文件base64
编码image-loader
: 加载并压缩图片babel-loader
:ES6+
转成ES5
ts-loader
: 将ts
转成js
css-loader
:处理@import
和url
这样的外部资源style-loader
: 在head
创建style
标签把样式插入- .
postcss-loader
: 扩展css
语法,使用postcss
各种插件autoprefixer,cssnext,cssnano
2.在 Webpack
运行的生命周期中会广播出许多事件,Plugin
可以监听这些事件,在合适的时机通过Webpack
提供的API
改变输出结果。通俗来说:一盘美味的 菜品·需要经历烧油 炒制 调味到最后的装盘等过程,而plugin
相当于可以监控每个环节并进行操作,比如可以写一个少放胡椒粉plugin
,监控webpack
暴露出的生命周期事件(调味),在调味的时候执行少放胡椒粉操作。那么它与loader
的区别是什么呢?上面我们也提到了loader
的单一原则,loader
只能一件事,比如说less-loader
,只能解析less
文件,plugin
则是针对整个流程执行广泛的任务。
Webpack 就像一条生产线,要经过一系列处理流程后才能将源文件转换成输出结果。 这条生产线上的每个处理流程的职责都是单一的,多个流程之间有存在依赖关系,只有完成当前处理后才能交给下一个流程去处理。 插件就像是一个插入到生产线中的一个功能,在特定的时机对生产线上的资源做处理。
ignore-plugin
:忽略文件mini-css-extract-plugin
: 分离样式文件,css
提取为独立文件,支持按需加载clean-webpack-plugin
: 目录清理html-webpack-plugin
可以根据模板自动生成html
代码,并自动引用css
和js
文件extract-text-webpack-plugin
将js
文件中引用的样式单独抽离成css
文件DefinePlugin
编译时配置全局变量,这对开发模式和发布模式的构建允许不同的行为非常有用HotModuleReplacementPlugin
热更新optimize-css-assets-webpack-plugin
不同组件中重复的css
可以快速去重
链接:https://juejin.cn/post/6873360407604822029
链接:https://juejin.cn/post/7067051380803895310
参考链接:https://juejin.cn/post/6844904031240863758