Loaders1
Loaders是作用在你的应用资源文件上的转换。它们是以资源文件的内容为参数,返回新的内容的函数(运行在Node.js中)。
样例
比如,你可以使用loaders来告诉webpack如何加载CSS文件,或者如何转换TypeScript为JavaScript。首先安装对应的loaders:
npm install --save-dev css-loader
npm install --save-dev ts-loader
然后配置你的webpack.config.js
,为每一个.css
文件使用css-loader
,类似的,为每一个.ts
文件使用ts-loader
:
webpack.config.js
module.exports = {
module: {
rules: [
{test: /\.css$/, use: 'css-loader'},
{test: /\.ts$/, use: 'ts-loader'}
]
}
};
注意根据配置选项,下面的参数定义了相同的loader使用:
{test: /\.css$/, loader: 'css-loader'}
// or equivalently
{test: /\.css$/, use: 'css-loader'}
// or equivalently
{test: /\.css$/, use: {
loader: 'css-loader',
options: {}
}}
Configuration(配置)
在你的应用中有三种方法使用loaders:
- 通过配置
- 通过
require
显式地声明 - 通过CLI
通过webpack.config.js
module.rules
允许你在webpack配置中指定若干个loaders。这种使用方式展示简洁,能保持代码干净,也能让你对各个loader有全面的概览。
module: {
rules: [
{
test: /\.css$/,
use: [
{ loader: 'style-loader'},
{
loader: 'css-loader',
options: {
modules: true
}
}
]
}
]
}
通过require
可以通过require
声明(或者define
,require.ensure
等)来指定loaders。用!
分开loaders和资源。每个部分都相对于当前目录进行解析。
require('style-loader!css-loader?modules!./styles.css');
通过给整条规则加!
前缀来覆盖webpack配置中的任何一个loader也是可以的。
选项可以通过查询参数(Query Parameter)传递,跟web中使用一样(?key=value&foo=bar
)。也可以使用一个JSON对象({"key":"value","foo":"bar"}
)。
ℹ️尽可能使用
module.rules
,因为它能减少你源代码中的样板代码,出问题时也能让你更快的调试或定位到一个loader。
通过CLI(命令行)
可选的,你也可以从命令行使用loaders:
webpack --module-bind jade --module-bind 'css=style!css'
这将会为.jade
文件使用jade-loader
,为.css
文件使用style-loader
和css-loader
。
Loader的特性
- Loaders可以链式使用。它们会像一个管道应用在资源文件上。一个Loaders链会按顺序地编译。链中的第一个loader返回值给下一个loader。在最后一个loader,webpack期望返回JavaScript。
- Loaders可以是同步的或异步的。
- Loaders在Node.js运行,在其中可做任何允许的事。
- Loaders接受查询参数。参数可以用来传递配置给loader。
- Loaders也可以通过一个
options
对象配置。 - 一般模块通过
package.json
,除了可以导出常规的main
字段外,也可以通过loader
字段导出一个loader。 - Plugins可以赋予loaders更多的特性。
- Loaders可以发表任意额外的文件。
Loaders(预处理函数,preprocessing functions)赋予了JavaScript生态圈更强大的能力。现在,用户有更多灵活性来添加细微的逻辑,比如压缩,包装,语言翻译或更多。
解析Loaders
Loaders遵从标准的模块解析。大部分情况下你都会从模块路径(想想npm install
,node_modules
)中引用loaders。
如何编写一个loader?一个loader模块应当导出一个函数,而且应当用Node.js兼容的JavaScript编写。通常你可以用npm管理loaders,但loaders也可以以文件形式存在应用中。
根据规范,loaders被命名为XXX-loader
,XXX
是指上下文。比如json-loader
。
Loader名称规范和搜索优先顺序通过webpack配置API中的resolveLoader.moduleTemplates
定义。
1. https://webpack.js.org/concepts/loaders/ ↩