我正在写一个Webpack插件,它应该用Webpack生成的CSS文件列表替换部分JS代码。镜像此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(...)
型
我直接重写了来源。
但这似乎不适合我。看起来我正在转换的代码已经生成了,不应该再转换了。我也很确定我用这个打破了源Map。
所以我想知道,什么是一个合适的方式来实现我正在做的事情?
我猜对于转换部分,我应该使用loader
,但是加载器不知道生成的文件名,或者他们知道吗?
任何帮助将不胜感激!
2条答案
按热度按时间dgenwo3n1#
看起来这类事情很简单,可以由加载器处理,其中有多个加载器(有些比其他的好):
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的
3z6pesqy2#
我知道这个问题已经过时了,但我需要做一些类似的事情(我需要修改Quasar 1.x的client-entry.js文件,这样我就可以从别人的JavaScript中将一个quasar应用程序转换为一个可调用的库,也就是说,我需要修改Quasar 1.x的client-entry.js文件,这样我就可以从别人的JavaScript中将一个quasar应用程序转换为一个可调用的库。我不得不停止应用程序自动加载,并且没有Quasar设置,但是,我所需要做的就是用我的 Package 器函数替换
.quasar/client-entry.js
中的start()
)。由于我和作者都只需要在编译后修改webpack文件,并且这个页面是人们搜索如何做类似事情的一个突出结果,并且我使用Vue和他们使用React并不重要,我在这里发布我是如何解决这个问题的,这对作者和其他人可能有好处。
**注意:**Quasar 1.x使用webpack 4,Quasr 2.x使用webpack 5。我在两个版本的webpack(4 & 5)上试用了这个插件,效果很好!
https://github.com/artembatura/modify-source-webpack-plugin
这个插件的readme.md文件包含了使用它所需的一切。它甚至附带concat和replace helper函数!