使用aspnetcore with angular模板创建的项目,已经配置好了服务端渲染,但是当项目中引入了第三方类库--tinymce之后,出现window is not defined,因为tinymce使用了window对象,而服务端渲染是在node中进行的,node中又没有window对象,因此抛出这个异常。
如何解决这个问题呢?
服务端渲染的目的是为了提高加载速度,利于SEO,对于这个富文本编辑页面是不需要服务端渲染的。
因此,可以通过angular的lazy-load 懒加载这个页面,实现不通过服务端渲染这个页面。但是官方文档里只说了用angular-cli如何实现懒加载,而通过dotnet new angular创建的项目,不是通过angular-cli开发的,(事实上,angular-cli就是封装对Webpack的操作,简化配置的复杂度,降低学习成本,缺点就是不能灵活配置,解决办法就是ng eject,禁用angular-cli),所以需要在Webpack中配置懒加载,参考文档
问题不应该是这样解决的,这个页面无论是否懒加载,都应该和服务端渲染无关,这是两个不同的概念。这个问题的正确的解决方案应该是避免在服务端加载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.
...
}
}