Webpack 动态别名解析

标签 webpack webpack-3

我正在寻找一种通过 Webpack@3.12.0 配置传递函数的方法,以帮助 Webpack 在编译时动态解析别名。我有各种导入的第三方包,例如 package-a/file-b .但是,取决于正在导入的第三方包package-a ,我希望将其解析为 package-a 的不同版本;虽然会有 package-a 的版本在 node_modules ,旧版本将不在 node_modules 中但不同的目录。由于这些是第三方,我不想手动更改他们的代码。在各个包中使用的版本在路径名中,并且包的数量是任意的。

因为package-a是一个私有(private)包,它不在 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 - 所以我猜代码根本不起作用。

最佳答案

问题可能与 __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
    }

关于Webpack 动态别名解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50467789/

相关文章:

javascript - Webpack 构建错误

javascript - 将 ES6 模块导入全局范围

node.js - npm 升级后 Webpack 未构建

html - 如何阻止 Webpack-3 的 PurifyCSSPlugin 清理太多?

css - 媒体查询不适用于 CSS/样式加载器和 Webpack3

javascript - Vue.js + Webpack 请求多个不正确的资源 URL

webpack - 如何运行 Webpack Dev Server --https --hot --inline

c# - VS2017 中的 ASP.Net Core : Setting up React. js + webpack + babel

没有信息的 Webpack 3 schema-utils 错误

css - 如何在 Webpack v3 中构建一个 less 编译链(gulp 风格)?