宣布推出 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`nodemon和ts-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)在开发者社区中变得非常流行。尽管单体仓库也存在一些缺点,但它带来的好处却非常显著。
单体仓库可以更轻松地构建模块化组件和库,跟踪跨项目的变更,促进代码复用,并简化集成测试。
应用程序和库
为了满足社区的需求,我们新增了nest g app一些nest g lib命令,允许您将现有结构转换为单体仓库模式结构。
例如:
$ nest g app alert-service
子应用程序将与您现有的应用程序在同一工作区内搭建。这两个应用程序将共享同一个node_modules文件夹(单版本策略)和配置文件(例如 `.js`tsconfig.json和`.config` nest-cli.json)。但是,这两个应用程序可以独立
执行、开发和部署。
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 service例子
向后兼容性
使用 ` nest startand`nest build并非必需。所有现有应用程序都将按预期运行——没有任何破坏性更改!我们实现了一些新功能,旨在简化开发人员的工作,但您仍然可以使用与以前相同的技术来编译和运行您的应用程序(使用typescript编译器或webpack直接运行都完全没问题)。
综上所述
最新的 CLI 为您的应用程序引入了许多强大的新功能。
- 新增
build及start命令 - Monorepo 支持
- 生成升级
nest g app NAMEnest g lib NAME- 交互式支持让您可以精确选择生成位置
我们希望您和我们一样对这些新功能感到兴奋,并期待听到您的反馈,以及我们如何才能进一步改进 NestJS 生态系统!
成为 Nest 的支持者或赞助者,向 我们的开放社区捐款。❤
文章来源:https://dev.to/trilon/announcing-nestjs-monorepos-and-new-cli-commands-1n0b