Spartacus 4.3 SSR模式下懒加载翻译失败,请求JSON文件报错
解决Spartacus 4.3 SSR模式下懒加载翻译JSON文件报错问题
我在Spartacus 4.3项目中实现了懒加载翻译功能,多数场景下运行正常,浏览器网络面板能看到JSON文件已成功加载。但切换到SSR模式运行时,Node日志中出现大量和JSON文件相关的错误,错误信息如下:
An unknown http error occurred Http failure response for
https://this-is-test:4200/app/spartacus/assets/translations/en/login.json: 0 Unknown Error
我已经按照Spartacus官方文档把加载路径改成assets/18n-assets/en/login.json,也试过用完整路径排查相对路径问题,但都没解决问题。我的懒加载翻译配置如下:
provideConfig(<I18nConfig>{ i18n: { backend: { loadPath: 'app/spartacus/assets/translations/{{lng}}/{{ns}}.json' }, chunks: translationChunksConfig, fallbackLang: 'en', }, }),
排查方向与解决办法
- 适配SSR环境的静态资源路径
SSR运行在Node端,不能直接用浏览器端的HTTP请求路径加载静态资源。尝试把loadPath改为基于项目根目录的文件系统相对路径,比如./dist/app/spartacus/assets/translations/{{lng}}/{{ns}}.json(根据实际打包输出目录调整)。 - 配置SSR的静态资源托管
在server.ts中确保静态资源目录被正确托管,添加类似代码:
让Node端可以直接读取静态资源,避免发起无效HTTP请求。app.use(express.static(join(__dirname, '..', 'dist', 'app', 'spartacus'))); - 自定义SSR专用的翻译加载服务
替换默认的I18n后端服务,直接从文件系统读取翻译文件,示例代码:
然后在SSR的providers中替换服务:@Injectable() export class ServerSideTranslationBackend extends BackendService { constructor(@Inject('fs') private fs: typeof fs, private config: Config) { super(); } load(language: string, namespace: string): Observable<Record<string, string>> { const loadPath = this.config.i18n?.backend?.loadPath || ''; const filePath = loadPath.replace('{{lng}}', language).replace('{{ns}}', namespace); return from(this.fs.promises.readFile(filePath, 'utf8')).pipe( map(content => JSON.parse(content)) ); } }provideConfig({ i18n: { backend: { loadPath: './assets/translations/{{lng}}/{{ns}}.json' } } }), { provide: BackendService, useClass: ServerSideTranslationBackend }, { provide: 'fs', useValue: fs } - 验证打包后的资源位置
确认打包后翻译JSON文件确实存在于dist/app/spartacus/assets/translations目录下,路径和配置中的loadPath完全匹配,避免因打包配置错误导致资源缺失。
内容的提问来源于stack exchange,提问作者Fcarter94_
相关产品推荐
相关产品推荐

