NodeJS 在Turborepo中从其他工作区自动转译TypeScript包

9fkzdhlc  于 2023-06-05  发布在  Node.js
关注(0)|答案(1)|浏览(379)

我有一个基于Turborepo的monorepo,其中我有一个主TypeScript应用程序(称为@myscope/tsapp),它使用同一存储库中的另一个TypeScript包(称为@myscope/tspackage)。你可以在这里找到我为这个问题创建的示例存储库:https://github.com/sigalor/typescript-transpile-workspace-packages
文件apps/tsapp/src/index.ts看起来像这样:

import { sum } from "@myscope/tspackage";

console.log("The sum is:", sum(2, 3));

文件packages/tspackage/src/index.ts包含以下内容:

export function sum(a: number, b: number): number {
  return a + b;
}

现在在仓库的根目录下运行npm run dev会导致以下结果:

> typescript-transpile-workspace-packages@0.0.0 dev
> turbo run dev

• Packages in scope: @myscope/tsapp, @myscope/tsconfig, @myscope/tspackage
• Running dev in 3 packages
• Remote caching disabled
@myscope/tsapp:dev: cache bypass, force executing 0f1217618b24762f
@myscope/tsapp:dev: 
@myscope/tsapp:dev: > @myscope/tsapp@0.0.0 dev
@myscope/tsapp:dev: > tsc-watch --onSuccess "node ./dist"
@myscope/tsapp:dev: 
@myscope/tsapp:dev: 
@myscope/tsapp:dev: 12:32:26 - Starting compilation in watch mode...
@myscope/tsapp:dev: 
@myscope/tsapp:dev: 
@myscope/tsapp:dev: 12:32:27 - Found 0 errors. Watching for file changes.
@myscope/tsapp:dev: /home/cmd/typescript-transpile-workspace-packages/packages/tspackage/src/index.ts:1
@myscope/tsapp:dev: export function sum(a: number, b: number): number {
@myscope/tsapp:dev: ^^^^^^
@myscope/tsapp:dev: 
@myscope/tsapp:dev: SyntaxError: Unexpected token 'export'
@myscope/tsapp:dev:     at internalCompileFunction (node:internal/vm:73:18)
@myscope/tsapp:dev:     at wrapSafe (node:internal/modules/cjs/loader:1176:20)
@myscope/tsapp:dev:     at Module._compile (node:internal/modules/cjs/loader:1218:27)
@myscope/tsapp:dev:     at Module._extensions..js (node:internal/modules/cjs/loader:1308:10)
@myscope/tsapp:dev:     at Module.load (node:internal/modules/cjs/loader:1117:32)
@myscope/tsapp:dev:     at Module._load (node:internal/modules/cjs/loader:958:12)
@myscope/tsapp:dev:     at Module.require (node:internal/modules/cjs/loader:1141:19)
@myscope/tsapp:dev:     at require (node:internal/modules/cjs/helpers:110:18)
@myscope/tsapp:dev:     at Object.<anonymous> (/home/cmd/Downloads/typescript-transpile-workspace-packages/apps/tsapp/dist/index.js:3:19)
@myscope/tsapp:dev:     at Module._compile (node:internal/modules/cjs/loader:1254:14)
@myscope/tsapp:dev: 
@myscope/tsapp:dev: Node.js v18.16.0

当然,我很清楚为什么会发生这种情况:显然,@myscope/tspackage没有被tsc-watch编译,所以它不能被执行。但我该怎么弥补呢?
到目前为止,我完全独立地编译了@myscope/tspackage,请参阅上面链接的存储库中的分支tspackage-transpiled。但是当我对@myscope/tspackage进行更改时,这是非常繁琐的,因为我首先必须从@myscope/tsapp退出tsc-watch,重新编译@myscope/tspackage,然后再次启动tsc-watch。
我注意到Next.js有一个选项transpilePackages,这正是我想要的,但当然只适用于Next.js/frontend宇宙:https://github.com/vercel/turbo/blob/main/examples/basic/apps/web/next.config.js
标准TypeScript是否也存在这样的选项,以便从@myscope/tsapp中执行的tsc(或tsc-watch)也会自动转译@myscope/tspackage)?

n8ghc7c1

n8ghc7c11#

现在我在我的包中使用一个脚本,它需要在开发过程中调用tsc

// package.json
{
  "main": "dist/index.js",
  "scripts": {
    "dev": "tsc --watch"
  }
}
// tsconfig.json
{
  "include": ["src"],
  "compilerOptions": {
    "preserveWatchOutput": true
  }
}
  • 如果能在turborepo中使用就好了 *

相关问题