node.js - 由于 zone.js,Angular7 在 Google Page Speed 上的性能降低

标签 node.js angular server-side-rendering zone.js

我使用 Angular 7 作为 ssr,我们发现我们的应用程序在 Google Page Speed 方面存在严重问题,并且所有问题都集中到 zone.js

页面速度提示脚本估值太高,在分解应用程序后,我们发现问题与polyfills有关,但是,polyfills仅包含

  import 'zone.js/dist/zone.js';  // Included with Angular CLI.
  import 'classlist.js/classList.min.js';
  import 'web-animations-js/web-animations.min.js';

然后我们所做的就是完全删除polyfills文件中的所有内容,将其留空,然后直接从index.html底部的CDN添加这些文件,如下所示:

<script src="https://cdnjs.cloudflare.com/ajax/libs/zone.js/0.9.1/zone.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/classlist/1.2.201711092/classList.min.js"></script>

结果是一样的,页面速度仍然提示脚本评估,但是,我们设法减少了 50% 的脚本评估,但是,仍然非常糟糕。

我们使用的是 zone.js@0.8.10,然后我们升级到最新版本,但什么也没有。结果相同。

事实上,这正在影响我们所有的应用程序,无论我们构建为 aot 还是服务器端渲染,结果都是相同的。

有谁知道如何解决页面速度问题?作为 SSR,我们的排名在 100 名中低于 20 名。

这没有任何意义,它应该更快,而不是更慢?

image page speed polyfills

image page speed - cdn url

package.json

      "scripts": {
  "ng": "ng",
  "start": "ng serve --watch --open --progress",
  "build": "ng build",
  "test": "ng test",
  "lint": "ng lint",
  "e2e": "ng e2e",
  "build:ssr": "rimraf dist && npm run build:client-and-server-bundles && npm run webpack:server -p",
  "serve:ssr": "node dist/server.js",
  "build:client-and-server-bundles": "node --max_old_space_size=4000 node_modules/@angular/cli/bin/ng build --prod && ng run micksgarage-project:server",
  "webpack:server": "webpack --config webpack.server.config.js --progress --colors",
  "bundle-report": "webpack-bundle-analyzer dist/*/stats.json"
},
"private": true,
"dependencies": {
  "@angular-devkit/build-optimizer": "^0.802.0",
  "@angular/common": "~7.2.0",
  "@angular/compiler": "~7.2.0",
  "@angular/core": "~7.2.0",
  "@angular/forms": "~7.2.0",
  "@angular/http": "~7.2.0",
  "@angular/platform-browser": "~7.2.0",
  "@angular/platform-browser-dynamic": "~7.2.0",
  "@angular/platform-server": "~7.1.0",
  "@angular/pwa": "^0.12.4",
  "@angular/router": "~7.2.0",
  "@angular/service-worker": "~7.2.0",
  "@nguniversal/express-engine": "~7.1.0",
  "@nguniversal/module-map-ngfactory-loader": "~7.1.0",
  "classlist.js": "^1.1.20150312",
  "core-js": "~2.5.4",
  "rxjs": "~6.3.3",
  "rxjs-compat": "~6.3.3",
  "zone.js": "^0.10.1"
},
"devDependencies": {

angular.json 作为 angular.io SSR 配置加上:

          "optimization": true,
          "outputHashing": "all",
          "sourceMap": false,
          "extractCss": true,
          "namedChunks": true,
          "aot": true,
          "extractLicenses": true,
          "vendorChunk": true,
          "commonChunk": true,
          "buildOptimizer": true,
          "statsJson": true,
          "budgets": [
            {
              "type": "initial",
              "maximumWarning": "2mb",
              "maximumError": "5mb"
            }
          ],
          "serviceWorker": true,
          "ngswConfigPath": "src/ngsw-config.json"

我什至尝试使用 zone-evergreen.min.js 看一下屏幕截图

 image page speed with zone-evergreen.min.js

我还发现很多网站都存在同样的问题,与 polyfills.ts 相关或 Google Page 速度有问题,您可以在此处查看 https://www.madewithangular.com/categories/angular/任何使用 Angular 制作的网站都存在 zone.js 的问题。请检查任何网站,将 URL 复制并粘贴到 Page Speed 中,您会一遍又一遍地看到相同的问题,这不是巧合。

还有更多。

最佳答案

基本上,Angular 使用 Zone.js 在每次发生异步事件时运行更改检测。

问题不在于区域本身。考虑发布应用程序的某些部分(也许在 stackblitz 上)。

第一个猜测:您是否使用函数进行模板绑定(bind)? (或 setter/getter !)

// component.HTML
<p>{{ getName() }}</p>

// component.TS
getName(): string {
    return 'John Doe';
}

如果答案是肯定的,则在每个异步事件(鼠标移动、单击...)上调用函数,并且每次触发事件时,都会运行更改检测并检查所有值是否发生更改。

希望有帮助。

关于node.js - 由于 zone.js,Angular7 在 Google Page Speed 上的性能降低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57458592/

相关文章:

angular - 找不到模块错误无法解析 Angular 7

json - Angular:HttpClient 错误,响应为空 200/201(总是调用 JSON.parse (""))

next.js - 在生产中的 getServerSideProps 函数中使用时,下一个 Auth getSession API 调用失败

angular - 解析器如何与 SSR 和 Angular Universal 配合使用

javascript - 在 express 应用程序中解析 url 哈希片段

file-upload - 如何从 node.js 上传文件

javascript - 在 ngFor 中计数 - Angular 2

node.js - 浏览器返回 403 访问错误,可能由 AWS 引起

javascript - 抛出新的 TypeError ('callback provided to sync glob' )?

node.js - Protractor - 每次运行后都会出现无法读取未定义的属性 'headerPrinter' 的异常