time: 2021-04-19 18:55:14
author: heyunjiang
exports.default = function(source) {
console.log('[loaderTest]:', typeof source, source, this)
return source.replace(/webpack/g, 'real webpack 111');
}
通过在 modules.rules 中配置独立项,或加入到已有的 rule.use 中,都按倒序执行
module: {
rules: [
{
test: /\.js$/,
use: ['babel-loader', {
loader: path.resolve(__dirname, './src/loaderTest.js')
}],
exclude: /node_modules/
}
]
}
loader 中的 this 对象,是通过 NormalModule.createLoaderContext 生成的 loaderContext 对象,可以拿到 compiler, compilation, webpack options 等对象,也包含了 addDependency 等属性方法
import loaderUtils from 'loader-utils'
loader 负责对文字源 string 处理,用法准则如下
在执行 normalModuleFactory.create 解析模块时,如果模块名匹配到相关 rule,则会将 rule 中对应的 loader 加入到 loaders 数组中; 然后 normalModule.doBuild 调用 runLoaders 来为模块执行对应的 loader,生成 source 和 ast,再根据 ast 去生成对应的依赖
问题:loader 最终输出的是 javascript 代码,在处理 css 时,最终的 js 代码是啥样子?看看 css-loader