自定义构建命令
OpenNext 默认运行 package.json 中的 build 脚本。但是,如果需要,您可以指定自定义构建命令。
# 命令行
open-next build --build-command "pnpm custom:build"// JavaScript
import { build } from "open-next/build.js";
await build({
buildCommand: "pnpm custom:build",
});自定义应用和构建输出路径
OpenNext 默认从当前命令文件夹运行 build 脚本。当在具有分散应用和构建输出路径的 monorepo 中运行 OpenNext 时,您可以指定自定义 appPath 和/或 buildOutputPath。这将允许您从 monorepo 的根目录执行命令。
# 命令行
open-next build --build-command "pnpm custom:build" --app-path "./apps/example-app" --build-output-path "./dist/apps/example-app"// JavaScript
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%。
# 命令行
open-next build --minify// JavaScript
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 可以在调试模式下执行以用于错误跟踪目的。
# 命令行
OPEN_NEXT_DEBUG=true npx open-next@latest build// JavaScript
import { build } from "open-next/build.js";
await build({
debug: true,
});这会执行以下几件事:
- 构建输出中的 Lambda 处理函数将不会被最小化。
- 构建输出中的 Lambda 处理函数已启用内联 sourcemap。
- Lambda 处理函数将自动
console.log请求事件对象以及其他调试信息。
建议 在生产构建时关闭调试模式,因为:
- 未最小化的函数代码比最小化代码大 2-3 倍。这将导致 Lambda 冷启动时间更长。
- 记录每个请求的事件对象会导致大量日志写入 AWS CloudWatch。这将导致 AWS 成本增加。