Loader
Loader 可以对文件内容进行转换,你可以借助 Loader,将 Rspack 中非一等公民支持的文件转换为一等公民类型,以被 Rspack 所正确识别。
TIP
Loader 属于对资源的前处理,而 Rule.type 则属于对资源的后处理,后者定义了 Rspack 支持的一等公民类型。
目前 Rspack 已经支持了社区几乎所有的 loader。如果你发现有不支持的 loader,欢迎通过 GitHub Issues 与我们交流。
开发 Loader
参考 Loader API - 示例 了解如何开发一个 Loader。
示例
使用 Less
CSS 为 Rspack 的一等公民,因此对于 CSS 文件的处理是原生支持的。而对于 Less
文件来说,则需要借助外部的 less-loader 对文件的内容做相应的转换:
rspack.config.js
module.exports = {
module: {
rules: [
{
test: /\.less$/,
use: [
{
loader: 'less-loader',
},
],
type: 'css',
},
],
},
};
less-loader 可以将 Less 文件转换为 Rspack 支持的 CSS 模块类型,因此你可以设置 type 为 'css'
以指示 Rspack 使用原生支持的 CSS 策略进行后处理。
使用多个 Loader
你可以对特定的 Rule 匹配项使用多个 loader 进行链式处理,loader 的执行顺序为从右往左。
例如,你可以使用 less-loader 完成 Less 到 CSS 类型之间的转换,并对转换后的源码使用 postcss-loader 进行二次转换,并最终交给 Rspack 的 CSS 后处理器,完成进一步处理:
rspack.config.js
module.exports = {
module: {
rules: [
{
test: /\.less$/,
use: [
{
loader: 'postcss-loader',
},
{
loader: 'less-loader',
},
],
type: 'css',
},
],
},
};
传递配置项
你可以使用 Rule.use 给 loader 传递相关配置,例如:
rspack.config.js
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
{
loader: 'postcss-loader',
options: {
postcssOptions: {
// ...
},
},
},
],
type: 'css',
},
],
},
};
使用自定义 Loader
你可以在 Rspack 中使用自定义 loader,下面我们会编写一个简单的 banner-loader 作为示例。
banner-loader 的作用是在每个模块的头部添加一个 banner 注释,例如添加一段 License 信息:
/**
* MIT Licensed
* Copyright (c) 2022-present ByteDance, Inc. and its affiliates.
* https://github.com/web-infra-dev/rspack/blob/main/LICENSE
*/
在项目的根目录新建一个 banner-loader.js
的文件,内容如下:
banner-loader.js
const BANNER = `/**
* MIT Licensed
* Copyright (c) 2022-present ByteDance, Inc. and its affiliates.
* https://github.com/web-infra-dev/rspack/blob/main/LICENSE
*/`;
module.exports = function (content) {
return `${BANNER}\n${content}`;
};
Loader 的第一个入参为文件的内容,我们可以在这里对文件内容进行处理,然后返回处理后的内容。编写完后,我们需要将这个 loader 使用 CommonJS 风格进行导出。
上述示例中,我们会在所有匹配的文件的头部添加一个 banner 注释,如果我们希望将这个行为匹配所有以 js
结尾的文件,我们可以这样配置:
rspack.config.js
module.exports = {
module: {
rules: [
{
test: /\.js$/,
loader: require.resolve('./banner-loader.js'),
},
],
},
};
更多关于 Loader API 的信息,请参考 loader-api
使用内置 Loader
内置 Loader 在不损失 JS Loader 的可组合性的同时,提供了比 JS Loader 更优的性能。一些内置的 Loader 包括: