1、webpack简单介绍
webpack本质上是一个打包工具,它会根据代码的内容解析模块依赖,帮助我们把多个模块的代码打包,如图webpack会把我们项目中使用的多个依赖模块,打包构建成可运行的几个静态文件,它提供了十分丰富的配置项和扩展能力,这里我们说一下loader配置
2、loader简单介绍
loader 用于对模块的源代码进行转换。loader 可以使你在 import 或"加载"模块时预处理文件。因此,loader 类似于其他构建工具中“任务(task)”,并提供了处理前端构建步骤的强大方法。loader 可以将文件从不同的语言(如 TypeScript)转换为 JavaScript,或将内联图像转换为 data URL。loader 甚至允许你直接在 JavaScript 模块中 import CSS文件!
通俗点讲就是loader在webpack中担任翻译官的角色
2.1、loader的匹配规则
module.exports = {
module: {
rules: [
{
test: /\.jsx?/,
include: [
path.resolve(__dirname, 'src'),
],
use: 'babel-loader',
},
],
},
}
-
loader 的匹配规则中有两个最关键的因素:一个是匹配条件,一个是匹配规则后的应用
-
匹配条件在官方文档中称为:resource 通常使用文件的绝对路径来进行匹配除此之外还有比较少用到的 issuer
-
上述代码中的 test 和 include 都用于匹配 resource 路径是,
resource.testresource.include的简写
module.exports = {
// ...
rules: [
{
resource: { // resource 的匹配条件
test: /\.jsx?/,
include: [
path.resolve(__dirname, 'src'),
],
},
// 如果要使用 issuer 匹配,便是 issuer: { test: ... }
use: 'babel-loader',
},
// ...
],
}
2.2、loader规则条件配置
大部分场景我们只需要test匹配即可,但应对一些复杂的情况我们可以通过以下规则进行匹配。
{ test: ... }指定特定后缀名文件{ include: ... }指定特定的文件路径{ exclude: ... }排除特定的路径{ and: [...] }必须匹配数组中所有条件{ or: [...] }匹配数组中任意一个条件{ not: [...] }排除匹配数组中所有条件
上述的所谓条件的值可以是:
- 字符串:
必须以提供的字符串开始,所以是字符串的话,这里我们需要提供绝对路径 - 正则表达式:
调用正则的 test 方法来判断匹配 - 函数:
(path) => boolean,返回 true 表示匹配 - 数组:
至少包含一个条件的数组 - 对象:
匹配所有属性值的条件
简单的例子:
rules: [
{
test: /\.jsx?/, // 正则
include: [
path.resolve(__dirname, 'src'), // 字符串,注意是绝对路径
], // 数组
// ...
},
{
test: {
js: /\.js/,
jsx: /\.jsx/,
}, // 对象,不建议使用
not: [
(value) => { /* ... */ return true; }, // 函数,通常需要高度自定义时才会使用
],
},
],
上述多个配置形式结合起来就能够基本满足各种各样的构建场景了,通常我们会结合使用 test/and 和 include&exclude 来配置条件,如上述那个简单的例子。
2.3、loader配置
在当前webpack当中, module.rules 匹配规则最重要的还是用于配置 loader,我们可以使用 use :
rules: [
{
test: /\.less/,
use: [
'style-loader', // 直接使用字符串表示 loader
{
loader: 'css-loader',
options: {
importLoaders: 1
},
}, // 用对象表示 loader,可以传递 loader 配置等
{
loader: 'less-loader',
options: {
noIeCompat: true
}, // 传递 loader 配置
},
],
},
],
use可以是一个数组如上图
也可以是一个对象:use: { loader: 'babel-loader', options: { ... } }
配置多个loader如上图、一个模块需要经过多个loader处理转换
2.4、loader执行顺序
配置多个loader,执行是从最后一个loader开始,一步步往前、即下一个loader接收上一个loader处理的结果进行处理如上面: style.less 文件会途径 less-loader、css-loader、style-loader 处理,成为一个可以打包的模块。
3、常用的loader总结
样式
css-loader指解析css文件中代码style-loader将css模块作为样式导出到DOM中less-loader加载和转义less文件sass-loader加载和转义sass/scss文件postcss-loader使用postcss加载和转义css/sss文件 加载框架vue-loader加载和转义vue组件angualr2-template--loader加载和转义angular组件react-hot-loader动态刷新和转义react组件中修改的部分,基于webpack-dev-server插件需先安装,然后在webpack.config.js中引用react-hot-loader Files文件raw-loader加载文件原始内容(utf-8格式)url-loader多数用于加载图片资源,超过文件大小显示则返回data URLfile-loader将文件发送到输出的文件夹并返回URL(相对路径)html-withimg-loader打包html文件中的图片 脚本转换编译script-loader在全局上下文中执行一次javascript文件,不需要解析babel-loader加载ES6+ 代码后使用Babel转义为ES5后浏览器才能解析typescript-loader加载Typescript脚本文件coffee-loader加载Coffeescript脚本文件