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

Heroku部署Node.js+TypeScript服务报错:Cannot use import statement outside a module

解决Heroku部署Node.js+TypeScript服务时的「Cannot use import statement outside a module」错误

你的问题核心在于模块系统配置冲突,加上没有正确处理TypeScript到JavaScript的编译步骤,导致Heroku运行时无法识别代码中的导入语法。以下是针对性的解决方案:

核心矛盾分析

  • package.json中设置了"type": "module",告诉Node.js使用ES模块规范,但tsconfig.json的module配置是CommonJS,编译后的代码是CommonJS格式,两者冲突引发报错。
  • 你的start脚本直接用node server.ts,Node.js本身不支持直接运行TypeScript文件,必须先编译为JavaScript。

方案一:采用CommonJS模块(兼容Heroku默认环境)

这是最稳妥的方案,适配大多数Node.js部署环境:

  1. 移除package.json中的ES模块标识
    删除package.json里的"type": "module"字段。

  2. 调整tsconfig.json配置
    确保编译输出为CommonJS格式,并指定输出目录,方便Heroku找到编译后的文件:

    {
      "compilerOptions": {
        "module": "CommonJS",
        "target": "ES6",
        "outDir": "./dist",
        "noImplicitAny": true,
        "removeComments": true,
        "preserveConstEnums": true,
        "sourceMap": true,
        "esModuleInterop": true
      },
      "include": ["server.ts"],
      "exclude": ["node_modules"]
    }
    
  3. 修改package.json的脚本命令
    添加编译命令,并让start指向编译后的JavaScript文件:

    "scripts": {
      "build": "tsc",
      "start": "node dist/server.js",
      "dev": "ts-node server.ts"
    }
    
  4. 确保Heroku执行编译步骤
    Heroku默认会自动运行npm run build,如果没有触发,可以添加heroku-postbuild脚本强制执行编译:

    "scripts": {
      // ... 其他脚本
      "heroku-postbuild": "tsc"
    }
    

方案二:采用ES模块(需Node.js 14+)

如果偏好ES模块语法,可按以下步骤配置:

  1. 保留package.json的ES模块标识
    保留"type": "module"字段。

  2. 调整tsconfig.json配置
    将模块规范改为ESNext,并设置模块解析方式:

    {
      "compilerOptions": {
        "module": "ESNext",
        "target": "ES6",
        "outDir": "./dist",
        "moduleResolution": "NodeNext",
        "noImplicitAny": true,
        "removeComments": true,
        "preserveConstEnums": true,
        "sourceMap": true,
        "esModuleInterop": true
      },
      "include": ["server.ts"],
      "exclude": ["node_modules"]
    }
    
  3. 修改脚本命令
    安装ts-node(如果未安装),并调整dev和start脚本:

    "devDependencies": {
      // ... 其他依赖
      "ts-node": "^10.9.1"
    },
    "scripts": {
      "build": "tsc",
      "start": "node dist/server.js",
      "dev": "ts-node --esm server.ts"
    }
    

关键注意事项

  • 绝对不要直接用node server.ts启动服务,Node.js无法解析TypeScript文件,必须先编译或使用ts-node/tsx这类工具。
  • 部署到Heroku时,确保dist目录被正确生成(编译后的JS文件必须存在),否则会出现入口文件找不到的错误。
  • 模块系统必须统一:要么全用CommonJS,要么全用ES模块,混合配置必然导致语法错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:41:45