Обслуживание статических ресурсов в автономном режиме, политика кэширования в Angular Univeral - PullRequest
6 голосов
/ 06 марта 2019

Мой сервисный работник не кэширует мои статические активы.

Когда онлайн, используя Chrome DevTools, похоже, что ServiceWorker работает. Я вижу строки для styles.xxx.css, runtime.xxx.js, polyfills.xxx.js и main.xxx.js с размером, указанным как «из Service Worker». Затем в более поздних строках эти же файлы будут перечислены с размером как «из дискового кэша». enter image description here

На вкладке Приложение Chrome DevTools в разделе Кэш-хранилище у меня есть следующие строки:

ngsw: db: control - http://127.0.0.1:8080

ngsw: xxx: assets: app: cache - http://127.0.0.1:8080

ngsw: xxx: assets: app: meta - http://127.0.0.1:8080

Нажатие на последние две строки ничего не приводит к разделу «Путь» DevTools.

Файл ngws-worker.js имеет статус «активирован и работает». Это было «Получено 31.12.1969», что странно.

Затем, когда я перехожу в автономный режим, рабочие службы не отображаются. И кэш-память пуста. В последней строке сети указано ngsw.json? Ngsw-cache-bust = xxx Состояние (не удалось) Тип извлечения Инициатор ngsw-worker.js: 2662.

Мои сценарии package.json (которые я скопировал из AngularFirebasePro)

"webpack:prerender": "webpack --config webpack.prerender.config.js",
"build:prerender": "node dist/abogado/prerender.js",
"serve:prerender": "http-server dist/abogado -o",
"build:all": "ng build --prod && ng run abogado:server && npm run 
webpack:prerender && npm run build:prerender"

В angular.json у меня

"server": {
      "builder": "@angular-devkit/build-angular:server",
      "options": {
        "outputPath": "dist/abogado-server",
        "main": "src/main.server.ts",
        "tsConfig": "src/tsconfig.server.json"
      },
      "configurations": {
        "production": {
          "fileReplacements": [
            {
              "replace": "src/environments/environment.ts",
              "with": "src/environments/environment.prod.ts"
            }
          ]
        }
      }
    }

мой файл ngsw-config.json

{
 "index": "/index.html",
 "assetGroups": [{
   "name": "app",
   "installMode": "prefetch",
   "resources": {
     "files": [
       "/index.html"
     ],
     "versionedFiles": [
       "/*.bundle.css",
       "/*.bundle.js",
       "/*.chunk.js"
     ]
  }
 }, {
   "name": "assets",
   "installMode": "lazy",
   "updateMode": "prefetch",
   "resources": {
     "files": [
       "/assets/**"
     ]
   }
 }]

}

Как только я создаю свое приложение, моя папка dist содержит ngsw.json и ngws-worker.js.

Я не знаю NodeJS. Во-первых, я хотел бы знать, возможно ли кэширование статических ресурсов в Angular Universal. Во-вторых, что вы думаете не так с моим кодом? Спасибо:)

РЕДАКТИРОВАТЬ: добавление содержимого файла main.ts.

if (environment.production) {
  enableProdMode();
}

document.addEventListener('DOMContentLoaded', () => {
  platformBrowserDynamic().bootstrapModule(AppModule)
    .then(() => {
      if ('serviceWorker' in navigator) {
        navigator.serviceWorker.register('/ngsw-worker.js') ;
      }
    })
  .catch(err => console.error(err));
});

1 Ответ

3 голосов
/ 15 марта 2019

В зависимости от используемой версии Angular, это, скорее всего, связано с этой ошибкой:

https://github.com/angular/angular/issues/20360

На этой странице проблемы опубликовано много обходных путей. Если вы не можете заставить их работать, следующая (очень хорошая) альтернатива - перенести ваше приложение в Angular Universal PWA Starter project .

Последняя альтернатива - использовать Workbox CLI напрямую. Это то, что используется в начальном проекте PWA.

Надеюсь, это полезно.

...