Webpack插件在编译后修改文件

cyvaqqii  于 2023-08-06  发布在  Webpack
关注(0)|答案(2)|浏览(247)

我正在写一个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,但是加载器不知道生成的文件名,或者他们知道吗?
任何帮助将不胜感激!

dgenwo3n

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

3z6pesqy

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函数!

相关问题