发布于 2026-01-06 7 阅读
0

宣布推出 NestJS Monorepos 和新的 CLI 命令

宣布推出 NestJS Monorepos 和新的 CLI 命令

最初发表于Trilon 博客,日期为 2019 年 9 月 31 日。

在这篇博文中,我们将探讨最新版 Nest CLI 的一个新 API,它支持一种名为monorepo的替代结构,用于在单个仓库中管理多个项目和库。此外,我还会介绍一些刚刚引入的新 CLI 命令,分别是 `<projects_name>`nest build和 ` <library_name> nest start`。

如果您还不熟悉NestJS,它是一个 TypeScript Node.js 框架,可以帮助您构建企业级高效且可扩展的 Node.js 应用程序。

历史

在深入探讨之前,让我们先回顾一下过去是如何处理所有事情的

此前,我们tsc默认使用 TypeScript 编译器。为了在开发环境中提供良好的开发者体验(例如,文件更改时自动重新加载应用程序),我们使用了 `CreativeScript`nodemonts-node` CreativeScript` tsc-watch
这对于大多数项目来说都很完美,但我们发现社区中的一些成员开始使用 `CreativeScript`webpack并结合 ` ts-loaderCreativeScript`。这意味着,最终需要多个包才能处理基本功能,这导致了各种副作用和不一致性。

同样,一些公司需要采用单体仓库(monorepo)模式,而不是为每个应用程序(或库)单独创建一个仓库。
因此,需要的库、工具和软件包数量也随之增加。
为了解决这个问题,我们决定直接在官方 CLI 中解决所有这些问题。


建筑工人🏗

使用nest build`--compile` 命令,您可以在开发环境或生产环境中编译应用程序或库。
您想监视源文件更改并在每次修改时重新编译吗?请使用 `--context-compile` 命令nest build --watch。您想切换到webpack吗?请使用`--webpack-install` 命令nest build --webpack

嵌套构建
nest build --watch --webpack例子

webpack但构建器本身并非只是编译器(或)的简单封装tsc
它还拥有插件系统,允许您利用构建过程本身进行编译前或编译后处理(例如,自动提供额外的元数据以@nestjs/swagger减少样板代码)。
事实上,编译器中已经内置了一个插件。该插件会自动解析路径别名(例如@trilon/core导入语句),因此您不再需要使用诸如 `.` 之类的辅助包tsconfig-paths

提示:点击此处了解更多可用的构建器选项

开始🚀

过去,您可能对package.json启动应用程序中各种不同的脚本(例如 `<script>` ts-node、 `<script>`tsc-watch和 `<script> nodemon`)感到困惑。
多亏了`<script> nest start`(以及 `<script> nest start --watch`),所有列出的包都变得毫无用处。

巢穴开始
nest start --watch例子

过去,您可能遇到过这样的情况:在项目根目录下添加单个 TS 文件后,程序npm run start:*停止运行。但请放心,这种情况将不再发生。Nest CLI 会自动检测输出文件是否位于根dist目录下dist/src,并根据检测结果执行相应的入口文件。

提示:点击此处了解更多可用nest start选项

Monorepos 🐱

近年来,单体仓库(monorepo)在开发者社区中变得非常流行。尽管单体仓库也存在一些缺点,但它带来的好处却非常显著。
单体仓库可以更轻松地构建模块化组件和库,跟踪跨项目的变更,促进代码复用,并简化集成测试。

Monorepo 图
包含两个应用程序(支付和提醒)和一个共享库的单体仓库

应用程序和库

为了满足社区的需求,我们新增了nest g app一些nest g lib命令,允许您将现有结构转换为单体仓库模式结构。
例如:

$ nest g app alert-service

子应用程序将与您现有的应用程序在同一工作区内搭建。这两个应用程序将共享同一个node_modules文件夹(单版本策略)和配置文件(例如 `.js`tsconfig.json和`.config` nest-cli.json)。但是,这两个应用程序可以独立
执行、开发和部署

Nest G 应用
nest g app例子

同样,要生成(一种可在多个项目中使用的通用功能),可以使用以下命令:

$ nest g lib users
请注意,在 monorepo 中创建的库不适合发布到 NPM 注册表。如果您想要创建一个可以在不同仓库之间发布/共享的包,则应该使用nest new.

这两个命令都会自动更新nest-cli.json包含构建和组织工作区项目所需元数据的文件。通常情况下,您无需手动编辑其内容(除非您想要更改默认文件名等)。您可以点击此处阅读更多关于单体仓库模式的信息。

建筑项目

要构建单个项目,只需调用$ nest build NAME命令,其中NAME是您传递给命令的应用程序/库的名称$ nest g

注意:在单体仓库模式下,CLI 默认会使用 ` <module> webpack` 而不是tsc`<module>`。此更改的原因是 `<module>`webpack可以生成一个包含所有项目组件的单个文件(开箱即用,自动解决交叉引用问题)。

运行项目

同样地,要运行特定的应用程序,您可以调用$ nest start NAME命令,其中NAME是您传递给命令的应用程序/库的名称$ nest g

但是请记住,库不能独立运行,因为它们没有main.ts文件。

生成构建模块

如果您已经熟悉 Nest CLI,您就会知道它$ nest g可以让您快速搭建应用程序的基本构建模块,例如控制器和提供程序。
但是,如果您从单项目模式切换到单体仓库模式会发生什么呢?Nest CLI 现在可以显示工作区中所有应用程序/库的交互式列表,这样您就可以精确选择要生成内容的位置!

Nest G 服务
nest g service例子

向后兼容性

使用 ` nest startand`nest build并非必需。所有现有应用程序都将按预期运行——没有任何破坏性更改!我们实现了一些新功能,旨在简化开发人员的工作,但您仍然可以使用与以前相同的技术来编译和运行您的应用程序(使用typescript编译器或webpack直接运行都完全没问题)。

综上所述

最新的 CLI 为您的应用程序引入了许多强大的新功能。

  • 新增buildstart命令
  • Monorepo 支持
  • 生成升级
    • nest g app NAME
    • nest g lib NAME
    • 交互式支持让您可以精确选择生成位置

我们希望您和我们一样对这些新功能感到兴奋,并期待听到您的反馈,以及我们如何才能进一步改进 NestJS 生态系统!

成为 Nest 的支持者或赞助者,向 我们的开放社区捐款。❤

文章来源:https://dev.to/trilon/announcing-nestjs-monorepos-and-new-cli-commands-1n0b