通用约定

目录规范

这是一个约定,无法通过程序配置来修改。

1root
2│─ dist                  # 编译输出目录。
3│  ├─ package.json       # 编译输出后的软件包配置。
4│  ├─ server             # 服务端编译输出。
5│  │  └─ manifest.json   # 编译清单输出,用于生成 importmap。
6│  ├─ node               # Node 服务器程序编译输出。
7│  ├─ client             # 客户端编译输出。
8│  │  ├─ versions        # 版本存储目录。
9│  │  │  └─ latest.tgz   # 将 dist 目录归档,对外提供软件包分发。
10│  │  └─ manifest.json   # 编译清单输出,用于生成 importmap。
11│  └─ src                # 使用 tsc 生成的文件类型。
12├─ src
13│  ├─ entry.server.ts    # 服务端应用程序入口。
14│  ├─ entry.client.ts    # 客户端应用程序入口。
15│  └─ entry.node.ts      # Node 服务器应用程序入口。
16├─ tsconfig.json         # TypeScript 配置。
17└─ package.json          # 软件包配置。
拓展知识
  • gez.name 来源于 package.jsonname 字段。
  • dist/package.json 来源于根目录的 package.json
  • 设置 packs.enabletrue 时,才会对 dist 目录进行归档。

缓存策略

在构建生产代码时,可以设置强缓存部分的资源,总是以 .final[ext] 作为文件名生成规则。也就是说符合这个规则的文件,可以设置强缓存,否则应设置协商缓存。

final 文件

1res.setHeader('cache-control', 'public, max-age=31536000, immutable')

其它文件

1res.setHeader('cache-control', 'no-cache')
小知识

使用了 gez.middleware 中间件,就会默认帮你处理这个逻辑。在生产环境时,你可以自己来实现静态服务器来控制不同的缓存策略,对于你来说 gez.middleware 是可选的。点击这里 可以参考实现。

Node experimental

在开发时,gez 会启用一些 Node 实验性质的功能,来获得开发环境支持 ESM 热更新和 TypeScript 的原生支持。

1node --experimental-vm-modules --experimental-import-meta-resolve --experimental-strip-types

但是在生产环境中,我们完全不需要这些,你应该使用构建后的产物来运行程序。

1NODE_ENV=production node dist/index.js
WARNING

如果你在生产环境中使用 gez start 来启动你的应用程序,由于启用了 Node 实验性功能的原因,可能会给你的程序带来未知的风险,请始终使用 NODE_ENV=production node dist/index.js 来启动。