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

部署Heroku遇Unexpected token *语法错误,求排查tsconfig.json问题

解决Heroku上TypeScript构建后tslib导入的SyntaxError问题

看起来你遇到的问题是TypeScript构建后的代码在Heroku环境下无法解析ES模块语法导致的——本地运行正常,但Heroku的Node.js环境和本地存在配置或版本差异,才触发了这个报错。下面是具体的排查和解决方案:

核心问题分析

你看到的SyntaxError: Unexpected token *,本质是构建生成的main.js用了ES模块的import *语法,但Heroku上的Node.js默认以CommonJS模式运行代码,无法识别这种ES模块语法。而tslib_1是因为你开启了importHelpers: true,TypeScript自动引入tslib来复用辅助函数,这本身没问题,模块语法不兼容才是报错的根源。

具体解决方案

1. 调整tsconfig的模块和目标版本配置

这是最直接的修复方法,把TypeScript的输出模块改成Node.js原生支持的CommonJS:
修改你的tsconfig.json中的compilerOptions:

{
  "compilerOptions": {
    "target": "es2020", // 降级到Node.js广泛支持的版本,避免esnext的兼容性问题
    "module": "commonjs", // 改为CommonJS模块系统
    // 其他原有配置保持不变
  }
}

解释:

  • module: "commonjs"会让TypeScript生成require()风格的代码,完全兼容Node.js默认的运行模式,不会出现模块语法错误。
  • target: "es2020"是一个稳妥的选择,当前大部分Heroku使用的Node.js版本(16+)都全面支持这个版本的ES特性,同时避免了esnext带来的不确定性。

2. 确保tslib安装在生产依赖中

因为你开启了importHelpers: true,运行时需要依赖tslib,所以要确保它不是只在开发依赖里:

npm install tslib --save

如果之前是用--save-dev安装的,记得把它移到dependencies中,Heroku在部署时只会安装dependencies里的包。

3. 检查Heroku的Node.js版本(可选,若坚持用ES模块)

如果不想改成CommonJS,需要确保Heroku使用的Node.js版本支持ES模块,同时配置package.json:

  • 在package.json中添加"type": "module",告诉Node.js这个项目使用ES模块。
  • 指定Node.js版本:
{
  "engines": {
    "node": ">=16.x"
  }
}

不过这种方式需要确保你的代码和依赖都完全兼容ES模块,相对来说改动更大,不如改成CommonJS省心。

4. 验证Heroku的构建流程

确认Heroku在部署时正确执行了TypeScript编译:
在package.json的scripts中确保有构建命令:

{
  "scripts": {
    "build": "tsc",
    "start": "node dist/main.js"
  }
}

Heroku会自动运行npm run build(如果是Node.js项目),但如果你的构建流程有特殊情况,可能需要在Procfile中明确指定命令。

总结

最可能解决你问题的是调整tsconfig.json中的module为commonjs,这能快速消除模块语法的兼容性问题。如果调整后还有问题,可以再检查tslib的依赖和Heroku的Node版本配置。

内容的提问来源于stack exchange,提问作者samuelj123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:25:51