【发布时间】:2020-03-11 16:25:35
【问题描述】:
我正在将 Angular 7 应用程序迁移到 Angular 9,它使用服务器端渲染(角度通用)和 Angular i18n 来支持 2 种语言(法语和英语)。
在旧的 Angular 7 过程中,由于我使用的是 AOT,因此我必须为生产进行 5 次构建:
- 2 个客户端构建(1 个用于法语,1 个用于英语)
- 2 x 服务器构建(1 个用于法语,1 个用于英语)
- server.ts 的构建
然后,在server.ts 中,我正在动态加载正确的服务器包
旧 server.ts
app.engine('html', (_, options: any, callback) => {
const isFR= options.req.url.indexOf('site-fr') >= 0 ;
const {AppServerModuleNgFactory, LAZY_MODULE_MAP} = isFR ? require('./dist/server/fr/main') : require('./dist/server/en/main');
// Our index.html we'll use as our template
const template = readFileSync(join(DIST_FOLDER, 'browser', isFR ? 'fr' : 'en', 'index.html')).toString();
renderModuleFactory(AppServerModuleNgFactory, {
// Our index.html
document: template,
我将应用程序迁移到 Angular 9,现在根据我在 documentation 中的理解,只需要一个客户端构建。
您还可以使用现有的生产配置为 ng build 命令提供 --localize 选项。在这种情况下,CLI 会构建项目配置中 i18n 下定义的所有语言环境。
这似乎适用于客户端构建,因为生成了 2 个文件夹(fr 和 en)。
但是,没有任何地方提到将 SSR 与 i18n 一起使用。所以我最终得到了一个server.ts。
这是我用来构建和运行项目的脚本
angular.json
"serve:ssr": "node dist/myproject/server/main.js",
"build:ssr": "ng build -c production --localize && ng run myproject:server:production"
新的 server.ts
// The Express app is exported so that it can be used by serverless Functions.
export function app(port) {
const server = express();
const distFolder = join(process.cwd(), 'dist/myproject/browser/fr');
const indexHtml = existsSync(join(distFolder, 'index.original.html')) ? 'index.original.html' : 'index';
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
server.engine('html', ngExpressEngine({
bootstrap: AppServerModule,
}));
Dist 文件夹结构
- dist
- myproject
- browser
- fr
- index.html
- *.js
- en
- index.html
- *.js
- server
- main.js
注意:我确实看到了一个封闭的 github issue 描述了这个问题,但解决方案基本上是回到以前的方式,即每种语言有 2 个构建,还有 server.ts 的 2 个构建。
肯定还有别的办法吗?
【问题讨论】:
标签: angular server-side-rendering angular-universal angular9 angular-i18n