我编写了一个像这样导出单个对象的库
export default class JWTSigner
这在导入库的测试中效果很好:
import JWTSigner from '../index';
使用包时,我像这样导入它:
import JWTSigner from 'jwt-on-kms';
这不会导致任何 Typescript 错误。当我运行 esbuild 并运行生成的包时,我收到此错误
{"errorType":"TypeError","errorMessage":"import_jwt_on_kms.default is not a constructor","stack":["TypeError: import_jwt_on_kms.default is not a constructor"," at Object.<anonymous> (/var/src/functions/register.ts:71:43)"," at Module._compile (node:internal/modules/cjs/loader:1105:14)"," at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)"," at Module.load (node:internal/modules/cjs/loader:981:32)"," at Function.Module._load (node:internal/modules/cjs/loader:822:12)"," at Module.require (node:internal/modules/cjs/loader:1005:19)"," at require (node:internal/modules/cjs/helpers:102:18)"," at _tryRequireFile (file:///var/runtime/index.mjs:869:37)"," at _tryRequire (file:///var/runtime/index.mjs:919:25)"," at _loadUserApp (file:///var/runtime/index.mjs:945:22)"]}
如果我此时记录 JWTSinger 对象,我会得到:
{ default: [class JWTSigner2] }
。如果我修改包以使用 JWTSigner.default.default
作为构造函数,那么它就可以完美工作。我的问题是为什么默认导出被包装在另一个对象中以及如何防止这种情况?
我的构建脚本是:
esbuild.build({
entryPoints: entryPoints,
bundle: true,
outdir: path.join(__dirname, outdir),
outbase: path.join(__dirname, functionDir),
platform: 'node',
external: ['aws-sdk'],
minify: isProd,
sourcemap: !isProd,
}).catch(() => process.exit(1))
我迟到了,但这可能对某人有用。 昨天,我遇到了同样的问题,我发现有两件事帮助我解决了这个问题:
将
format: 'cjs'
添加到 esbuild 配置中:
{
entryPoints: entryPoints,
bundle: true,
outdir: path.join(__dirname, outdir),
outbase: path.join(__dirname, functionDir),
platform: 'node',
format: 'cjs',
external: ['aws-sdk'],
minify: isProd,
sourcemap: !isProd,
}
将
"main": "./dist/index.js"
添加到 package.json。我的 esbuild 配置中有 outfile
参数,它允许我显式指定文件名。希望您的配置在 outdir 中有一个索引文件。
另外,检查 package.json 中是否有
"type": "module"
。这也是我遇到问题的原因。