TypeScript编译过程

TypeScript 构建过程

用 TypeScript 编写的应用程序必须在生产环境中运行之前编译成 JavaScript。

可以使用许多不同的构建工具来编译 TypeScript 源文件。然而,在 AdonisJS 中,我们坚持使用最直接的方法,并使用以下经过时间考验的工具。

以下提到的所有工具在官方入门套件中都预装了作为开发依赖项。

  • TSC 是 TypeScript 的官方编译器。我们使用 TSC 进行类型检查并创建生产构建。

  • TS Node 是 TypeScript 的即时编译器。它允许你在不将 TypeScript 文件编译为 JavaScript 的情况下执行它们,是开发过程中的一个强大工具。

  • SWC 是用 Rust 编写的 TypeScript 编译器。我们在开发过程中与 TS Node 一起使用它,以使 JIT 过程极快。

工具用途类型检查
TSC创建生产构建
TS Node开发
SWC开发

不编译执行 TypeScript 文件

你可以使用 ts-node/esm 加载器执行 TypeScript 文件,而无需编译它们。例如,你可以通过运行以下命令启动 HTTP 服务器。

node --loader="ts-node/esm" bin/server.js
  • --loader:加载器标志向 ES 模块系统注册模块加载器钩子。加载器钩子是 Node.js API 的一部分。

  • ts-node/esmts-node/esm 脚本的路径,该脚本注册生命周期钩子以执行 TypeScript 源文件的即时编译为 JavaScript。

  • bin/server.js:AdonisJS HTTP 服务器入口点文件的路径。另请参阅:关于文件扩展名的说明

你也可以对其他 TypeScript 文件重复此过程。例如:

运行测试
node --loader ts-node/esm bin/test.js
运行 ace 命令
node --loader ts-node/esm bin/console.js
运行其他 TypeScript 文件
node --loader ts-node/esm path/to/file.js

关于文件扩展名的说明

你可能注意到我们到处都使用 .js 文件扩展名,尽管磁盘上的文件是以 .ts 文件扩展名保存的。

这是因为,在使用 ES 模块时,TypeScript 强制你在导入和运行脚本时使用 .js 扩展名。你可以在 TypeScript 文档 中了解这一选择背后的原理。

运行开发服务器

我们建议使用 serve 命令来启动开发服务器,而不是直接运行 bin/server.js 文件,原因如下。

  • 该命令包括文件监视器,并在文件更改时重启开发服务器。
  • serve 命令会检测你的应用程序使用的前端资源打包工具,并启动其开发服务器。例如,如果你的项目根目录中有 vite.config.js 文件,serve 命令将启动 vite 开发服务器。
node ace serve --watch

你可以使用 --assets-args 命令行标志向 Vite 开发服务器传递参数。

node ace serve --watch --assets-args="--debug --base=/public"

你可以使用 --no-assets 标志来禁用 Vite 开发服务器。

node ace serve --watch --no-assets

向 Node.js 命令行传递选项

serve 命令作为子进程启动开发服务器(bin/server.ts 文件)。如果你想向子进程传递 node 参数,可以在命令名称之前定义它们。

node ace --no-warnings --inspect serve --watch

创建生产构建

使用 node ace build 命令创建 AdonisJS 应用程序的生产构建。build 命令执行以下操作,在 ./build 目录中创建一个 独立 JavaScript 应用程序

  • 删除现有的 ./build 文件夹(如果有)。
  • 从头开始重写 ace.js 文件,以移除 ts-node/esm 加载器。
  • 使用 Vite 编译前端资源(如果已配置)。
  • 使用 tsc 将 TypeScript 源代码编译为 JavaScript。
  • metaFiles 数组中注册的非 TypeScript 文件复制到 ./build 文件夹。
  • package.jsonpackage-lock.json/yarn.lock 文件复制到 ./build 文件夹。

由于 ace.js 文件是从头开始重写的,因此构建过程中对该文件的任何修改都将丢失。如果你希望在 Ace 启动之前运行其他代码,你应该在 bin/console.ts 文件中进行。

就这些!

node ace build

创建构建后,你可以 cd 进入 build 文件夹,安装生产依赖项,并运行你的应用程序。

cd build
# 安装生产依赖项
npm i --omit=dev
# 运行服务器
node bin/server.js

你可以使用 --assets-args 命令行标志向 Vite 构建命令传递参数。

node ace build --assets-args="--debug --base=/public"

你可以使用 --no-assets 标志来避免编译前端资源。

node ace build --no-assets

什么是独立构建?

独立构建指的是你的应用程序的 JavaScript 输出,你可以在没有原始 TypeScript 源码的情况下运行它。

创建独立构建有助于减少你在生产服务器上部署的代码大小,因为你无需同时复制源文件和 JavaScript 输出。

创建生产构建后,你可以将 ./build 复制到生产服务器,安装依赖项,定义环境变量,并运行应用程序。