TypeScript monorepos中对等包的类型定义:开发与生产

Ale*_*aev 5 typescript visual-studio-code typescript-typings lerna monorepo

我有一个使用yarn workspaceslerna; 的monorepo项目。它的所有部分都用TypeScript编写。这些模块位于类似的子文件夹中,packages/module-n并且每个模块都有自己package.json的行,并带有以下几行:

"main": "dist/index.js",
"types": "dist/index.ts",
Run Code Online (Sandbox Code Playgroud)

每个软件包的源代码都位于中packages/module-n/src/index.ts,因此没有什么异常。

从命令行构建或发布时,一切都很好-感谢每个软件包文件夹中都有tsconfig.json一个build脚本。但是,在VSCode中进行日常代码编辑时,即使我运行tsc --watch所有软件包以使链接的依赖项保持同步,事情也变得不太方便。

当我命令单击指向对等程序包的定义时,VSCode带我到packages/package-n/dist/index.d.ts而不是packages/package-n/src/index.ts我当前正在编辑的位置。另外,当我想用​​重构某些内容时F2,可能dist/index.d.ts偶尔会修改文件,这会build:watch由于错误而迫使我重新启动。问题是TypeScript看到了手动调整,**/dist/index.d.ts并拒绝进一步更新这些文件。

为了克服这种不便,我在根目录中编写了这两个脚本package.json,但我不是自己的解决方案的忠实拥护者:

"use-dev-typings": "lerna exec \"replace --quiet dist\\/index\\.d\\.ts src/index.ts package.json\"",
"use-prod-typings": "lerna exec \"replace --quiet src\\/index\\.ts dist/index.d.ts package.json\""
Run Code Online (Sandbox Code Playgroud)

这是我在同一根目录中使用它们的方式package.json

"build": "yarn use-prod-typings && lerna run build",
"build:watch": "lerna run build; yarn use-dev-typings && lerna run --parallel build:watch",
Run Code Online (Sandbox Code Playgroud)

我们的想法是,在我开始编辑VSCode文件,从而去yarn build:watch的,我所有的补丁packages/package-n/package.json替换文件"types": "dist/index.d.ts""types": "src/index.ts"。这修复了命令+单击和重构的问题,这很棒。如果是一次性建筑(例如发布之前),请"types"还原为"dist/index.d.ts"

我想知道是否有更好的方法来实现我的目标,如果有人可以给我建议,那将是很好的。我敢肯定,我"src/index.ts"有一天会偶然提交,甚至发布具有此值的版本。src/*.tsnpm发行版的内容已排除在外,以保持我的软件包小巧。

Izh*_*aki 1

https://github.com/Izhaki/mono.ts

它使用纱线工作区并与 VSCode 很好地结合在一起。我希望自述文件足够清楚。

基本上,使用两个(并行)打字稿配置树:

  • 预构建- 使用别名(用于 VSCode、测试、webpack 等)。
  • 构建- 本质上使用 typescript 3 项目引用进行发布。