当前位置: 首页 > 知识库问答 >
问题:

javascript - vite 打包后私有变量无法赋值?

李锦
2024-09-05

版本

  • vite ^5.2.8
  • vue ^3.4.21

源码:

export default class MessageChain {
  #debug = false;
  constructor(options = {}) {
    this.#debug = options.debug; // 出错代码
  }
}

编译后

var ye;
class MessageChain {
    constructor(r={}) {
        ge(this, ye, r.debug) // 出错代码
    }
}

var ce = (a,r,t)=>Le(a, typeof r != "symbol" ? r + "" : r, t)
  , Ce = (a,r,t)=>r.has(a) || De("Cannot " + t);
var ie = (a,r,t)=>(Ce(a, r, "read from private field"),

错误

index-DJLqw9J7.js:264 TypeError: Cannot write to private field
    at De (index-Wsimtzzt.js:1:47)
    at Ce (index-Wsimtzzt.js:1:223)
    at ge (index-Wsimtzzt.js:1:445)
    at new MessageChain (index-Wsimtzzt.js:212:7585)
    at index-Wsimtzzt.js:212:9006

问题

  1. 在开发环境可以正常赋值
  2. 如何正确赋值
  3. 如何让vite编译时保留class的源码

共有2个答案

呼延升
2024-09-05

你是说编译后的代码在构建函数里也不能给私有变量赋值?那不对呀,那是 bug 了。

不然的话,贴一下你修改私有变量的代码吧。

傅元章
2024-09-05

问题解答

1. 在开发环境可以正常赋值

在开发环境中,由于Vite通常使用ES模块(ESM)和源代码转换(如Babel插件或Vite内置支持),私有字段(#debug)的访问和修改通常能够正常工作。这是因为开发环境通常不会进行深度代码转换,或者转换时保留了足够的上下文来正确处理私有字段。

2. 如何正确赋值

在你的代码中,你试图在构造函数中通过 this.#debug = options.debug; 来赋值私有字段。这个语法在ES2020及更高版本的JavaScript中是有效的,但在编译后的代码中,如果编译器没有正确处理私有字段,就可能导致问题。

由于你看到的编译后的代码使用了不同的函数(如ge)来尝试访问和修改私有字段,这可能是导致问题的原因。这通常发生在编译器试图优化或转换代码时,但没有正确处理私有字段的特殊情况。

解决方案

  • 确保你的Vite配置和所有相关的插件(如Babel)都支持ES2020及更高版本的JavaScript特性,特别是私有字段。
  • 检查是否有任何Vite插件或Babel插件可能干扰了私有字段的处理。
  • 尝试更新Vite和所有相关依赖到最新版本。

3. 如何让vite编译时保留class的源码

要让Vite在编译时尽可能保留类的源码,你可以考虑以下几个选项:

  • 使用@babel/plugin-transform-classesloose选项:虽然这通常用于旧版JavaScript环境,但你可以检查这个选项是否影响私有字段的处理。不过,通常不建议在需要私有字段的场景下使用loose模式。
  • 关闭不必要的代码转换:检查Vite配置,确保没有不必要的插件或配置选项在编译过程中修改你的类定义。
  • 使用targetmodules选项:在Vite配置中,你可以设置build.targetbuild.lib.esModule等选项来指定输出代码的格式和目标环境。确保这些设置与你的需求相匹配。
  • 查看Vite的issue和文档:查看Vite的GitHub issues和官方文档,看看是否有其他人报告了类似的问题,或者是否有推荐的解决方案。

注意:由于Vite和Babel等工具的版本不断更新,具体的解决方案可能会随着新版本的发布而变化。因此,始终建议查阅最新的文档和社区讨论。

 类似资料:
  • vite打包后有个js报错,但是这种没办法看到底什么原因,有什么办法可以看到是什么原因嘛 问题是我打开了sourcemap了,也生成了sourcemap了,但是生成个这个是什么鬼

  • 现在遇到个这么个需求,就是项目用的vite的打包工具 我现在想实现把项目用vite打包, 然后把项目中的其中一两个组件也单独打包成一个js,类似于把其中一两个组件打包成组件库的js 也就是执行npm run build的时候既打包了项目,又打包了其中部分组件为组件库的js,供外部html直接引入这个打包好的js进行使用,这个有办法实现吗

  • 今天用vue3+vite+store想要完成一个单处变更至全局动态变化的问题,但是遇到了一个很奇怪的现象,我大致知道可能是内置变量机制的问题,但是请教大神告知深层次的原因 版本如下 功能描述大概就是,左侧树节点点击后会触发修改 不进行深拷贝控制台打印如下 进行深拷贝后页面渲染及控制台打印如下 不是说深拷贝是该方法必须,而是一个现象提取;更直观的原因是我不能对store.getters.getCho

  • JavaScript中私有变量的使用 JavaScript中没有私有成员的概念;对象属性是公有的。但JavaSctipt中有个私有变量的概念: 任何在函数内部定义的变量都可以认为是私有变量,它只在这个函数内部有效,不能通过外部函数来访问。私有变量大概有:函数参数、局部变量和函数中嵌套的函数。 function add (num1, sum2) { var sum = num1 + num2

  • 访问路由空白无效果无报错;dev开发模式没问题,只存在build后通过服务打开页面存在问题。 通过调试问题出在beforeEach代码: 以上代码改成下面就可以访问了: 路由使用 createWebHashHistory 方式 开发模式没问题,应该排除代码问题吧?

  • 严格来讲,JavaScript 中没有私有成员的概念;所有对象属性都是公有的。不过,倒是有一个私有变量的概念。任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数的外部访问这些变量。私有变量包括函数的参数、局部变量和在函数内部定义的其他函数。来看下面的例子: function add(num1, num2){ var sum = num1 + num2; return su