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
相关产品推荐
相关产品推荐

