Я пишу плагин 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
, но тогда загрузчики не знают о сгенерированных именах файлов, или они?
Любая помощь будет оценена по достоинству!