使用esbuild压缩类后出现'(void 0) is not a constructor'错误求助
问题
我在npm包中定义了如下SomeClass类:
export default class SomeClass{ constructor({ testA, testB }) { this.testA = testA; this.testB = testB; } log() { console.log(this.testA + this.testB); } }
随后通过源文件将其与另一个文件聚合导出:
import SomeClass from './some-class'; import anotherFunction from './another-function'; export { SomeClass, anotherFunction };
再使用如下esbuild配置进行构建:
const esbuild = require('esbuild'); async function bundle() { await esbuild.build({ logLevel: 'info', entryPoints: ['src/js/package.js'], bundle: true, minify: true, sourcemap: true, outfile: 'dist/js/package.min.js' }) .catch(() => process.exit(1)); } bundle();
但当我在应用的app.js中按如下方式导入并实例化时:
import { SomeClass } from '../package.min.js'; const newClass = new SomeClass(constructorObject);
出现了'(void 0) is not a constructor'错误。打开压缩后的JS文件,可见提示该类未被其他地方引用,请问如何确保该类被正确导出?
解决方法
- 指定ES模块输出格式:esbuild默认输出格式可能不匹配ES模块导入场景,导致导出无法被正确识别。修改build配置,明确设置输出为ES模块:
await esbuild.build({ logLevel: 'info', entryPoints: ['src/js/package.js'], bundle: true, minify: true, sourcemap: true, outfile: 'dist/js/package.min.js', format: 'esm' // 新增配置 })
- 关闭树摇优化排查问题:错误提示类未被引用,说明esbuild的树摇功能将其移除。可以临时关闭树摇确认原因:
await esbuild.build({ // 其他原有配置 treeShaking: false })
如果关闭后恢复正常,可在聚合导出文件中添加“导出标记”,让esbuild识别这些导出是外部需要使用的:
// 在src/js/package.js末尾添加 export const __EXPORTS = { SomeClass, anotherFunction };
- 统一导出语法:将原类的默认导出改为命名导出,避免聚合导出时的语法歧义:
// 修改some-class.js的导出方式 export class SomeClass{ // 类内容不变 } // 聚合导出文件直接导入命名导出 import { SomeClass } from './some-class'; export { SomeClass, anotherFunction };
内容的提问来源于stack exchange,提问作者8times9
相关产品推荐
相关产品推荐

