#angular #caching #angular-universal
#angular #кэширование #angular-универсальный
Вопрос:
Мой сервисный работник не кэширует мои статические ресурсы.
При подключении к сети, использовании Chrome DevTools, похоже, что ServiceWorker работает. Я вижу строки для styles.xxx.css, runtime.xxx.js, polyfills.xxx.js и main.xxx.js с размером, указанным как «от Service Worker». Затем в последующих строках эти же файлы перечислены с размером «из дискового кэша».
На вкладке приложения Chrome DevTools в разделе «Хранилище кэша» у меня есть следующие строки:
ngsw:db:control — http://127.0.0.1:8080
ngsw:xxx:активы: приложение: кэш — http://127.0.0.1:8080
ngsw:xxx:ресурсы: приложение: мета-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 amp;amp; ng run abogado:server amp;amp; npm run
webpack:prerender amp;amp; 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:
В зависимости от используемой версии Angular, это, скорее всего, связано с этой ошибкой:
https://github.com/angular/angular/issues/20360
На этой странице проблемы опубликовано множество обходных путей. Если вы не можете заставить их работать, следующая (очень хорошая) альтернатива — перенести ваше приложение в Angular Universal PWA Starter project.
Последняя альтернатива — использовать Workbox CLI напрямую. Это то, что используется в проекте PWA Starter.
Надеюсь, это полезно.
Комментарии:
1. Я проверяю наличие ServiceWorker в навигаторе в моем файле main.ts. Добавление кода выше. Я все еще просматриваю возможные исправления со страницы проблемы. Однако из-за этой проблемы происходит сбой страницы. И моя страница не вылетает, она просто не может получить доступ к файлам.
2. Хорошо, тогда забудьте о проблеме Angular. Вы пробовали внедрять Workbox? Или думали о переходе на starter kit для PWA? Они БУДУТ работать, если только в вашем приложении Angular что-то не закодировано должным образом.
3. Этот стартовый проект Angular Universal PWA находится в Angular 5. Сейчас я использую Angular 7. Итак, я не уверен. Я также использую предварительную визуализацию, поэтому мне пришлось бы скопировать в новый проект много кода.
4. Я мало что знаю о Workbox CLI, мне трудно поверить, что мне это нужно только для правильной работы ServiceWorker. Я не хочу просто добавлять еще что-то поверх этого черного ящика. Но если до этого дойдет, я это сделаю.
5. Создайте StackBlitz всего вашего проекта или его репозиторий на GitHub. Я посмотрю.