本文作者为 360 奇舞团前端开发工程师
webpack
是Javascript
工具链的关键部分。webpack
是个用于现代JavaScript
应用程序的静态模块打包工具。它不仅可以支持ESM
和CommonJS
模块化编程,而且还可以支持或扩展支持许多不同的静态资源,例如:Files
,Images
, Fonts
, JS
, CSS
, HTML
等。
Plugin
概念
插件 是webpack
的支柱功能,它是一个具有apply
方法的JavaScript
对象。apply
方法会被webpack compiler
调用,并且插件在其整个生命周期都可以访问到compiler
对象,因此他可以hook
整个编译的生命周期。
class MyCustomPlugin {apply(compiler) {compiler.hooks.run.tap('MyCustomPluginName',(compilation)=>{console.log('webpack 构建正在启动');})}
}
module.exports = MyCustomPlugin;
webpack
可以利用plugin
来扩展其功能,常用的插件有:
HtmlWebpackPlugin
:根据模板生成HTML文件,并自动添加CSS和JS的引用。MiniCssExtractPlugin
:将CSS提取为单独的文件,并在HTML中引用它。UglifyJsPlugin
:压缩JS代码,减小文件大小,提高加载速度。CleanWebpackPlugin
:清空指定目录中的旧文件,防止文件冗余。CopyWebpackPlugin
:复制指定目录中的文件到输出目录中。DefinePlugin
:定义全局常量,方便在JS中使用。ProvidePlugin
:自动加载模块,无需在JS文件中导入。HotModuleReplacementPlugin
:开启模块热替换功能,支持修改代码后自动刷新页面。IgnorePlugin
:忽略指定模块,减小文件大小,提高打包速度。BundleAnalyzerPlugin
:生成打包报告,分析项目中各个模块的大小和依赖关系。
使用
以下是一个基于HtmlWebpackPlugin
的示例工程,主要展示插件的基本使用,帮助理解插件的扩展能力:
最终执行编译后只会输出dist/main.js
没有.html
文件;此时我们可以引入插件HtmlWebpackPlugin
,来生成.html
代码并且自动引入编译后的js bundle
,它的安装如下:
npm install --save-dev html-webpack-plugin
配置与最终结果如下图:
Loader
概念
loader
用于对模块的源代码转换,它相当于编译期间的一个任务。起初webpack
只理解javaScript
文件,但是webpack
将每个作为模块导入的文件视为依赖项,并将其添加到依赖关系图中。因此为了处理静态资源的导入,例如:Files
,Images
, Fonts
, CSS
, Json
等,webpack
使用Loader
来将这些文件加载到bundle
中。常用的loader
:
babel-loader
:将ES6
及以上版本的JavaScript
代码转换成ES5
及以下的版本,以保证兼容性。css-loader
:处理CSS
文件中的url()
等引用外部文件的语法,并将CSS
代码转换为Webpack
可以处理的模块。file-loader
:将文件复制到输出目录,并返回文件的URL
地址。url-loader
:类似于file-loader
,但是可以将文件转换为Base64
编码的Data URL
,减少HTTP
请求。style-loader
:将CSS
代码以<style>
标签的形式插入到HTML
文件中。sass-loader
:处理Sass/Scss
代码,并将其转换为CSS
代码。less-loader
:处理Less
代码,并将其转换为CSS
代码。json-loader
:处理JSON
格式的文件,并将其转换为JavaScript
对象。xml-loader
:处理XML
格式的文件,并将其转换为JavaScript
对象。raw-loader
:将文件内容以字符串的形式导出。
使用
基于上述插件的示例工程,我们为其加入CSS
代码,来展示如何使用Loader
转换CSS
。
一切准备就绪,执行打包脚本,发现报错:You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file
。
为了能够导入CSS
,我们需要安装style-loader
和css-loader
,并在module.rules
下配置这些loader
:
npm install --save-dev style-loader css-loader
具体配置如下图:
重新打包后,浏览器运行index.html
,会发现css
样式生效了。
不过需要注意的是 导入css
文件,应保证 loader
的先后顺序:style-loader
在前,而 css-loader
在后。否则webpack
可能会抛出错误。这是因为loader
可以链式调用, 链中的每个 loader
都将对资源进行依次转换和传递。只需保证webpack
链中的最后一个loader
返回javaScript
即可。
- END -
关于奇舞团
奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。