本文档提供了 NestJS 应用程序可用的构建工具和配置选项的全面概述。它解释了如何使用 TypeScript、Webpack 和 Babel 等不同工具配置、自定义和优化构建过程。有关部署相关信息,请参阅 部署和 Docker。
NestJS 应用程序主要使用 TypeScript,在执行之前需要编译成 JavaScript。该框架支持多种构建工具和配置,以优化开发体验和生产性能。
NestJS CLI 在这些构建工具之上提供了一个抽象层,允许开发人员通过配置选项在它们之间切换。
来源:sample/08-webpack/package.json, sample/09-babel-example/package.json
默认情况下,NestJS 使用 TypeScript 编译器(tsc)来构建应用程序。这反映在典型的 package.json 脚本中
构建过程通过以下方式配置
NestJS CLI 通过 nest build 命令提供多个构建选项
| 选项 | 描述 |
|---|---|
--watch | 启用监视模式,以便在文件更改时重新构建 |
--webpack | 使用 Webpack 进行打包 |
--webpackPath | 指定自定义 Webpack 配置 |
--tsc | 使用 TypeScript 编译器(默认) |
--builder | 指定自定义构建器实现 |
Webpack 集成为 NestJS 应用程序提供了几个优势,包括:
NestJS 应用程序可以通过 CLI 使用 Webpack
Webpack 示例中的 package.json 演示了此配置
sample/08-webpack/package.json7-9
热模块替换 (HMR) 允许开发人员在不重新启动应用程序的情况下看到更改。这需要特定的 Webpack 配置。
Webpack HMR 需要以下关键依赖项:
sample/08-webpack/package.json31-36
Babel 提供了一个以 JavaScript 转译为中心的替代构建系统,具有以下优势:
NestJS 需要特定的 Babel 插件来处理装饰器和其他 TypeScript 功能。
Babel 示例的 package.json 显示了所需的依赖项。
sample/09-babel-example/package.json25-32
以及相关的构建脚本。
sample/09-babel-example/package.json7-10
Babel 需要针对 NestJS 应用程序进行特定配置,主要用于支持装饰器和元数据反射。
| 插件/预设 | 目的 |
|---|---|
@babel/plugin-proposal-decorators | 启用 NestJS 中广泛使用的装饰器语法。 |
@babel/plugin-transform-runtime | 防止辅助函数重复。 |
@babel/preset-env | 基于目标环境的智能转译。 |
@babel/register | 用于即时转译。 |
Webpack 和 Babel 配置都可以通过开发工具进行增强。
ts-loader: 将 TypeScript 文件加载到 Webpack 中。start-server-webpack-plugin: 在 HMR 期间管理服务器生命周期。webpack-node-externals: 防止对 node_modules 进行打包。nodemon: 提供自动重启功能。@babel/node: 支持直接执行兼容 Babel 的代码。| 构建工具 | 理想用例 | 配置重点 |
|---|---|---|
| TypeScript (tsc) | 简单的应用程序,明确的关注点分离。 | tsconfig.json 优化。 |
| Webpack | 复杂的应用程序,生产优化,HMR 要求。 | 分块,优化插件,环境配置。 |
| Babel | 以 JavaScript 为中心的开发流程,支持旧版浏览器。 | 专注的预设,最小化的转换插件。 |
对于生产构建,请考虑以下优化:
来源:sample/08-webpack/package.json, sample/09-babel-example/package.json
构建工具也会影响测试设置。
sample/09-babel-example/package.json39-47
此配置可确保 Jest 与 Babel 转译的代码正确运行。
NestJS 提供了灵活的构建工具集成选项,以适应不同的项目需求和开发人员偏好。在 TypeScript 编译器、Webpack 和 Babel 之间的选择取决于具体需求。
每种方法都有特定的配置要求,如示例项目所示,并且可以进行自定义以优化开发体验和生产性能。
来源:sample/08-webpack/package.json, sample/09-babel-example/package.json