【发布时间】:2017-10-13 15:57:25
【问题描述】:
我计划在我的 webpack 项目中使用一组更复杂的约定来导入资产。所以我正在尝试编写一个插件,它应该重写请求的模块定位器的一部分,然后将其传递给解析器waterfall。
假设我们只是想
- 检查请求的模块是否以
#字符开头并且 - 如果是这样,请将其替换为
./lib/。现在应该由默认解析器查找新的模块定位器。
这意味着当文件/var/www/source.js 执行require("#example") 时,它实际上应该得到/var/www/lib/example.js。
到目前为止,我发现我显然应该为此使用the module event hook。这也是选择by other answers 的方式,不幸的是它对我没有太大帮助。
这是我对自定义解析插件的看法,它非常简单:
function MyResolver () {}
MyResolver.prototype.apply = function (compiler) {
compiler.plugin('module', function (init, callback) {
// Check if rewrite is necessary
if (init.request.startsWith('#')) {
// Create a new payload
const modified = Object.assign({}, init, {
request: './lib/' + init.request.slice(1)
})
// Continue the waterfall with modified payload
callback(null, modified)
} else {
// Continue the waterfall with original payload
callback(null, init)
}
})
}
但是,使用它(在resolve.plugins 中)不起作用。运行webpack,出现如下错误:
ERROR in .
Module build failed: Error: EISDIR: illegal operation on a directory, read
@ ./source.js 1:0-30
显然,这不是做事的方式。但是由于我找不到太多关于这个问题的示例材料,所以我有点没有想法。
为了更容易重现,我已将此精确配置放入 GitHub 存储库中。因此,如果您有兴趣提供帮助,可以直接获取:
git clone https://github.com/Loilo/webpack-custom-resolver.git
然后只需运行npm install 和npm run webpack 即可查看错误。
【问题讨论】:
标签: javascript node.js webpack resolver