在 Lambda 上预呈现动态路由并在 s3 上保存
Prerender dynamic routes on Lambda and save on s3
我在我的应用程序中启用了 angular 通用功能,并且能够对某些静态路由(如主页、关于等)执行 prerendering。
现在我还需要预呈现一些额外的路由,但我需要能够在需要时在网站已经部署之后进行此操作。如果 Airbnb 想要在人们发布新广告时预呈现新广告,则将是一个实际用例。
我想有一个可以触发的 Lambda 函数(当为此示例添加广告时),它将 运行 预呈现,然后将 index.html
文件保存在 s3 存储桶中(我已经在上面安装了 CloudFront)。
但是如何在 Lambda 上实际生成文件?我目前正在构建时使用:
ng run my-app:prerender
注意:我不想从 lambda 提供文件,我想生成它们(预渲染)并保存在 s3
我通过阅读通用预渲染包的源代码设法使它工作,这是有效的:
const { resolve, join } = require('path');
const { setup, render } = require('@nguniversal/builders/src/prerender/worker.js');
const [ route ] = process.argv.slice(2);
const ROOT = resolve(__dirname);
const outputPath = join(ROOT, 'dist', 'browser');
const serverBundlePath = join(ROOT, 'dist', 'server', 'main.js');
setup({
indexFile: 'index.html',
deployUrl: '',
inlineCriticalCss: true,
minifyCss: true
});
render(outputPath, serverBundlePath, route).then(() => {
console.log('Build', route, 'done');
process.exit(0);
}).catch(err => {
console.error(err);
process.exit(1);
});
在 运行 一次 npm run prerender
之后(如 Angular 教程中所述),我现在可以通过 node prerender.js /my-route
预渲染任何路线
我在我的应用程序中启用了 angular 通用功能,并且能够对某些静态路由(如主页、关于等)执行 prerendering。
现在我还需要预呈现一些额外的路由,但我需要能够在需要时在网站已经部署之后进行此操作。如果 Airbnb 想要在人们发布新广告时预呈现新广告,则将是一个实际用例。
我想有一个可以触发的 Lambda 函数(当为此示例添加广告时),它将 运行 预呈现,然后将 index.html
文件保存在 s3 存储桶中(我已经在上面安装了 CloudFront)。
但是如何在 Lambda 上实际生成文件?我目前正在构建时使用:
ng run my-app:prerender
注意:我不想从 lambda 提供文件,我想生成它们(预渲染)并保存在 s3
我通过阅读通用预渲染包的源代码设法使它工作,这是有效的:
const { resolve, join } = require('path');
const { setup, render } = require('@nguniversal/builders/src/prerender/worker.js');
const [ route ] = process.argv.slice(2);
const ROOT = resolve(__dirname);
const outputPath = join(ROOT, 'dist', 'browser');
const serverBundlePath = join(ROOT, 'dist', 'server', 'main.js');
setup({
indexFile: 'index.html',
deployUrl: '',
inlineCriticalCss: true,
minifyCss: true
});
render(outputPath, serverBundlePath, route).then(() => {
console.log('Build', route, 'done');
process.exit(0);
}).catch(err => {
console.error(err);
process.exit(1);
});
在 运行 一次 npm run prerender
之后(如 Angular 教程中所述),我现在可以通过 node prerender.js /my-route