Vite构建Vue3生产环境:跨文件实例化类报Class constructor无new错误
Class constructor XX cannot be invoked without 'new' 报错原因
核心原因
这个错误仅在Vite生产构建后出现,本质是生产阶段的代码压缩优化对单独文件导出的类进行了过度转换:
- 开发环境下,代码以未压缩的ES模块运行,TypeScript编译后的ES6类结构完整,用
new调用完全正常。 - 生产构建时,Vite通过Rollup+Terser做代码压缩、树摇和兼容性处理。当类单独放在
creds.ts文件中导出时,Terser的优化规则可能将ES6类转换为普通函数形式,但代码中依然用new调用这个被转换后的函数,就触发了该错误。 - 把类移入App.vue的
<script>后,类属于组件局部代码,Vite的构建策略会将其与组件代码一同处理,不会触发这种过度转换,因此生产构建后无报错。
额外说明
这类问题通常和Terser的ecma配置相关:如果项目中Terser的目标ECMA版本设置过低(低于ES6),会强制将ES6类转成ES5兼容的构造函数形式,若转换过程中出现兼容性处理漏洞,就会引发该错误。
内容的提问来源于stack exchange,提问作者josh2112
相关产品推荐
相关产品推荐

