- 2 次客户端构建(分别为法语和英语) - 2 次服务器构建(分别为法语和英语) - server.ts 的构建
然后,在 `server.ts` 文件中,我会动态加载正确的服务器 bundle。 旧的 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,根据文档的理解,现在只需要一个客户端构建就可以了。
对于客户端构建,这似乎是有效的,因为会生成两个文件夹(您还可以使用现有的生产配置向ng build命令提供--localize选项。在这种情况下,CLI会按照项目配置中i18n下定义的所有区域设置来构建。
fr
和en
)。然而,在任何地方都没有提到如何使用i18n和SSR。所以我最终只得到了一个
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问题描述这个问题,但解决方案基本上是回到以前的方式,即每种语言有两个版本构建,也有两个
server.ts
的版本构建。
肯定还有其他方法吧?
TranslateHttpLoader
。 我在我的AppServerModule中使用了TranslateJsonLoader。无需重新加载页面! - Pieterjan