Разрешение динамического псевдонима в Webpack - PullRequest
0 голосов
/ 22 мая 2018

Я ищу способ передать функцию через конфигурацию 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 - Можно ли создать собственный преобразователь в веб-пакете?

Вот чтоУ меня так далеко:

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 голосов
/ 10 августа 2018

Проблема может быть связана с __dirname, которым может быть __dirname файла webpack.config.js, а не ваша библиотека.попробуйте 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
    }
...