Rsbuild 如何替换 CRA html 模版里的变量

date
Jul 17, 2024
slug
rsbuild-html-var
status
Published
tags
React
type
Post
URL
summary
Author
Rsbuild 本身是支持多个 HTML 模版语法的,所以正常使用 Rsbuild 应该不会遇到这个问题。我的背景是我们之前的项目脚手架HTML模版是基于 CRA 的。他里面用没用其他的 HTML 模版,而是用的`%var%`这种变量,然后通过 webpack 插件对变量进行替换。
所以问题就来了,如果我想直接在这种项目里引入 Rsbuild 使用的话,在不影响原有打包流程的情况下,要么新增一个 HTML模版给 Rsbuild用,要么支持 Rsbuild 对之前的 HTML 模版里的变量进行替换。
显然添加一个HTML 文件不是很优雅的做法,所以我仔细看了一下 Rsbuild 的文档,官方并没有相应的解决文档,毕竟人家也没让你们这么用。
但是 Rsbuild 提供了htmlPlugin的方法,所以经过尝试之后通过使用htmlPlugin就可以进行对 HTML 模版变量进行替换了。
具体方法如下:
// rsbuild.config.ts
import { loadEnv, defineConfig } from '@rsbuild/core';
...
export default defineConfig({
	...
	tools: {
    htmlPlugin(config, a) {
      const htmlContent = fs.readFileSync(config.template, 'utf8')
      config.templateContent = htmlContent;
      const envVar = loadEnv();
      const htmlVarMap = envVar.parsed
      Object.keys(htmlVarMap).forEach((key) => {
        const value = htmlVarMap[key];
        config.templateContent = config?.templateContent?.replace(new RegExp('%' + escapeStringRegexp(key) + '%', 'g'), value);
      });
      return config
    },
    ...
})

function escapeStringRegexp(string) {
  if (typeof string !== 'string') {
    throw new TypeError('Expected a string');
  }
  return string.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d');
}
就这么简单,当然最好的办法还是推荐使用 HTML 模版。

© Go7hic 2011 - 2024powered by notion