This document explains how to enable Angular service worker support in projects that you created with the Angular CLI. It then uses an example to show you a service worker in action, demonstrating loading and basic caching.
A basic understanding of the information in Introduction to Angular service workers.
To set up the Angular service worker in your project, use the CLI command ng add @angular/pwa
. It takes care of configuring your application to use service workers by adding the @angular/service-worker
package along with setting up the necessary support files.
ng add @angular/pwa --project *project-name*
The preceding command completes the following actions:
@angular/service-worker
package to your project.index.html
file: manifest.webmanifest
file.theme-color
.ngsw-config.json
, which specifies the caching behaviors and other settings.Now, build the project:
ng build
The CLI project is now set up to use the Angular service worker.
This section demonstrates a service worker in action, using an example application.
http-server
Because ng serve
does not work with service workers, you must use a separate HTTP server to test your project locally. Use any HTTP server. The following example uses the http-server package from npm. To reduce the possibility of conflicts and avoid serving stale content, test on a dedicated port and disable caching.
To serve the directory containing your web files with http-server
, run the following command:
http-server -p 8080 -c-1 dist/<project-name>
With the server running, point your browser at http://localhost:8080/. Your application should load normally.
Tip: When testing Angular service workers, it's a good idea to use an incognito or private window in your browser to ensure the service worker doesn't end up reading from a previous leftover state, which can cause unexpected behavior.
Note: If you are not using HTTPS, the service worker will only be registered when accessing the application on
localhost
.
To simulate a network issue, disable network interaction for your application.
In Chrome:
Now the application has no access to network interaction.
For applications that do not use the Angular service worker, refreshing now would display Chrome's Internet disconnected page that says "There is no Internet connection".
With the addition of an Angular service worker, the application behavior changes. On a refresh, the page loads normally.
Look at the Network tab to verify that the service worker is active.
Notice that under the "Size" column, the requests state is (ServiceWorker)
. This means that the resources are not being loaded from the network. Instead, they are being loaded from the service worker's cache.
Notice that all of the files the browser needs to render this application are cached. The ngsw-config.json
boilerplate configuration is set up to cache the specific resources used by the CLI:
index.html
.favicon.ico
.assets
.outputPath
(by default ./dist/<project-name>/
) or resourcesOutputPath
. See ng build
for more information about these options.Pay attention to two key points:
The generated
ngsw-config.json
includes a limited list of cacheable fonts and images extensions. In some cases, you might want to modify the glob pattern to suit your needs.If
resourcesOutputPath
orassets
paths are modified after the generation of configuration file, you need to change the paths manually inngsw-config.json
.
Now that you've seen how service workers cache your application, the next step is understanding how updates work. Make a change to the application, and watch the service worker install the update:
If you're testing in an incognito window, open a second blank tab. This keeps the incognito and the cache state alive during your test.
Close the application tab, but not the window. This should also close the Developer Tools.
Shut down http-server
.
Open src/app/app.component.html
for editing.
Change the text Welcome to {{title}}!
to Bienvenue à {{title}}!
.
Build and run the server again:
ng build http-server -p 8080 -c-1 dist/<project-name>
Now look at how the browser and service worker handle the updated application.
Open http://localhost:8080 again in the same window. What happens?
What went wrong? Nothing, actually. The Angular service worker is doing its job and serving the version of the application that it has installed, even though there is an update available. In the interest of speed, the service worker doesn't wait to check for updates before it serves the application that it has cached.
Look at the http-server
logs to see the service worker requesting /ngsw.json
. This is how the service worker checks for updates.
Refresh the page.
The service worker installed the updated version of your application in the background, and the next time the page is loaded or reloaded, the service worker switches to the latest version.
You might also be interested in the following:
© 2010–2021 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://v12.angular.io/guide/service-worker-getting-started