无Next.js的Turborepo内部包导入Nest+SWC后端报错解决方案咨询
解决Nest+SWC环境下Turborepo内部包导入报错的方案
方案1:调整Webpack+SWC配置,转译指定内部包
Nest默认通过SWC转译源码时会排除node_modules目录,但你的内部包是未编译的TypeScript文件,需要让SWC处理它。修改项目根目录的webpack.config.js,调整swc-loader的排除规则,将内部包从排除列表中移除:
module.exports = function (options) { return { ...options, module: { ...options.module, rules: [ { test: /\.(t|j)s$/, loader: 'swc-loader', exclude: /node_modules(?!\/@repo\/your-internal-package)/, // 关键:排除node_modules但保留你的内部包 options: { jsc: { parser: { syntax: 'typescript', }, }, }, }, ...(options.module?.rules || []).filter(rule => rule.loader !== 'swc-loader'), ], }, }; };
注意替换@repo/your-internal-package为你实际的内部包名称,比如你的包叫@repo/shared,就改成/node_modules(?!\/@repo\/shared)/。
方案2:让内部包先编译为JavaScript(推荐长期方案)
Turborepo的示例虽然直接用TS源码共享,但生产环境更稳妥的方式是让内部包先编译。给内部包添加SWC编译配置:
- 在内部包目录下创建
.swcrc:
{ "$schema": "https://json.schemastore.org/swcrc", "jsc": { "parser": { "syntax": "typescript", "tsx": false }, "target": "es2020", "transform": { "legacyDecorator": true, "decoratorMetadata": true }, "keepClassNames": true }, "module": { "type": "commonjs" }, "sourceMaps": true }
- 修改内部包的
package.json:
{ "name": "@repo/your-internal-package", "main": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { "build": "swc src -d dist && tsc --emitDeclarationOnly" }, "devDependencies": { "@swc/cli": "^0.1.62", "@swc/core": "^1.3.90", "typescript": "^5.2.2" } }
- 在项目根目录的
turbo.json中配置构建流水线,确保后端项目构建前先编译内部包:
{ "pipeline": { "build": { "dependsOn": ["^build"], "outputs": ["dist/**"] }, "dev": { "cache": false, "persistent": true } } }
之后运行turbo build会先编译内部包,后端项目导入的就是编译后的JS文件,不会再出现语法错误。
方案3:调整Nest CLI的SWC配置
如果你的项目用Nest CLI管理而非自定义Webpack,可以在nest-cli.json中添加SWC的include规则:
{ "compilerOptions": { "type": "swc", "swcOptions": { "jsc": { "parser": { "syntax": "typescript" } }, "include": ["node_modules/@repo/your-internal-package/**/*"] } } }
这个配置会让Nest的SWC编译器处理指定的内部包文件。
内容的提问来源于stack exchange,提问作者Laci556
相关产品推荐
相关产品推荐

