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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:52:37