You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Rollup在TypeScript转译前替换代码,将私有类字段转成ES5

解决方案:让Rollup Replace插件处理TS文件

问题出在**@rollup/plugin-replace默认只处理JS类文件,不会扫描TS文件**,所以你的替换规则对.mts源码完全没生效,TS编译器还是按原生私有字段#foo的逻辑转译成了WeakMap实现。

修复步骤

修改Rollup配置,给replace插件添加include选项,指定处理TS文件,同时保持replace在typescript插件之前执行:

// rollup.config.mjs
import replace from '@rollup/plugin-replace'
import typescript from '@rollup/plugin-typescript'
export default {
  input: './src/index.mts',
  output: {
    file: './dist/index.js',
    format: 'iife'
  },
  plugins: [
    replace({
      ' #': ' private _',
      '.#': '._',
      delimiters: ['', ''],
      // 新增:指定处理TS/TS模块文件
      include: ['./src/**/*.ts', './src/**/*.mts']
    }),
    typescript({compilerOptions: {target: 'es5'}})
  ]
}

优化替换规则(可选)

如果你的代码里有换行后直接写#foo的场景(比如类字段前只有换行和缩进),可以改用正则表达式替换,覆盖更多情况:

replace({
  // 匹配行首/缩进后的#字段声明
  [/^\s*#/gm]: ' private _',
  // 匹配this.#的访问语法
  [/\.#/g]: '._',
  delimiters: ['', ''],
  include: ['./src/**/*.ts', './src/**/*.mts']
})

验证效果

修改后,TS编译器会先拿到被替换后的代码:

export class Foo {
  private _foo = 0
  private _bar = 'a'
  get foo() {
    return this._foo
  }
  set foo(value) {
    this._foo = value
  }
  // ... 其余代码
}

再转译为ES5时,就会生成和TSprivate标识符一致的代码(下划线命名的实例属性,而非WeakMap实现)。

内容的提问来源于stack exchange,提问作者sflow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:04:52