Плагин Webpack для изменения файлов после компиляции

Я пишу плагин Webpack, который должен заменить часть кода JS списком файлов CSS, созданных Webpack. Визуализируйте этот код JS:

ReactWebComponent.create(<App />, 'react-web-component', { injectReactWebComponent: true });

Я хочу заменить часть injectReactWebComponent: true на

injectReactWebComponent: '<link href="static/css/main.cacbacc7.css" rel="stylesheet">'

Хотя этот тег ссылки является файлом, созданным Webpack.

Мой (своего рода рабочий) код для этого выглядит следующим образом:

ReactWebComponent.prototype.apply = function(compiler) {
  compiler.plugin('emit', function(compilation, callback) {
    const cssFiles = Object.keys(compilation.assets)
        .filter(fileName => /\.css$/.test(fileName));

    const jsFiles = Object.keys(compilation.assets)
        .filter(fileName => /\.js$/.test(fileName));

    const cssLinkTagsAsString = cssFiles
        .map(fileName => `<link href="${fileName}" rel="stylesheet">`)
        .join('');

    jsFiles.forEach(fileName => {
      compilation.assets[fileName].children.forEach(child => {
        if (child._value) {
          child._value = child._value.replace(/injectReactWebComponent\s*:\s*true/g, `injectReactWebComponent: \'${cssLinkTagsAsString}\'`);
        }
      });
    });

    callback();
  });
};

module.exports = ReactWebComponent;

Смотрите строку, где я

child._value = child._value.replace(...)

Я откровенно переписываю исходники.

Но мне это не кажется правильным. Кажется, что код, который я преобразовываю, уже сгенерирован, и его больше не нужно преобразовывать. Я также почти уверен, что этим нарушаю исходные карты.

Поэтому мне интересно, как лучше всего достичь того, что я делаю?

Я предполагаю, что для части преобразования я должен использовать loader, но тогда загрузчики не знают о сгенерированных именах файлов, или они?

Любая помощь будет оценена по достоинству!


person Lukas    schedule 11.08.2017    source источник


Ответы (1)


Похоже, что такого рода вещи достаточно просты, чтобы их можно было обрабатывать загрузчиками, которых несколько (некоторые лучше, чем другие):

https://www.npmjs.com/package/string-replace-loader

https://www.npmjs.com/package/regexp-replace-loader

https://www.npmjs.com/package/replace-loader

Если вы хотите создать свой собственный плагин для этого (я просто прошел через процесс, чтобы сделать что-то более сложное, чем просто замена регулярного выражения), я смог собрать свое решение в основном из этих трех страниц:

https://github.com/webpack/webpack/blob/master/lib/BannerPlugin.js

https://webpack.js.org/api/plugins/compilation/#optimize-chunk-assets-chunks-chunk-async.

https://github.com/webpack/webpack-sources

person Benjamin Riggs    schedule 15.09.2017