Webpack 动态别名解析

7
我正在寻找一种通过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 - Is it possible to create custom resolver in 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_modulespackage-a--所以我猜代码根本没有工作。

如果你把${__dirname}/versions/v2.2.0改成了'lorem ipsum',会发生什么呢?它会像我们预期的那样破坏构建吗? - Nir O.
这个答案有帮助吗?你是如何解决的? - Qwerty
1个回答

2
这个问题可能与__dirname有关,它可能是webpack.config.js文件的__dirname,而不是你的库。尝试在插件中使用console.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
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接