我对我自己的问题有部分答案。
对于问题 1:
问题是我自己的错。assetPrefix
使用 SSR 但不适用于 SSG,因为我没有正确传递环境变量。在我的情况下,我们有 2 个不同的 CDN URL 用于生产和登台。所以我在next.config.js
. 因为MY_ENV
是从 PM2 传入的,它启动我的应用程序,所以保证MY_ENV
在 Next.js 需要访问next.config.js
.
// next.config.js
const isProd = process.env.MY_ENV === 'production';
const isStaging = process.env.MY_ENV === 'staging';
const isDevelopment = process.env.MY_ENV === 'development';
if (isProd) {
assetPrefix = 'https://mycdn.cloudfront.net/';
} else if (isStaging) {
assetPrefix = 'https://mycdn.cloudfront.net/staging';
}
但是,当我运行next build
静态页面时,构建步骤不使用 PM2,因此MY_ENV
不可用。为了使其工作,我需要使用不同的变量运行构建两次。
"build": "npm-run-all --parallel build:production build:staging",
"build:production": "MY_ENV=production next build",
"build:staging": "MY_ENV=staging next build",
对于问题 2:
如果我能够预先生成所有静态页面。我可以将所有内容都放在 CDN 上,它们就会起作用。
在我的情况下,ISR 更合适。我让 ISR 工作的方法是要求服务器为每个请求返回 HTML,而不是托管在 CDN 上。由于所有其他资产都托管在 CDN 上,因此性能仍然相当不错,并且此解决方案非常适合我的情况。
如果你和我一样在这个问题上有点挣扎,希望我的回答能帮到你。