Приложение Angular в настраиваемом URL-адресе с ServiceWorker
Я разрабатываю приложение Angular 10.
Он использует Angular «сервис-воркер» для создания PWA.
Скомпилированное приложение находится в папке "c:\ - website-folder-\ ng-app \ dist". Затем пользователь может получить доступ к приложению по URL-адресу, подобному этому: «https://website.com/ng-app/dist».
Конфигурация ServiceWorker
Angular ServiceWorker настраивается в "app.module":
@NgModule({
imports: [
CommonModule,
BrowserModule,
ServiceWorkerModule.register(
`/ng-app/dist/ngsw-worker.js`,
{
enabled: true,
scope: "/ng-app/"
}
),
...
]
})
export class AppModule {}
Для регистрации задайте путь ServiceWorker.
Составление проекта
Проект Angular скомпилирован с помощью
ng build
команда.
В нем создаем и заполняем папку "dist". Он содержит ng-app.webmanifest и ngsw.json.
файл "ngsw.json"
Файл "ngsw.json" содержит список всех скомпилированных JS и ресурсов, таких как GIF, CSS. Angular ServiceWorker использует этот файл для кэширования ресурсов.
{
"configVersion": 1,
"timestamp": 1613033261333,
"index": "/index.html",
"assetGroups": [
{
"name": "app",
"installMode": "prefetch",
"updateMode": "prefetch",
"cacheQueryOptions": {
"ignoreVary": true
},
"urls": [
"/address-book-editor-address-book-editor-module-es2015.51b00058cbaa9682510e.js",
"/address-book-editor-address-book-editor-module-es5.51b00058cbaa9682510e.js",
"/article-editor-article-editor-module-es2015.e4540348b2495fd50875.js",
"/article-editor-article-editor-module-es5.e4540348b2495fd50875.js",
"/berry-editor-berry-editor-module-es2015.8cc1850fb1455965c490.js",
"/berry-editor-berry-editor-module-es5.8cc1850fb1455965c490.js",
...
],
"patterns": []
},
{
"name": "assets",
"installMode": "lazy",
"updateMode": "prefetch",
"cacheQueryOptions": {
"ignoreVary": true
},
"urls": [
"/assets/components/fontawesome/fonts/fontawesome-webfont.eot",
"/assets/components/fontawesome/fonts/fontawesome-webfont.svg",
"/assets/components/fontawesome/fonts/fontawesome-webfont.ttf",
...
],
"patterns": []
}
],
"dataGroups": [],
"hashTable": {
"/address-book-editor-address-book-editor-module-es2015.51b00058cbaa9682510e.js": "4e6b67457c4b7549f331e6c2cbe3334d13129386",
"/address-book-editor-address-book-editor-module-es5.51b00058cbaa9682510e.js": "886188af27941dad766bcdcb3e2880b790cf32de",
"/article-editor-article-editor-module-es2015.e4540348b2495fd50875.js": "985558c2949d9b34d3cdc9e0b7d556d54508b208",
...
},
"navigationUrls": [
{
"positive": true,
"regex": "^\\/.*$"
},
{
"positive": false,
"regex": "^\\/(?:.+\\/)?[^/]*\\.[^/]*$"
},
{
"positive": false,
"regex": "^\\/(?:.+\\/)?[^/]*__[^/]*$"
},
{
"positive": false,
"regex": "^\\/(?:.+\\/)?[^/]*__[^/]*\\/.*$"
}
]
}
Эта проблема
Как видите, ресурсы ссылаются на ROOT, и Angular ServiceWorker попытается загрузить их с URL-адресом, подобным этому
вместо того
Помощь
Есть ли решение сказать Angular Builder указать правильный URL-путь ?
Я пытаюсь изменить файл "ngsw.json" на правильный путь, и теперь он работает . Но это уловка ...
Спасибо большое
1 ответ
Один из способов изменить пути, которые Angular генерирует при построении, - использовать опцию с CLI
ng build
. В сочетании с этим вы можете до некоторой степени изменять пути, но все равно можете застрять, если вы используете рендеринг на стороне сервера или, например, локали / культуры на стороне сервера. Но для простого развертывания комбинация того и другого должна работать.
Тем не менее, к сожалению, в пути, которые создаются в файле, включается только значение. Это проблема Angular CLI и до сих пор не решена.
Обходной путь - запустить
ngsw-config
команда, предоставляющая ему базовый параметр href в качестве последнего параметра / опции.
Например, вы могли бы сделать следующее:
если твой
--base-href
является
/web/
и ваш
--deploy-url
является
dist/
которые при развертывании приводят к тому, что ваши пути становятся
/web/dist/
поэтому для правильного создания таких путей в
ngsw.json
файл, вам нужно будет запустить следующую команду вручную:
./node_modules/.bin/ngsw-config ./dist/ ./ngsw-config.json "/web/dist/"
Я пошел дальше и использовал npm
post
скрипты (https://michael-kuehnel.de/tooling/2018/03/22/helpers-and-tips-for-npm-run-scripts.html) и настроил мои
package.json
нравится
...
"build:prod": "ng build --prod --base-href=\"/web/\" --deploy-url=\"dist/\"",
"postbuild:prod": "ngsw-config ./dist/ ./ngsw-config.json \"/web/dist/\"",
...
Таким образом
postbuild:prod
всегда бежит за
build:prod
cmd.
Надеюсь, это поможет. Я тоже хочу, чтобы Angular CLI предлагал больше возможностей для настройки путей в развернутых файлах.