Webpack: NormalModuleReplacementPlugin -> Ошибка синтаксического анализатора TS: «Не удается найти модуль …», но встроенный пакет работает

#webpack #alias

#webpack #псевдоним

Вопрос:

Я новичок в Webpack и немного смущен некоторыми его функциями. Я загрузил свой тестовый проект на GitHub, где я тестирую некоторые функциональные возможности Webpack.

Чего я хочу достичь

Я хочу динамически заменять определенные заполнители в запросах операторов require / import. Насколько я выяснил, эта функция должна быть встроена в Webpack с плагином NormalModuleReplacementPlugin .

В чем проблема?

Пакет собран из Webpack, и я могу запустить веб-приложение. Я могу связаться с сервером, и пакет, по-видимому, функционирует. Но я получаю ошибки синтаксического анализатора от TS (?). При использовании плагина NormalModuleReplacementPlugin появляются ошибки синтаксического анализатора, которые НЕ влияют на функциональность созданного пакета. Я все еще могу загрузить пакет, и все в порядке. (Это происходит при замене заполнителя $platform (или любого другого) заменой hyperion в файле a/b/c/test3.ts в инструкции импорта из foo1/t/z/lil.platform.test.$platform )

Ошибка заключается в:

 ERROR in ./a/b/c/test3.ts
(2,22): error TS2307: Cannot find module 'foo1/t/z/lil.platform.test.$platform'.
  

Что я пробовал до сих пор

Я понятия не имею, почему замена заполнителя через NormalModuleReplacementPlugin приводит к ошибкам синтаксического анализа. Я попытался найти разрешение псевдонима в исходном коде webpack, чтобы выяснить, как разрешаются псевдонимы, но я не смог найти строки в исходном коде. Затем я попытался написать свой собственный плагин, подключенный к «normal-module-factory» и «before / after-resolve», что привело к той же ситуации. (мой собственный плагин также находится в webpack.config.js ). Здесь я исследовал объект «результат», переданный функции перехватов «до / после разрешения». Я попытался также перезаписать result.dependency.userRequest и result.dependency.request , а также result.userRequest в перехватчике «перед разрешением».

PS: Отзывы и / или подсказки для webpack.config.js тоже было бы неплохо 😉

Для простоты я также размещаю webpack.config.js здесь:

 var path = require("path");
var webpack = require("webpack");
var $ld = require("lodash");
var fs = require("fs");


function DynamicPathReplacementPlugin(placeholder, replacement) {
  var _ = require('lodash');

  if (!placeholder) {
    throw new Error('Webpack DynamicPathReplacementPlugin: argument "placeholder" must be defined!')
  }
  if (!replacement) {
    throw new Error('Webpack DynamicPathReplacementPlugin: argument "replacement" must be defined!')
  }
  if (!_.isRegExp(placeholder) amp;amp; !_.isString(placeholder)) {
    throw new Error('Webpack DynamicPathReplacementPlugin: argument "placeholder" must be either a RegExp or a String!')
  }
  if (!_.isFunction(replacement) amp;amp; !_.isString(replacement)) {
    throw new Error('Webpack DynamicPathReplacementPlugin: argument "replacement" must be either a Function or a String!')
  }

  return {
    'apply':  function(compiler) {
      compiler.plugin(
        'normal-module-factory',

        function(normalModuleFactory) {
          normalModuleFactory.plugin(
            'before-resolve',

            function (result, callback) {
              if(!result) return callback();
              if (_.isFunction(replacement)) {
                replacement = _.bind(replacement, {}, placeholder);
              }
              result.request = _.replace(result.request, placeholder, replacement);

              return callback(null, result);
            }
          );
          normalModuleFactory.plugin(
            'after-resolve',

            function (result, callback) {

              if(!result) return callback();
              if (_.isFunction(replacement)) {
                replacement = _.bind(replacement, {}, placeholder);
              }
              // result.resource = path.resolve(path.dirname(result.resource), _.replace(result.resource, placeholder, replacement));
              if (result.request.includes("lil")){
                console.log(result)
                // console.log(path.basename(_.replace(result.resource, placeholder, replacement)))
                // result.resource = path.basename(_.replace(result.request, placeholder, replacement));
                // result.request = _.replace(result.resource, placeholder, replacement);
                // result.userRequest = _.replace(result.request, placeholder, replacement);
              }
              return callback(null, result);
            }
          );
        }
      );

      // compiler.plugin("after-resolvers", function(compiler) {
      //   console.log("after-resolvers", compiler.resolvers.normal.apply)
      // });
    }
  };
}


module.exports = {
  debug: true,
  entry: "./entry.js",
  output: {
    path: __dirname,
    filename: "bundle.js"
  },
  target: 'web',
  module: {
    loaders: [
      {test: /.less$/, loaders: ['style', 'css', 'less']},
      {test: /.css$/, loaders: ['style', 'css']},
      {test: /.(png|jpg)$/, loader: 'file'},
      {test: /.html$/, loader: 'html'},
      {test: /.json$/, loader: 'json'},
      {test: /.ts$/, loaders: ['ts']},
      {test: /.js$/, loader: 'babel', query: {presets: ['es2015', 'react']}},
    ]
  },
  resolve : {
    extensions: ['', '.js', '.ts', '.json'],
    root: [
      path.resolve(__dirname),
      //path.resolve('./src'), // Beispiele für die Anwendung von globalen Pfaden
      //path.resolve('./src/q/w'),
      ],
    alias: {
      foo: "a/b",
      bar: "a/b/c/bar/src",
      bar1: "a/b/c/bar1/src",
      foo1: "src/q/w/e/r",
      baz: "src/q"
    }
  },
  plugins: [
    // DynamicPathReplacementPlugin(/$platform/, function(a) {
    //   console.log("exec3", a);
    //   return "hyperion"
    // }),
    new webpack.NormalModuleReplacementPlugin(/$platform/, function(result) {
      console.log("exec");
      var temp = $ld.replace(result.request, /$platform/gi, "hyperion");
      // $ld.set(result, 'dependency.userRequest', temp);
      // $ld.set(result, 'dependency.request', temp);
      result.request = temp;
    })
  ]
};
  

Комментарии:

1. У меня аналогичная проблема с NormalModuleReplacementPlugin, что eslint-import-resolver-webpack не может найти файл.