angular 4 universal - 用于服务器和浏览器的不同组件/模块

时间:2017-07-26 15:53:37

标签: angular serverside-rendering angular-universal angular2-universal

所以我有一个简单的jquery插件包装器,但很明显,由于缺少浏览器全局对象,包装器会在通用上出错。

与大多数jquery插件一样,这个插件也是

我想知道我们是否有一种简单的方法可以拥有两个不同版本的组件/模块,一个用于通用,一个用于非通用。

Universal确实有一个单独的启动'app'模块(用于加载BrowserAnimationsModules和NoopAnimationsModule),但这只能起作用,因为这些模块导出服务。

1 个答案:

答案 0 :(得分:2)

我可以为您提供一些可以尝试的建议。我对angular-universal也很陌生。这是universal用户中的常见问题。

  

“......因为缺少浏览器全局对象”

是的!通常情况下,您会看到universal上的错误,例如“找不到document”,“找不到navigator”,“找不到window”等等。

解决方案?

您可以尝试使用jsdom,这将通过模拟足够的Web浏览器子集来消除此类警告。

其他什么?

您可以运行那些错误的代码,仅在客户端运行,从而消除控制台上的任何错误。为此,您可以使用universal小组提供的解决方案here

以下是他们所说的

  

如果您需要使用它们,请考虑将它们仅限于您的客户   并在情境中包装它们。您可以使用注入的Object   PLATFORM_ID令牌,用于检查当前平台是否为浏览器   或服务器。

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

现在,假设您有一个问题,您需要插入第三方库 - 比方说 - 一个滑块,您不希望在服务器端加载它,为初始加载添加更多膨胀。

在这种情况下,您可以在服务器端渲染后动态注入所有内容。这是一个很好的answer,您可以将其与上述代码段结合使用以满足此要求。

我希望,我已经大致了解了如何处理你的情况。如果您有任何疑问,请与我们联系。