{"id":37100,"date":"2026-06-30T23:17:24","date_gmt":"2026-06-30T20:17:24","guid":{"rendered":"https:\/\/kamil-abzalov.com\/?p=37100"},"modified":"2026-06-30T23:17:27","modified_gmt":"2026-06-30T20:17:27","slug":"angular-progressive-web-apps-pwa","status":"publish","type":"post","link":"https:\/\/kamil-abzalov.com\/en\/tutorials\/angular-progressive-web-apps-pwa\/","title":{"rendered":"Angular. Progressive Web Apps (PWA)"},"content":{"rendered":"<p>[et_pb_section fb_built=&#8221;1&#8243; fullwidth=&#8221;on&#8221; admin_label=&#8221;Header&#8221; _builder_version=&#8221;4.20.0&#8243; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_direction=&#8221;163deg&#8221; background_color_gradient_stops=&#8221;rgba(0,0,0,0.02) 50%|#ffffff 50%&#8221; background_color_gradient_start=&#8221;rgba(0,0,0,0.02)&#8221; background_color_gradient_start_position=&#8221;50%&#8221; background_color_gradient_end=&#8221;#ffffff&#8221; background_color_gradient_end_position=&#8221;0%&#8221; background_image=&#8221;https:\/\/kamil-abzalov.com\/wp-content\/uploads\/2021\/12\/web-dev-03.png&#8221; parallax=&#8221;on&#8221; animation_style=&#8221;fade&#8221; collapsed=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_fullwidth_header title=&#8221;Angular. Progressive Web Apps (PWA)&#8221; content_max_width=&#8221;640px&#8221; _builder_version=&#8221;4.27.7&#8243; title_font=&#8221;Roboto|700|||||||&#8221; title_line_height=&#8221;1.5em&#8221; content_font=&#8221;Roboto||||||||&#8221; content_font_size=&#8221;16px&#8221; content_line_height=&#8221;2em&#8221; subhead_font=&#8221;|700||on|||||&#8221; subhead_font_size=&#8221;14px&#8221; subhead_letter_spacing=&#8221;2px&#8221; subhead_line_height=&#8221;2em&#8221; background_color=&#8221;rgba(0,0,0,0)&#8221; custom_button_one=&#8221;on&#8221; button_one_text_size=&#8221;14px&#8221; button_one_text_color=&#8221;#ffffff&#8221; button_one_bg_color=&#8221;#0054ff&#8221; button_one_border_width=&#8221;14px&#8221; button_one_border_color=&#8221;rgba(0,0,0,0)&#8221; button_one_border_radius=&#8221;0px&#8221; button_one_letter_spacing=&#8221;2px&#8221; button_one_font=&#8221;|600||on|||||&#8221; button_one_icon=&#8221;&#x39;||divi||400&#8243; button_one_on_hover=&#8221;off&#8221; custom_button_two=&#8221;on&#8221; button_two_text_size=&#8221;14px&#8221; button_two_text_color=&#8221;#0054ff&#8221; button_two_bg_color=&#8221;rgba(255,255,255,0)&#8221; button_two_border_width=&#8221;12px&#8221; button_two_border_color=&#8221;rgba(0,0,0,0)&#8221; button_two_border_radius=&#8221;0px&#8221; button_two_letter_spacing=&#8221;2px&#8221; button_two_font=&#8221;|600||on|||||&#8221; button_two_icon=&#8221;&#x39;||divi||400&#8243; button_two_on_hover=&#8221;off&#8221; background_layout=&#8221;light&#8221; custom_margin=&#8221;|||&#8221; custom_padding=&#8221;6vw||6vw||false|false&#8221; animation_style=&#8221;zoom&#8221; animation_intensity_zoom=&#8221;-5%&#8221; title_font_size_tablet=&#8221;&#8221; title_font_size_phone=&#8221;25px&#8221; title_font_size_last_edited=&#8221;on|desktop&#8221; box_shadow_style_button_two=&#8221;preset1&#8243; box_shadow_vertical_button_two=&#8221;0px&#8221; box_shadow_blur_button_two=&#8221;0px&#8221; box_shadow_spread_button_two=&#8221;2px&#8221; box_shadow_color_button_two=&#8221;#0054ff&#8221; button_one_letter_spacing_hover=&#8221;2px&#8221; button_two_letter_spacing_hover=&#8221;2px&#8221; global_colors_info=&#8221;{}&#8221; button_one_text_size__hover_enabled=&#8221;off&#8221; button_two_text_size__hover_enabled=&#8221;off&#8221; button_one_text_color__hover_enabled=&#8221;off&#8221; button_two_text_color__hover_enabled=&#8221;off&#8221; button_one_border_width__hover_enabled=&#8221;off&#8221; button_two_border_width__hover_enabled=&#8221;off&#8221; button_one_border_color__hover_enabled=&#8221;off&#8221; button_two_border_color__hover_enabled=&#8221;off&#8221; button_one_border_radius__hover_enabled=&#8221;off&#8221; button_two_border_radius__hover_enabled=&#8221;off&#8221; button_one_letter_spacing__hover_enabled=&#8221;on&#8221; button_one_letter_spacing__hover=&#8221;2px&#8221; button_two_letter_spacing__hover_enabled=&#8221;on&#8221; button_two_letter_spacing__hover=&#8221;2px&#8221; button_one_bg_color__hover_enabled=&#8221;off&#8221; button_two_bg_color__hover_enabled=&#8221;off&#8221;][\/et_pb_fullwidth_header][\/et_pb_section][et_pb_section fb_built=&#8221;1&#8243; _builder_version=&#8221;4.21.2&#8243; _module_preset=&#8221;default&#8221; collapsed=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row _builder_version=&#8221;4.21.2&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.21.2&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_dcsbcm_divi_breadcrumbs_module homebreadcrumbtext=&#8221;Home&#8221; hide_currentbreadcrumb=&#8221;off&#8221; _builder_version=&#8221;4.27.7&#8243; fontsbreadcrumbs_font_size_tablet=&#8221;51&#8243; fontsbreadcrumbs_line_height_tablet=&#8221;2&#8243; fontsseperator_font_size_tablet=&#8221;51&#8243; fontsseperator_line_height_tablet=&#8221;2&#8243; fontsbreadcrumblinks_font_size_tablet=&#8221;51&#8243; fontsbreadcrumblinks_line_height_tablet=&#8221;2&#8243; z_index_tablet=&#8221;500&#8243; fontsbreadcrumbs_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; fontsbreadcrumbs_text_shadow_vertical_length_tablet=&#8221;0px&#8221; fontsbreadcrumbs_text_shadow_blur_strength_tablet=&#8221;1px&#8221; fontsseperator_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; fontsseperator_text_shadow_vertical_length_tablet=&#8221;0px&#8221; fontsseperator_text_shadow_blur_strength_tablet=&#8221;1px&#8221; fontsbreadcrumblinks_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; fontsbreadcrumblinks_text_shadow_vertical_length_tablet=&#8221;0px&#8221; fontsbreadcrumblinks_text_shadow_blur_strength_tablet=&#8221;1px&#8221; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_dcsbcm_divi_breadcrumbs_module][et_pb_text _builder_version=&#8221;4.27.7&#8243; z_index_tablet=&#8221;500&#8243; text_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; text_text_shadow_vertical_length_tablet=&#8221;0px&#8221; text_text_shadow_blur_strength_tablet=&#8221;1px&#8221; link_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; link_text_shadow_vertical_length_tablet=&#8221;0px&#8221; link_text_shadow_blur_strength_tablet=&#8221;1px&#8221; ul_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; ul_text_shadow_vertical_length_tablet=&#8221;0px&#8221; ul_text_shadow_blur_strength_tablet=&#8221;1px&#8221; ol_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; ol_text_shadow_vertical_length_tablet=&#8221;0px&#8221; ol_text_shadow_blur_strength_tablet=&#8221;1px&#8221; quote_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; quote_text_shadow_vertical_length_tablet=&#8221;0px&#8221; quote_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_2_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_2_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_2_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_3_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_3_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_3_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_4_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_4_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_4_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_5_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_5_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_5_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_6_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_6_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_6_text_shadow_blur_strength_tablet=&#8221;1px&#8221; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; global_colors_info=&#8221;{}&#8221;]Progressive Web Apps (PWAs) are one of Angular&#8217;s most powerful built-in features. With the help of the Angular Service Worker, you can transform a regular Single Page Application (SPA) into a fast, installable, offline-capable web application that automatically updates when a new version is deployed.<\/p>\n<p>In this tutorial, you&#8217;ll learn how to build a Progressive Web App in Angular, configure the Service Worker, cache HTTP requests, and implement automatic update detection.[\/et_pb_text][et_pb_video src=&#8221;https:\/\/youtu.be\/qtFTReQM2Uc&#8221; disabled_on=&#8221;off|off|off&#8221; _builder_version=&#8221;4.27.7&#8243; hover_enabled=&#8221;0&#8243; global_colors_info=&#8221;{}&#8221; sticky_enabled=&#8221;0&#8243;][\/et_pb_video][et_pb_text _builder_version=&#8221;4.27.7&#8243; z_index_tablet=&#8221;500&#8243; text_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; text_text_shadow_vertical_length_tablet=&#8221;0px&#8221; text_text_shadow_blur_strength_tablet=&#8221;1px&#8221; link_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; link_text_shadow_vertical_length_tablet=&#8221;0px&#8221; link_text_shadow_blur_strength_tablet=&#8221;1px&#8221; ul_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; ul_text_shadow_vertical_length_tablet=&#8221;0px&#8221; ul_text_shadow_blur_strength_tablet=&#8221;1px&#8221; ol_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; ol_text_shadow_vertical_length_tablet=&#8221;0px&#8221; ol_text_shadow_blur_strength_tablet=&#8221;1px&#8221; quote_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; quote_text_shadow_vertical_length_tablet=&#8221;0px&#8221; quote_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_2_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_2_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_2_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_3_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_3_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_3_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_4_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_4_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_4_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_5_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_5_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_5_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_6_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_6_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_6_text_shadow_blur_strength_tablet=&#8221;1px&#8221; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<h2>What is a Progressive Web App (PWA)?<\/h2>\n<p>A Progressive Web App (PWA) is a web application that delivers a user experience similar to a native mobile app.<\/p>\n<p>Some of the main benefits of a PWA include:<\/p>\n<ul>\n<li>Offline support<\/li>\n<li>Faster loading times<\/li>\n<li>Resource caching<\/li>\n<li>Installable on desktop and mobile devices<\/li>\n<li>Automatic updates<\/li>\n<li>Push notification support<\/li>\n<\/ul>\n<p>At the heart of every PWA is the Service Worker<\/p>\n<p>[\/et_pb_text][et_pb_text _builder_version=&#8221;4.27.7&#8243; z_index_tablet=&#8221;500&#8243; text_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; text_text_shadow_vertical_length_tablet=&#8221;0px&#8221; text_text_shadow_blur_strength_tablet=&#8221;1px&#8221; link_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; link_text_shadow_vertical_length_tablet=&#8221;0px&#8221; link_text_shadow_blur_strength_tablet=&#8221;1px&#8221; ul_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; ul_text_shadow_vertical_length_tablet=&#8221;0px&#8221; ul_text_shadow_blur_strength_tablet=&#8221;1px&#8221; ol_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; ol_text_shadow_vertical_length_tablet=&#8221;0px&#8221; ol_text_shadow_blur_strength_tablet=&#8221;1px&#8221; quote_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; quote_text_shadow_vertical_length_tablet=&#8221;0px&#8221; quote_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_2_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_2_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_2_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_3_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_3_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_3_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_4_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_4_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_4_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_5_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_5_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_5_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_6_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_6_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_6_text_shadow_blur_strength_tablet=&#8221;1px&#8221; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<h2>Configuring ngsw-config.json<\/h2>\n<p>The behavior of Angular&#8217;s Service Worker is defined inside the ngsw-config.json file (see the code below).<\/p>\n<p>The assetGroups section defines which static resources should be cached.<\/p>\n<p>In this example, Angular caches:<\/p>\n<ul>\n<li>index.html<\/li>\n<li>manifest.webmanifest<\/li>\n<li>CSS files<\/li>\n<li>JavaScript bundles<\/li>\n<li>favicon<\/li>\n<\/ul>\n<p>After the initial visit, these files are served directly from the cache, resulting in significantly faster page loads.<\/p>\n<p>[\/et_pb_text][et_pb_text _builder_version=&#8221;4.27.7&#8243; z_index_tablet=&#8221;500&#8243; text_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; text_text_shadow_vertical_length_tablet=&#8221;0px&#8221; text_text_shadow_blur_strength_tablet=&#8221;1px&#8221; link_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; link_text_shadow_vertical_length_tablet=&#8221;0px&#8221; link_text_shadow_blur_strength_tablet=&#8221;1px&#8221; ul_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; ul_text_shadow_vertical_length_tablet=&#8221;0px&#8221; ul_text_shadow_blur_strength_tablet=&#8221;1px&#8221; ol_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; ol_text_shadow_vertical_length_tablet=&#8221;0px&#8221; ol_text_shadow_blur_strength_tablet=&#8221;1px&#8221; quote_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; quote_text_shadow_vertical_length_tablet=&#8221;0px&#8221; quote_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_2_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_2_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_2_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_3_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_3_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_3_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_4_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_4_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_4_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_5_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_5_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_5_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_6_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_6_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_6_text_shadow_blur_strength_tablet=&#8221;1px&#8221; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<h2>Caching HTTP API Requests<\/h2>\n<p>Angular Service Worker can cache more than just application assets\u2014it can also cache HTTP API responses.<\/p>\n<p>This is done using the dataGroups section.<\/p>\n<p>[\/et_pb_text][et_pb_text _builder_version=&#8221;4.27.7&#8243; z_index_tablet=&#8221;500&#8243; text_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; text_text_shadow_vertical_length_tablet=&#8221;0px&#8221; text_text_shadow_blur_strength_tablet=&#8221;1px&#8221; link_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; link_text_shadow_vertical_length_tablet=&#8221;0px&#8221; link_text_shadow_blur_strength_tablet=&#8221;1px&#8221; ul_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; ul_text_shadow_vertical_length_tablet=&#8221;0px&#8221; ul_text_shadow_blur_strength_tablet=&#8221;1px&#8221; ol_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; ol_text_shadow_vertical_length_tablet=&#8221;0px&#8221; ol_text_shadow_blur_strength_tablet=&#8221;1px&#8221; quote_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; quote_text_shadow_vertical_length_tablet=&#8221;0px&#8221; quote_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_2_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_2_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_2_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_3_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_3_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_3_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_4_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_4_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_4_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_5_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_5_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_5_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_6_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_6_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_6_text_shadow_blur_strength_tablet=&#8221;1px&#8221; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<h2>Detecting Application Updates<\/h2>\n<p>One of the biggest advantages of PWAs is automatic application updates.<\/p>\n<p>Angular provides the SwUpdate service for this purpose.<\/p>\n<p>[\/et_pb_text][et_pb_text _builder_version=&#8221;4.27.7&#8243; z_index_tablet=&#8221;500&#8243; text_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; text_text_shadow_vertical_length_tablet=&#8221;0px&#8221; text_text_shadow_blur_strength_tablet=&#8221;1px&#8221; link_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; link_text_shadow_vertical_length_tablet=&#8221;0px&#8221; link_text_shadow_blur_strength_tablet=&#8221;1px&#8221; ul_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; ul_text_shadow_vertical_length_tablet=&#8221;0px&#8221; ul_text_shadow_blur_strength_tablet=&#8221;1px&#8221; ol_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; ol_text_shadow_vertical_length_tablet=&#8221;0px&#8221; ol_text_shadow_blur_strength_tablet=&#8221;1px&#8221; quote_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; quote_text_shadow_vertical_length_tablet=&#8221;0px&#8221; quote_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_2_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_2_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_2_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_3_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_3_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_3_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_4_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_4_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_4_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_5_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_5_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_5_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_6_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_6_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_6_text_shadow_blur_strength_tablet=&#8221;1px&#8221; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<h2>Testing Your PWA with Lighthouse<\/h2>\n<p>Once your PWA is configured, it&#8217;s a good idea to analyze it using Lighthouse in Chrome DevTools.<\/p>\n<p>Lighthouse evaluates several important aspects of your application, including:<\/p>\n<ul>\n<li>Performance<\/li>\n<li>Accessibility<\/li>\n<li>Best Practices<\/li>\n<li>SEO<\/li>\n<li>Progressive Web App compliance<\/li>\n<li>Service Worker configuration<\/li>\n<li>Web App Manifest<\/li>\n<li>Installability<\/li>\n<\/ul>\n<p>A properly configured Angular PWA should achieve an excellent Lighthouse score.<\/p>\n<p>[\/et_pb_text][et_pb_text _builder_version=&#8221;4.27.7&#8243; z_index_tablet=&#8221;500&#8243; text_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; text_text_shadow_vertical_length_tablet=&#8221;0px&#8221; text_text_shadow_blur_strength_tablet=&#8221;1px&#8221; link_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; link_text_shadow_vertical_length_tablet=&#8221;0px&#8221; link_text_shadow_blur_strength_tablet=&#8221;1px&#8221; ul_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; ul_text_shadow_vertical_length_tablet=&#8221;0px&#8221; ul_text_shadow_blur_strength_tablet=&#8221;1px&#8221; ol_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; ol_text_shadow_vertical_length_tablet=&#8221;0px&#8221; ol_text_shadow_blur_strength_tablet=&#8221;1px&#8221; quote_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; quote_text_shadow_vertical_length_tablet=&#8221;0px&#8221; quote_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_2_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_2_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_2_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_3_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_3_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_3_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_4_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_4_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_4_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_5_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_5_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_5_text_shadow_blur_strength_tablet=&#8221;1px&#8221; header_6_text_shadow_horizontal_length_tablet=&#8221;0px&#8221; header_6_text_shadow_vertical_length_tablet=&#8221;0px&#8221; header_6_text_shadow_blur_strength_tablet=&#8221;1px&#8221; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p>Angular provides almost everything you need to build a modern Progressive Web App out of the box. By configuring the Service Worker and the ngsw-config.json file, your application gains several powerful features:<\/p>\n<ul>\n<li>Offline support<\/li>\n<li>HTML, CSS, and JavaScript caching<\/li>\n<li>HTTP API response caching<\/li>\n<li>Automatic application updates<\/li>\n<li>Faster loading times<\/li>\n<li>Installability on desktop and mobile devices<\/li>\n<li>Better Lighthouse scores and improved user experience<\/li>\n<\/ul>\n<p>If you&#8217;re building a modern Angular application, adding PWA support is one of the easiest ways to improve performance, reliability, and the overall user experience\u2014all without relying on third-party libraries.<\/p>\n<p>[\/et_pb_text][et_pb_dmb_code_snippet title=&#8221;ngsw-config.json&#8221; code=&#8221;ewogICIkc2NoZW1hIjogIi4vbm9kZV9tb2R1bGVzL0Bhbmd1bGFyL3NlcnZpY2Utd29ya2VyL2NvbmZpZy9zY2hlbWEuanNvbiIsCiAgImluZGV4IjogIi9pbmRleC5odG1sIiwKICAiYXNzZXRHcm91cHMiOiBbCiAgICB7CiAgICAgICJuYW1lIjogImFwcCIsCiAgICAgICJpbnN0YWxsTW9kZSI6ICJwcmVmZXRjaCIsCiAgICAgICJyZXNvdXJjZXMiOiB7CiAgICAgICAgImZpbGVzIjogWwogICAgICAgICAgIi9mYXZpY29uLmljbyIsCiAgICAgICAgICAiL2luZGV4LmNzci5odG1sIiwKICAgICAgICAgICIvaW5kZXguaHRtbCIsCiAgICAgICAgICAiL21hbmlmZXN0LndlYm1hbmlmZXN0IiwKICAgICAgICAgICIvKi5jc3MiLAogICAgICAgICAgIi8qLmpzIgogICAgICAgIF0KICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIm5hbWUiOiAiYXNzZXRzIiwKICAgICAgImluc3RhbGxNb2RlIjogImxhenkiLAogICAgICAidXBkYXRlTW9kZSI6ICJwcmVmZXRjaCIsCiAgICAgICJyZXNvdXJjZXMiOiB7CiAgICAgICAgImZpbGVzIjogWyIvKiovKi4oc3ZnfGN1cnxqcGd8anBlZ3xwbmd8YXBuZ3x3ZWJwfGF2aWZ8Z2lmfG90Znx0dGZ8d29mZnx3b2ZmMikiXQogICAgICB9CiAgICB9CiAgXSwKICAiZGF0YUdyb3VwcyI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAidXNlcnMtYXBpIiwKICAgICAgInVybHMiOiBbImh0dHBzOi8vanNvbnBsYWNlaG9sZGVyLnR5cGljb2RlLmNvbS91c2Vycy8iXSwKICAgICAgImNhY2hlQ29uZmlnIjogewogICAgICAgICJzdHJhdGVneSI6ICJmcmVzaG5lc3MiLAogICAgICAgICJtYXhTaXplIjogMTAwLAogICAgICAgICJtYXhBZ2UiOiAiMWgiLAogICAgICAgICJ0aW1lb3V0IjogIjNzIgogICAgICB9CiAgICB9CiAgXQp9Cg==&#8221; copy_button=&#8221;on&#8221; copy_button_tooltip=&#8221;Copy code&#8221; _builder_version=&#8221;4.27.7&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_dmb_code_snippet][et_pb_dmb_code_snippet title=&#8221;app.ts&#8221; code=&#8221;aW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIFNpZ25hbCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7CmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7CmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnOwppbXBvcnQgeyBTd1VwZGF0ZSwgVmVyc2lvbkV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvc2VydmljZS13b3JrZXInOwoKQENvbXBvbmVudCh7CiAgc2VsZWN0b3I6ICdhcHAtcm9vdCcsCiAgaW1wb3J0czogW10sCiAgdGVtcGxhdGVVcmw6ICcuL2FwcC5odG1sJywKICBzdHlsZVVybDogJy4vYXBwLmNzcycsCn0pCmV4cG9ydCBjbGFzcyBBcHAgewogIHByb3RlY3RlZCB1c2VyczogU2lnbmFsPGFueT4gPSBzaWduYWwoW10pOwoKICBwcml2YXRlIGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7CgogIGNvbnN0cnVjdG9yKHByaXZhdGUgc3dVcGRhdGU6IFN3VXBkYXRlKSB7CiAgICB0aGlzLnVzZXJzID0gdG9TaWduYWwodGhpcy5odHRwLmdldCgnaHR0cHM6Ly9qc29ucGxhY2Vob2xkZXIudHlwaWNvZGUuY29tL3VzZXJzLycpKTsKICAgIGlmIChzd1VwZGF0ZS5pc0VuYWJsZWQpIHsKICAgICAgdGhpcy5zd1VwZGF0ZS52ZXJzaW9uVXBkYXRlcy5zdWJzY3JpYmUoKGV2ZW50OiBWZXJzaW9uRXZlbnQpID0+IHsKICAgICAgICBjb25zb2xlLmxvZygnRXZlbnQgdHlwZScsIGV2ZW50LnR5cGUpOwogICAgICB9KTsKCiAgICAgIHRoaXMuc3dVcGRhdGUuY2hlY2tGb3JVcGRhdGUoKS50aGVuKChoYXNVcGRhdGUpID0+IHsKICAgICAgICBpZiAoaGFzVXBkYXRlKSB7CiAgICAgICAgICBjb25zb2xlLmxvZygnTmV3IHZlcnNpb24gYXZhaWxhYmxlLCBjbGljayBvayB0byByZWZyZXNoJyk7CiAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9Cn0K&#8221; copy_button=&#8221;on&#8221; copy_button_tooltip=&#8221;Copy code&#8221; _builder_version=&#8221;4.27.7&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_dmb_code_snippet][et_pb_comments _builder_version=&#8221;4.21.2&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_comments][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Progressive Web Apps (PWAs) are one of Angular&#8217;s most powerful built-in features. With the help of the Angular Service Worker, you can transform a regular Single Page Application (SPA) into a fast, installable, offline-capable web application that automatically updates when a new version is deployed. In this tutorial, you&#8217;ll learn how to build a Progressive [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[256,219],"tags":[],"class_list":["post-37100","post","type-post","status-publish","format-standard","hentry","category-javascript","category-tutorials"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Angular. Progressive Web Apps (PWA) - Kamil Abzalov&#039;s site<\/title>\n<meta name=\"description\" content=\"Learn how to build a Progressive Web App (PWA) in Angular using Service Worker. Configure offline support, API caching, automatic updates, and improve Lighthouse scores.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kamil-abzalov.com\/en\/tutorials\/angular-progressive-web-apps-pwa\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular. Progressive Web Apps (PWA)\" \/>\n<meta property=\"og:description\" content=\"Learn how to build a Progressive Web App (PWA) in Angular using Service Worker. Configure offline support, API caching, automatic updates, and improve Lighthouse scores.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kamil-abzalov.com\/en\/tutorials\/angular-progressive-web-apps-pwa\/\" \/>\n<meta property=\"og:site_name\" content=\"\u0441\u0430\u0439\u0442 \u041a\u0430\u043c\u0438\u043b\u044f \u0410\u0431\u0437\u0430\u043b\u043e\u0432\u0430\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/kamabzalov\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-30T20:17:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-30T20:17:27+00:00\" \/>\n<meta name=\"author\" content=\"Kamil&#039; Abzalov\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@kamabzalov\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kamil&#039; Abzalov\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/kamil-abzalov.com\\\/en\\\/tutorials\\\/angular-progressive-web-apps-pwa\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/kamil-abzalov.com\\\/en\\\/tutorials\\\/angular-progressive-web-apps-pwa\\\/\"},\"author\":{\"name\":\"Kamil' Abzalov\",\"@id\":\"https:\\\/\\\/kamil-abzalov.com\\\/#\\\/schema\\\/person\\\/9c53360f21b83306ba40c2231573c600\"},\"headline\":\"Angular. Progressive Web Apps (PWA)\",\"datePublished\":\"2026-06-30T20:17:24+00:00\",\"dateModified\":\"2026-06-30T20:17:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/kamil-abzalov.com\\\/en\\\/tutorials\\\/angular-progressive-web-apps-pwa\\\/\"},\"wordCount\":3192,\"commentCount\":0,\"articleSection\":[\"JavaScript\",\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/kamil-abzalov.com\\\/en\\\/tutorials\\\/angular-progressive-web-apps-pwa\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/kamil-abzalov.com\\\/en\\\/tutorials\\\/angular-progressive-web-apps-pwa\\\/\",\"url\":\"https:\\\/\\\/kamil-abzalov.com\\\/en\\\/tutorials\\\/angular-progressive-web-apps-pwa\\\/\",\"name\":\"Angular. Progressive Web Apps (PWA) - Kamil Abzalov's site\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/kamil-abzalov.com\\\/#website\"},\"datePublished\":\"2026-06-30T20:17:24+00:00\",\"dateModified\":\"2026-06-30T20:17:27+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/kamil-abzalov.com\\\/#\\\/schema\\\/person\\\/9c53360f21b83306ba40c2231573c600\"},\"description\":\"Learn how to build a Progressive Web App (PWA) in Angular using Service Worker. Configure offline support, API caching, automatic updates, and improve Lighthouse scores.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/kamil-abzalov.com\\\/en\\\/tutorials\\\/angular-progressive-web-apps-pwa\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/kamil-abzalov.com\\\/en\\\/tutorials\\\/angular-progressive-web-apps-pwa\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/kamil-abzalov.com\\\/en\\\/tutorials\\\/angular-progressive-web-apps-pwa\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\",\"item\":\"https:\\\/\\\/kamil-abzalov.com\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular. Progressive Web Apps (PWA)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/kamil-abzalov.com\\\/#website\",\"url\":\"https:\\\/\\\/kamil-abzalov.com\\\/\",\"name\":\"\u0441\u0430\u0439\u0442 \u041a\u0430\u043c\u0438\u043b\u044f \u0410\u0431\u0437\u0430\u043b\u043e\u0432\u0430\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/kamil-abzalov.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/kamil-abzalov.com\\\/#\\\/schema\\\/person\\\/9c53360f21b83306ba40c2231573c600\",\"name\":\"Kamil' Abzalov\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3ad2daebcb3a4d03f8573b49054a003cd26a151ecc58ccfccc75b823131d1ead?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3ad2daebcb3a4d03f8573b49054a003cd26a151ecc58ccfccc75b823131d1ead?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3ad2daebcb3a4d03f8573b49054a003cd26a151ecc58ccfccc75b823131d1ead?s=96&d=mm&r=g\",\"caption\":\"Kamil' Abzalov\"},\"sameAs\":[\"https:\\\/\\\/kamil-abzalov.com\\\/\",\"https:\\\/\\\/www.facebook.com\\\/kamabzalov\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/kamabzalov\",\"https:\\\/\\\/x.com\\\/kamabzalov\",\"https:\\\/\\\/www.youtube.com\\\/user\\\/kamabzalov\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Angular. Progressive Web Apps (PWA) - Kamil Abzalov's site","description":"Learn how to build a Progressive Web App (PWA) in Angular using Service Worker. Configure offline support, API caching, automatic updates, and improve Lighthouse scores.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kamil-abzalov.com\/en\/tutorials\/angular-progressive-web-apps-pwa\/","og_locale":"en_US","og_type":"article","og_title":"Angular. Progressive Web Apps (PWA)","og_description":"Learn how to build a Progressive Web App (PWA) in Angular using Service Worker. Configure offline support, API caching, automatic updates, and improve Lighthouse scores.","og_url":"https:\/\/kamil-abzalov.com\/en\/tutorials\/angular-progressive-web-apps-pwa\/","og_site_name":"\u0441\u0430\u0439\u0442 \u041a\u0430\u043c\u0438\u043b\u044f \u0410\u0431\u0437\u0430\u043b\u043e\u0432\u0430","article_author":"https:\/\/www.facebook.com\/kamabzalov","article_published_time":"2026-06-30T20:17:24+00:00","article_modified_time":"2026-06-30T20:17:27+00:00","author":"Kamil' Abzalov","twitter_card":"summary_large_image","twitter_creator":"@kamabzalov","twitter_misc":{"Written by":"Kamil' Abzalov","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kamil-abzalov.com\/en\/tutorials\/angular-progressive-web-apps-pwa\/#article","isPartOf":{"@id":"https:\/\/kamil-abzalov.com\/en\/tutorials\/angular-progressive-web-apps-pwa\/"},"author":{"name":"Kamil' Abzalov","@id":"https:\/\/kamil-abzalov.com\/#\/schema\/person\/9c53360f21b83306ba40c2231573c600"},"headline":"Angular. Progressive Web Apps (PWA)","datePublished":"2026-06-30T20:17:24+00:00","dateModified":"2026-06-30T20:17:27+00:00","mainEntityOfPage":{"@id":"https:\/\/kamil-abzalov.com\/en\/tutorials\/angular-progressive-web-apps-pwa\/"},"wordCount":3192,"commentCount":0,"articleSection":["JavaScript","Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kamil-abzalov.com\/en\/tutorials\/angular-progressive-web-apps-pwa\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kamil-abzalov.com\/en\/tutorials\/angular-progressive-web-apps-pwa\/","url":"https:\/\/kamil-abzalov.com\/en\/tutorials\/angular-progressive-web-apps-pwa\/","name":"Angular. Progressive Web Apps (PWA) - Kamil Abzalov's site","isPartOf":{"@id":"https:\/\/kamil-abzalov.com\/#website"},"datePublished":"2026-06-30T20:17:24+00:00","dateModified":"2026-06-30T20:17:27+00:00","author":{"@id":"https:\/\/kamil-abzalov.com\/#\/schema\/person\/9c53360f21b83306ba40c2231573c600"},"description":"Learn how to build a Progressive Web App (PWA) in Angular using Service Worker. Configure offline support, API caching, automatic updates, and improve Lighthouse scores.","breadcrumb":{"@id":"https:\/\/kamil-abzalov.com\/en\/tutorials\/angular-progressive-web-apps-pwa\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kamil-abzalov.com\/en\/tutorials\/angular-progressive-web-apps-pwa\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/kamil-abzalov.com\/en\/tutorials\/angular-progressive-web-apps-pwa\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/kamil-abzalov.com\/en\/"},{"@type":"ListItem","position":2,"name":"Angular. Progressive Web Apps (PWA)"}]},{"@type":"WebSite","@id":"https:\/\/kamil-abzalov.com\/#website","url":"https:\/\/kamil-abzalov.com\/","name":"\u0441\u0430\u0439\u0442 \u041a\u0430\u043c\u0438\u043b\u044f \u0410\u0431\u0437\u0430\u043b\u043e\u0432\u0430","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kamil-abzalov.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/kamil-abzalov.com\/#\/schema\/person\/9c53360f21b83306ba40c2231573c600","name":"Kamil' Abzalov","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/3ad2daebcb3a4d03f8573b49054a003cd26a151ecc58ccfccc75b823131d1ead?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/3ad2daebcb3a4d03f8573b49054a003cd26a151ecc58ccfccc75b823131d1ead?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3ad2daebcb3a4d03f8573b49054a003cd26a151ecc58ccfccc75b823131d1ead?s=96&d=mm&r=g","caption":"Kamil' Abzalov"},"sameAs":["https:\/\/kamil-abzalov.com\/","https:\/\/www.facebook.com\/kamabzalov","https:\/\/www.linkedin.com\/in\/kamabzalov","https:\/\/x.com\/kamabzalov","https:\/\/www.youtube.com\/user\/kamabzalov"]}]}},"_links":{"self":[{"href":"https:\/\/kamil-abzalov.com\/en\/wp-json\/wp\/v2\/posts\/37100","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kamil-abzalov.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kamil-abzalov.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kamil-abzalov.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kamil-abzalov.com\/en\/wp-json\/wp\/v2\/comments?post=37100"}],"version-history":[{"count":11,"href":"https:\/\/kamil-abzalov.com\/en\/wp-json\/wp\/v2\/posts\/37100\/revisions"}],"predecessor-version":[{"id":37129,"href":"https:\/\/kamil-abzalov.com\/en\/wp-json\/wp\/v2\/posts\/37100\/revisions\/37129"}],"wp:attachment":[{"href":"https:\/\/kamil-abzalov.com\/en\/wp-json\/wp\/v2\/media?parent=37100"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kamil-abzalov.com\/en\/wp-json\/wp\/v2\/categories?post=37100"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kamil-abzalov.com\/en\/wp-json\/wp\/v2\/tags?post=37100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}