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

Turborepo中TypeScript包导入报错:Cannot use import statement outside a module

问题:Node服务端导入Turborepo下的TypeScript包报错SyntaxError: Cannot use import statement outside a module

在Turborepo环境下有一个名为test的TypeScript包,用于导出TypeScript函数。由于Turborepo特性,该包会被复制到node_modules/test目录中。执行import {func} from "test"时,出现报错:

SyntaxError: Cannot use import statement outside a module

test包的TypeScript配置:

{
    "extends": "tsconfig/base.json",
    "compilerOptions": {
      "declaration": true,
      "target": "es6",
      "module": "commonjs",
      "moduleResolution": "node",
      "baseUrl": ".",
    },
    "include": ["**/*.ts"]
}

Node应用的Nodemon配置:

{
  "watch": ["src"],
  "ignore": ["src/**/*.test.ts"],
  "ext": "ts,mjs,js,json,graphql",
  "exec": "tsc && node ./dist/index.js",
  "legacyWatch": true
}

注:在Next.js项目中添加const withTM = require('next-transpile-modules')(['test'])后,导入该包可正常运行。推测问题出在Node服务端:从node_modules中导入该.ts文件时未被转译,尝试过用tsc构建该包,但在包内保留dist文件夹并不理想。


可行解决方法

1. 调整test包的构建逻辑,输出编译后的代码

这是最标准的方案,可通过Turborepo统一管控构建流程:

  • 在test包的package.json中添加构建脚本:
    "scripts": {
      "build": "tsc"
    }
    
  • 在Turborepo的turbo.json中配置任务依赖,确保Node应用启动前先构建test包:
    {
      "pipeline": {
        "build": {
          "dependsOn": ["^build"],
          "outputs": ["dist/**"]
        },
        "dev": {
          "dependsOn": ["^build"]
        }
      }
    }
    
  • 修改test包的package.json,指定入口为编译后的文件:
    "main": "./dist/index.js",
    "types": "./dist/index.d.ts"
    

这样Node应用导入的就是编译后的CommonJS代码,不会出现import语法问题。

2. 让Node应用的TypeScript转译node_modules中的test包

默认tsc会忽略node_modules目录,可修改Node应用的tsconfig.json,把test包加入转译范围:

  • 在Node应用的tsconfig中添加:
    "compilerOptions": {
      // 保留原有配置
    },
    "include": ["src/**/*", "../node_modules/test/**/*.ts"],
    "exclude": ["node_modules/**/*", "!node_modules/test/**/*"]
    
  • 同步修改Nodemon的exec命令,确保转译包含test包:
    "exec": "tsc --project ./tsconfig.json && node ./dist/index.js"
    

该方式会增加编译时间,适合开发阶段临时使用。

3. 使用ts-node直接运行TypeScript代码,配置转译node_modules

如果不想提前编译,可改用ts-node替代tsc+node的方式,让ts-node转译node_modules里的test包:

  • 安装依赖:
    npm install ts-node tsconfig-paths --save-dev
    
  • 修改Nodemon的exec命令:
    "exec": "ts-node --skip-project --transpile-only ./src/index.ts"
    
  • 或者在Node应用的tsconfig.json中添加ts-node专属配置:
    "ts-node": {
      "files": true,
      "transpileOnly": true,
      "ignore": ["node_modules/(?!test)/"]
    }
    

4. 修改test包的模块格式为ESModule

如果你的Node应用支持ESModule,可调整test包的配置:

  • 修改test包的tsconfig.json:
    "compilerOptions": {
      "module": "ESNext",
      "target": "ESNext"
    }
    
  • 在test包的package.json中添加:
    "type": "module"
    
  • 同时Node应用的package.json也要设置"type": "module",并修改自身tsconfig的module为ESNext,这样就能直接使用import语法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:07:09