升级到 Angular 10 - 修复 CommonJS 或 AMD 依赖项可能导致优化救助

Ora*_*Ora 89 javascript rxjs angular-upgrade angular rxjs6

我正在尝试将我的 angular 9 应用程序升级到 angular 10 版本,但在升级后低于警告

rxjs\BehaviorSubject.js depends on rxjs-compat/BehaviorSubject
Run Code Online (Sandbox Code Playgroud)

知道如何解决这个问题吗?

Gun*_*kar 88

当您使用与 CommonJS 一起打包的依赖项时,可能会导致应用程序变大变慢

从版本 10 开始,Angular 现在会在您的构建引入这些包之一时向您发出警告。如果您已经开始看到这些依赖项的警告,请让您的依赖项知道您更喜欢 ECMAScript 模块 (ESM) 包。

这是官方文档 -配置 CommonJS 依赖项

angular.json文件中查找构建对象并添加

allowedCommonJsDependencies

如下所示 -

"build": {
  "builder": "@angular-devkit/build-angular:browser",
  "options": {
     "allowedCommonJsDependencies": [
        "rxjs-compat",
         ... few more commonjs dependencies ... 
     ]
     ...
   }
   ...
},
Run Code Online (Sandbox Code Playgroud)

  • @LeonardoRick尝试为firebase依赖项添加类似的内容: "allowedCommonJsDependencies": [ "firebase", "@firebase/app", "firebase/app", "@firebase/functions", "@firebase/performance", "@firebase /remote-config", "@firebase/component" ],在您的情况下,只需在现有列表中添加 '@firebase/component' 关键字,它就应该可以工作。 (3认同)
  • 对于任何搜索应该添加该文件的人 - 项目根目录中的“angular.json”。 (2认同)

小智 70

尝试更换rxjs进口rxjs/internal/operatorsrxjs/operators

前任:

import { catchError, retry } from 'rxjs/internal/operators';
Run Code Online (Sandbox Code Playgroud)

import { catchError, retry } from 'rxjs/operators';
Run Code Online (Sandbox Code Playgroud)


Aru*_*mar 33

建议您避免在 Angular 应用程序中依赖 CommonJS 模块。依赖 CommonJS 模块可以防止打包器和压缩器优化您的应用程序,从而导致更大的包大小。相反,建议您在整个应用程序中使用 ECMAScript 模块。您仍然不关心您的捆绑大小,

要禁用这些警告,您可以将 CommonJS 模块名称添加到allowedCommonJsDependencies位于angular.json文件中的构建选项中的选项。

"build": {
  "builder": "@angular-devkit/build-angular:browser",
  "options": {
     "allowedCommonJsDependencies": [
        "rxjs-compat"
     ]
     ...
   }
   ...
},
Run Code Online (Sandbox Code Playgroud)

来源

  • 谢谢回答。我仍然想知道是否有推荐的 ECMAScript 模块作为替代品?而不是禁用警告。 (18认同)
  • 这并没有消除我的警告消息。 (5认同)
  • 尽管建议是正确的,但它假设我使用 CommonJS 或 AMD,而最常见的情况是我使用依赖于这些的第 3 方库。 (2认同)

Anu*_*ige 13

对于 RXJS 库,您可以进行以下更改。

对于诸如'rxjs/internal/<anything>'and 之类的导入'rxjs/index',请将其替换为 just 'rxjs'

对于诸如 的导入'rxjs/internal/operators',将其替换'rxjs/operators'为 @Janardhan Burle 的回答中提到的 。


Ade*_*our 10

只需更改导入:

从:

import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';

到:

import { BehaviorSubject } from 'rxjs';

  • 这只是抑制警告,还是也有助于优化? (3认同)
  • 嗨@liakoyras,很抱歉重播晚了。RxJS 6 带来了模块化方面的改进、性能的提升以及更易于调试调用堆栈。RxJS 团队付出了巨大的努力,使这个版本尽可能向后兼容。https://auth0.com/blog/whats-new-in-rxjs-6/ (2认同)

atc*_*way 6

另一种情况是在使用以下导入样式时使用BehaviorSubjectfrom进行构建期间被警告的问题:rxjs

import { BehaviorSubject } from 'rxjs/BehaviorSubject';

它会导致以下错误:

警告:my.service.ts 依赖于“rxjs/BehaviorSubject”。CommonJS 或 AMD 依赖项可能会导致优化救援。

通过从根模块导入,构建过程中不再出现警告:

import { BehaviorSubject } from 'rxjs';


小智 5

要在 angular.json 的终端上解决此问题,请将此行放入:

{
  "architect": {
    "build": {
      "builder": "@angular-devkit/build-angular:browser",
      "options": {
        "allowedCommonJsDependencies": [
          "rxjs"
        ]
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是修复吗?这只是隐藏了警告,对吗?问题仍然存在。 (2认同)