首页 新闻 会员 周边

angular 服务端渲染 出现 window is not defined

0
[已解决问题] 解决于 2018-01-11 15:28

使用aspnetcore with angular模板创建的项目,已经配置好了服务端渲染,但是当项目中引入了第三方类库--tinymce之后,出现window is not defined,因为tinymce使用了window对象,而服务端渲染是在node中进行的,node中又没有window对象,因此抛出这个异常。

如何解决这个问题呢?

蝌蝌的主页 蝌蝌 | 初学一级 | 园豆:158
提问于:2017-12-30 09:15
< >
分享
最佳答案
0

服务端渲染的目的是为了提高加载速度,利于SEO,对于这个富文本编辑页面是不需要服务端渲染的。

因此,可以通过angular的lazy-load 懒加载这个页面,实现不通过服务端渲染这个页面。但是官方文档里只说了用angular-cli如何实现懒加载,而通过dotnet new angular创建的项目,不是通过angular-cli开发的,(事实上,angular-cli就是封装对Webpack的操作,简化配置的复杂度,降低学习成本,缺点就是不能灵活配置,解决办法就是ng eject,禁用angular-cli),所以需要在Webpack中配置懒加载,参考文档

蝌蝌 | 初学一级 |园豆:158 | 2017-12-30 09:22

问题不应该是这样解决的,这个页面无论是否懒加载,都应该和服务端渲染无关,这是两个不同的概念。这个问题的正确的解决方案应该是避免在服务端加载Tinymce之类的需要window 对象的东西,参考ssr文档

 import { PLATFORM_ID } from '@angular/core';
 import { isPlatformBrowser, isPlatformServer } from '@angular/common';
 
 constructor(@Inject(PLATFORM_ID) private platformId: Object) { ... }
 
 ngOnInit() {
   if (isPlatformBrowser(this.platformId)) {
      // Client only code.
      ...
   }
   if (isPlatformServer(this.platformId)) {
     // Server only code.
     ...
   }
 }
蝌蝌 | 园豆:158 (初学一级) | 2017-12-31 22:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册