我正在寻找一种通过 Webpack@3.12.0 配置传入函数的方法,以帮助 Webpack 在编译时动态解析别名。我有各种导入的第三方软件包,例如package-a/file-b
.但是,根据哪个第三方软件包正在导入package-a
,我希望将其解析为不同版本的package-a
;虽然node_modules
中会有package-a
的版本,但旧版本不会在node_modules
而是在不同的目录中。由于这些是第三方,我不想手动更改他们的代码。要在相应包中使用的版本位于路径名中,并且存在任意数量的包。
因为package-a
是一个私有包,所以它不在 npm 上,也不通过 Github 进行版本控制。
这两个帮助我更接近这一点,但两个答案似乎都已经过时了: - https://github.com/webpack/webpack/issues/110 - 是否可以在 webpack 中创建自定义解析器?
这是我到目前为止所拥有的:
config.resolve.plugins = [{
apply(resolver) {
resolver.plugin('module', function(request, callback) {
if (request.request.startsWith('package-a')) {
this.doResolve(
'file',
Object.assign({
...request,
request: request.request.replace(/^package-a/, `${__dirname}/versions/v2.2.0`) + '.js',
file: true,
resolved: true,
}),
null,
callback
);
return;
}
callback();
});
}
}];
虽然它正确构建,但问题是它仍在评估node_modules
package-a
- 所以我想代码根本不起作用。
该问题可能与__dirname有关,这可能是 webpack.config.js 文件的__dirname,而不是您的库。 尝试在插件上控制台.log(__dirname(,看看路径是否正确。 此外,您不需要添加".js">
这个解析器插件在 WebPack 4 上对我有用(稍作修改,希望在适应时没有破坏任何东西(:
const path = require('path');
var monorepoResolver = {
apply(resolver) {
resolver.plugin('module', function(request, callback) {
if (request.path.startsWith('package-a') === -1) {
callback();
} else
{
this.doResolve(
'resolve',
{
...request,
request: request.request.replace(/^package-a/, `${__dirname}/versions/v2.2.0`),
},
'Edev Resolver',
callback
);
}
});
}
};
module.exports = (baseConfig, env, defaultConfig) => {
defaultConfig.resolve.plugins = defaultConfig.resolve.plugins || [];
defaultConfig.resolve.plugins.push(monorepoResolver);
return defaultConfig
}