使用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.
...
}
}