1

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

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

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

Universal 确实有一个单独的启动“应用程序”模块(用于加载 BrowserAnimationsModules 与 NoopAnimationsModule),但这仅适用于这些模块导出服务。

4

1 回答 1

2

我可以给你一些建议,你可以试试。我也很新angular-universal。这是universal用户之间的普遍问题。

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

是的!通常,您会看到universal诸如“document未找到”、“navigator未找到”、“window未找到”等 错误。

解决方案?

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

还要别的吗?

您只能在客户端运行那些出错的代码,从而消除控制台上的任何错误。为此,您可以使用团队 在此处提供的解决方案。universal

他们是这样说的

如果您需要使用它们,请考虑将它们仅限于您的客户并根据情况进行包装。您可以使用使用 PLATFORM_ID 令牌注入的 Object 来检查当前平台是浏览器还是服务器。

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

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

在这种情况下,您可以在服务器端渲染后动态注入所有内容。这是一个很好的答案,您可以结合上面的代码片段来满足这个要求。

我希望,我已经让你大致了解了如何处理你的情况。如果您有任何疑问,请告诉我。

于 2017-07-29T18:36:51.620 回答