自定义构建命令
默认情况下,OpenNext 会执行 package.json
中的 build
脚本。但如有需要,您可以指定自定义构建命令。
# CLI
open-next build --build-command "pnpm custom:build"
// JS
import { build } from "open-next/build.js";
await build({
buildCommand: "pnpm custom:build",
});
自定义应用和构建输出路径
OpenNext 默认从当前命令所在文件夹执行 build
脚本。当在具有分散式应用和构建输出路径的 monorepo 中运行 OpenNext 时,您可以指定自定义的 appPath
和/或 buildOutputPath
。这将允许您从 monorepo 的根目录执行命令。
# CLI
open-next build --build-command "pnpm custom:build" --app-path "./apps/example-app" --build-output-path "./dist/apps/example-app"
// JS
import { build } from "open-next/build.js";
await build({
buildCommand: "pnpm custom:build",
appPath: "./apps/example-app",
buildOutputPath: "./dist/apps/example-app",
});
压缩服务器函数
启用此选项将使用 node-minify (opens in a new tab) 库压缩服务器函数包中的所有 .js
和 .json
文件。根据应用大小,这可以将服务器函数包的体积减少约 40%。
# CLI
open-next build --minify
// JS
import { build } from "open-next/build.js";
await build({
minify: true,
});
此功能目前处于实验阶段,需要主动启用。它可以显著降低服务器函数的冷启动时间。经过全面测试并确认稳定性后,将会默认启用。
实验性 流式支持
启用此选项将为服务器函数启用流式支持。这是实验性功能,需要主动启用。它可以显著降低服务器函数的首字节到达时间。
请勿在生产环境中使用。更多信息请参阅此文档。
open-next build --streaming
实验性功能 禁用 DynamoDB 缓存
启用此选项将禁用 DynamoDB 缓存。此为实验性功能,需要主动选择启用。这意味着 next/cache
的重新验证功能将无法工作。
open-next build --dangerously-disable-dynamodb-cache
实验性功能 禁用增量缓存
禁用增量缓存会导致每次请求时整个页面都会重新验证。这将导致 ISR 和 SSG 页面处于不一致状态。如果仅使用 SSR 页面,可指定此选项。此操作也会同时禁用 DynamoDB 缓存。
open-next build --dangerously-disable-incremental-cache
在同一个存储桶中复用资源和缓存
通常,资源文件会上传到存储桶的根目录。但在某些情况下,您可能希望将它们存储在存储桶的子文件夹中,例如:
- 使用预先存在的存储桶时;或
- 在同一存储桶中同时存储资源和缓存文件。
如果选择将资源文件上传到子文件夹(如 "assets"),请确保:
- 将图片优化函数的
BUCKET_KEY_PREFIX
环境变量设置为assets
- 将 CloudFront S3 源的 "origin path" 设置为
assets
同样地,如果决定将缓存文件上传到子文件夹(如 "cache"),请确保:
- 将服务器函数的
CACHE_BUCKET_KEY_PREFIX
环境变量设置为cache
调试模式
OpenNext 可以在调试模式下执行以便进行问题追踪。
# CLI 命令行工具
OPEN_NEXT_DEBUG=true npx open-next@latest build
// JS
import { build } from "open-next/build.js";
await build({
debug: true,
});
该命令会执行以下操作:
- 构建输出中的 Lambda 处理函数将不会被压缩
- 构建输出中的 Lambda 处理函数会启用内联 sourcemap
- Lambda 处理函数会自动
console.log
记录请求事件对象及其他调试信息
建议在生产环境构建时关闭调试模式,因为:
- 未压缩的函数代码体积是压缩后的 2-3 倍,这会导致 Lambda 冷启动时间变长
- 每次请求都记录事件对象会产生大量日志写入 AWS CloudWatch,这将增加 AWS 费用