Dav*_*vid 6 server-side-rendering angular-i18n angular-universal angular angular9
我正在将 angular 7 应用程序迁移到 angular 9,它使用服务器端渲染(angular 通用)和 angular i18n 用于 2 种语言(法语和英语)。
在旧的 angular 7 流程中,由于我使用的是 AOT,因此我必须为生产进行 5 次构建:
然后,在server.ts我动态加载正确的服务器包
旧服务器.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,
Run Code Online (Sandbox Code Playgroud)
我将应用程序迁移到 angular 9,现在根据我在文档中的理解,只需要一个客户端构建。
您还可以使用现有的生产配置为 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"
Run Code Online (Sandbox Code Playgroud)
新服务器.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,
}));
Run Code Online (Sandbox Code Playgroud)
dist文件夹结构
- dist
- myproject
- browser
- fr
- index.html
- *.js
- en
- index.html
- *.js
- server
- main.js
Run Code Online (Sandbox Code Playgroud)
注意:我确实看到了一个封闭的github 问题描述了这个问题,但解决方案基本上是回到以前的方式,即每种语言有 2 个构建,还有 2 个针对server.ts.
当然还有别的方法吗?
我找到了一个只涉及 2 个构建的解决方案。但现在需要运行服务器进程的 2 个实例。
确保您的区域设置在选项中正确定义angular.json并添加新allLocales目标my-project:server。
我创建了一个新allLocales目标,因为我不知道如何将production目标与en配置fr结合起来。这样做的目的是只构建一台服务器并生成所有语言服务器。
对于前面的包,这本身是可能的ng build(即ng build --configuration=production,fr,en or ng build --configuration=production --localize)
角度.json
"projects": {
"my-project": {
"i18n": {
"locales": {
"en": {
"translation": "src/locale/messages.en.xlf",
"baseHref": ""
},
"fr": {
"translation": "src/locale/messages.fr.xlf",
"baseHref": ""
}
}
},
"root": "",
"sourceRoot": "src",
"projectType": "application",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
//...
},
"configurations": {
"production": {
//...
},
"en": {
"localize": [
"en"
]
},
"fr": {
"localize": [
"fr"
]
}
}
},
"server": {
"builder": "@angular-devkit/build-angular:server",
"options": {
"outputPath": "dist/my-project/server",
"main": "server.ts",
"tsConfig": "tsconfig.server.json"
},
"configurations": {
"production": {
//...
},
"allLocales": {
"outputHashing": "none",
"optimization": false,
"sourceMap": false,
"namedChunks": false,
"extractLicenses": true,
"vendorChunk": false,
"localize": [
"en", "fr"
],
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
]
}
}
},
Run Code Online (Sandbox Code Playgroud)
修改server.ts文件以接受语言参数。生成的服务器包的每个运行实例都 main.js将具有自己的端口和语言。
服务器.ts
//...
export function app(language) { //add language here
const server = express();
const distFolder = join(process.cwd(), 'dist/my-project/browser', language); //Use language here
//...
function run() {
const port = process.env.PORT || 5006;
const language = process.env.LANGUAGE || 'fr';
// Start up the Node server
const server = app(language); //Use the language here
server.listen(port, () => {
console.log(`Node Express server listening on http://localhost:${port} for language ${language}`);
});
Run Code Online (Sandbox Code Playgroud)
包.json
"build:ssr": "ng build -c production --localize && ng run my-project:server:allLocales"
"serve:ssr-en": "env PORT=5006 LANGUAGE=en node dist/my-project/server/en/main.js",
"serve:ssr-fr": "env PORT=5007 LANGUAGE=fr node dist/my-project/server/fr/main.js",
Run Code Online (Sandbox Code Playgroud)
build:ssr将为所有语言构建客户端捆绑包,然后为所有语言构建服务器捆绑包
server:ssr-XX将为与语言 XX 关联的端口和语言启动 NodeJS 服务器
这是结构
- dist
- myproject
- browser
- fr
- index.html
- *.js
- en
- index.html
- *.js
- server
- fr
- main.js
- en
- main.js
Run Code Online (Sandbox Code Playgroud)
如果您使用反向代理,请不要忘记将所有请求重定向到正确的 main.js 实例
注意现在,使用 Angular 9 构建过程要快得多,因为只有 2 个构建。
| 归档时间: |
|
| 查看次数: |
3613 次 |
| 最近记录: |