Webpack动态别名解析

时间:2018-05-22 12:31:29

标签: webpack webpack-3

我正在寻找一种通过Webpack@3.12.0配置传递函数的方法,以帮助Webpack在编译时动态解析别名。我有各种导入的第三方软件包,例如package-a/file-b。但是,根据导入package-a的第三方软件包,我希望将其解析为package-a的其他版本;虽然package-a中会有node_modules的版本,但旧版本不会出现在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_modules package-a - 所以我猜代码根本不起作用。

1 个答案:

答案 0 :(得分:0)

问题可能与__dirname有关,它可能是webpack.config.js文件的__dirname,而不是您的库。尝试在插件上使用console.log(__ dirname),看看路径是否正确。另外,您不需要添加“ .js”

此resolver插件在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
    }