gitextract_nvjmu4af/ ├── .editorconfig ├── .gitignore ├── LICENSE ├── README.md ├── SUMMARY.md ├── appendix01/ │ ├── 1-lighthouse.md │ ├── 2-lighthouse-score-guide.md │ └── 3-lighthouse-case.md ├── appendix01.md ├── book.json ├── chapter01/ │ ├── 1-how-was-pwa-born.md │ ├── 2-what-is-pwa.md │ ├── 3-what-are-key-techs.md │ ├── 4-how-is-pwa-going.md │ ├── 5-the-future-of-pwa.md │ └── 6-your-first-pwa.md ├── chapter01.md ├── chapter02/ │ ├── 1-what-is-good-ux.md │ ├── 2-design-and-tech.md │ ├── 3-app-shell.md │ ├── 4-app-skeleton.md │ └── 5-responsive-design.md ├── chapter02.md ├── chapter03/ │ ├── 1-promise.md │ ├── 2-async-function.md │ ├── 3-fetch-api.md │ ├── 4-cache-api.md │ └── 5-indexeddb.md ├── chapter03.md ├── chapter04/ │ ├── 1-service-worker-introduction.md │ ├── 2-service-worker-register.md │ ├── 3-service-worker-dive.md │ ├── 4-service-worker-debug.md │ └── code/ │ ├── applicationCacheDemo/ │ │ ├── index.html │ │ └── manifest.appcache │ ├── serviceWorkerCacheDemo/ │ │ ├── data.json │ │ ├── index.css │ │ ├── index.html │ │ ├── index.js │ │ └── sw.js │ ├── serviceWorkerDemo/ │ │ ├── index.html │ │ └── sw.js │ ├── serviceWorkerIndexeddbDemo/ │ │ ├── fruits.json │ │ ├── index.html │ │ └── sw.js │ ├── serviceWorkerLifecycleDemo/ │ │ ├── index.html │ │ └── sw.js │ ├── serviceWorkerScopeDemo/ │ │ ├── a/ │ │ │ └── b/ │ │ │ └── sw.js │ │ └── index.html │ ├── serviceWorkerScopeDemo1/ │ │ ├── a/ │ │ │ ├── a-sw.js │ │ │ └── index.html │ │ ├── b/ │ │ │ └── index.html │ │ └── root-sw.js │ └── serviceWorkerUnregisterDemo/ │ ├── index.html │ └── sw.js ├── chapter04.md ├── chapter05/ │ ├── 1-fetch-event-management.md │ ├── 2-local-storage-management.md │ ├── 3-respond-strategy.md │ ├── 4-precache.md │ └── 5-workbox.md ├── chapter05.md ├── chapter06/ │ ├── 1-manifest-json.md │ ├── 2-credentials-api.md │ ├── 3-notification-api.md │ ├── 4-web-push-api.md │ └── 5-payment-request-api.md ├── chapter06.md ├── chapter07/ │ ├── 1-https.md │ ├── 2-CSP.md │ ├── 3-policy.md │ └── 4-vulnerability.md ├── chapter07.md ├── chapter08/ │ ├── 1-loading-performance.md │ └── 2-rendering-performance.md ├── chapter08.md ├── chapter09/ │ ├── 1-search-engine-index.md │ ├── 2-pwa-and-amp-and-mip.md │ ├── 3-whole-site-amp-and-mip.md │ └── 4-preload-pwa.md ├── chapter09.md ├── ci.yml ├── docs/ │ ├── LICENSE │ ├── appendix01/ │ │ ├── 1-lighthouse.html │ │ ├── 2-lighthouse-score-guide.html │ │ └── 3-lighthouse-case.html │ ├── appendix01.html │ ├── chapter01/ │ │ ├── 1-how-was-pwa-born.html │ │ ├── 2-what-is-pwa.html │ │ ├── 3-what-are-key-techs.html │ │ ├── 4-how-is-pwa-going.html │ │ ├── 5-the-future-of-pwa.html │ │ └── 6-your-first-pwa.html │ ├── chapter01.html │ ├── chapter02/ │ │ ├── 1-what-is-good-ux.html │ │ ├── 2-design-and-tech.html │ │ ├── 3-app-shell.html │ │ ├── 4-app-skeleton.html │ │ └── 5-responsive-design.html │ ├── chapter02.html │ ├── chapter03/ │ │ ├── 1-promise.html │ │ ├── 2-async-function.html │ │ ├── 3-fetch-api.html │ │ ├── 4-cache-api.html │ │ └── 5-indexeddb.html │ ├── chapter03.html │ ├── chapter04/ │ │ ├── 1-service-worker-introduction.html │ │ ├── 2-service-worker-register.html │ │ ├── 3-service-worker-dive.html │ │ ├── 4-service-worker-debug.html │ │ └── code/ │ │ ├── applicationCacheDemo/ │ │ │ ├── index.html │ │ │ └── manifest.appcache │ │ ├── serviceWorkerCacheDemo/ │ │ │ ├── data.json │ │ │ ├── index.css │ │ │ ├── index.html │ │ │ ├── index.js │ │ │ └── sw.js │ │ ├── serviceWorkerDemo/ │ │ │ ├── index.html │ │ │ └── sw.js │ │ ├── serviceWorkerIndexeddbDemo/ │ │ │ ├── fruits.json │ │ │ ├── index.html │ │ │ └── sw.js │ │ ├── serviceWorkerLifecycleDemo/ │ │ │ ├── index.html │ │ │ └── sw.js │ │ ├── serviceWorkerScopeDemo/ │ │ │ ├── a/ │ │ │ │ └── b/ │ │ │ │ └── sw.js │ │ │ └── index.html │ │ ├── serviceWorkerScopeDemo1/ │ │ │ ├── a/ │ │ │ │ ├── a-sw.js │ │ │ │ └── index.html │ │ │ ├── b/ │ │ │ │ └── index.html │ │ │ └── root-sw.js │ │ └── serviceWorkerUnregisterDemo/ │ │ ├── index.html │ │ └── sw.js │ ├── chapter04.html │ ├── chapter05/ │ │ ├── 1-fetch-event-management.html │ │ ├── 2-local-storage-management.html │ │ ├── 3-respond-strategy.html │ │ ├── 4-precache.html │ │ └── 5-workbox.html │ ├── chapter05.html │ ├── chapter06/ │ │ ├── 1-manifest-json.html │ │ ├── 2-credentials-api.html │ │ ├── 3-notification-api.html │ │ ├── 4-web-push-api.html │ │ └── 5-payment-request-api.html │ ├── chapter06.html │ ├── chapter07/ │ │ ├── 1-https.html │ │ ├── 2-CSP.html │ │ ├── 3-policy.html │ │ └── 4-vulnerability.html │ ├── chapter07.html │ ├── chapter08/ │ │ ├── 1-loading-performance.html │ │ └── 2-rendering-performance.html │ ├── chapter08.html │ ├── chapter09/ │ │ ├── 1-search-engine-index.html │ │ ├── 2-pwa-and-amp-and-mip.html │ │ ├── 3-whole-site-amp-and-mip.html │ │ └── 4-preload-pwa.html │ ├── chapter09.html │ ├── ci.yml │ ├── gitbook/ │ │ ├── fonts/ │ │ │ └── fontawesome/ │ │ │ └── FontAwesome.otf │ │ ├── gitbook-plugin-3-ba/ │ │ │ └── plugin.js │ │ ├── gitbook-plugin-ace/ │ │ │ ├── ace/ │ │ │ │ ├── ace.js │ │ │ │ ├── ext-beautify.js │ │ │ │ ├── ext-chromevox.js │ │ │ │ ├── ext-elastic_tabstops_lite.js │ │ │ │ ├── ext-emmet.js │ │ │ │ ├── ext-error_marker.js │ │ │ │ ├── ext-keybinding_menu.js │ │ │ │ ├── ext-language_tools.js │ │ │ │ ├── ext-linking.js │ │ │ │ ├── ext-modelist.js │ │ │ │ ├── ext-old_ie.js │ │ │ │ ├── ext-searchbox.js │ │ │ │ ├── ext-settings_menu.js │ │ │ │ ├── ext-spellcheck.js │ │ │ │ ├── ext-split.js │ │ │ │ ├── ext-static_highlight.js │ │ │ │ ├── ext-statusbar.js │ │ │ │ ├── ext-textarea.js │ │ │ │ ├── ext-themelist.js │ │ │ │ ├── ext-whitespace.js │ │ │ │ ├── keybinding-emacs.js │ │ │ │ ├── keybinding-vim.js │ │ │ │ ├── mode-abap.js │ │ │ │ ├── mode-abc.js │ │ │ │ ├── mode-actionscript.js │ │ │ │ ├── mode-ada.js │ │ │ │ ├── mode-apache_conf.js │ │ │ │ ├── mode-applescript.js │ │ │ │ ├── mode-asciidoc.js │ │ │ │ ├── mode-assembly_x86.js │ │ │ │ ├── mode-autohotkey.js │ │ │ │ ├── mode-batchfile.js │ │ │ │ ├── mode-c9search.js │ │ │ │ ├── mode-c_cpp.js │ │ │ │ ├── mode-cirru.js │ │ │ │ ├── mode-clojure.js │ │ │ │ ├── mode-cobol.js │ │ │ │ ├── mode-coffee.js │ │ │ │ ├── mode-coldfusion.js │ │ │ │ ├── mode-csharp.js │ │ │ │ ├── mode-css.js │ │ │ │ ├── mode-curly.js │ │ │ │ ├── mode-d.js │ │ │ │ ├── mode-dart.js │ │ │ │ ├── mode-diff.js │ │ │ │ ├── mode-django.js │ │ │ │ ├── mode-dockerfile.js │ │ │ │ ├── mode-dot.js │ │ │ │ ├── mode-eiffel.js │ │ │ │ ├── mode-ejs.js │ │ │ │ ├── mode-elixir.js │ │ │ │ ├── mode-elm.js │ │ │ │ ├── mode-erlang.js │ │ │ │ ├── mode-forth.js │ │ │ │ ├── mode-ftl.js │ │ │ │ ├── mode-gcode.js │ │ │ │ ├── mode-gherkin.js │ │ │ │ ├── mode-gitignore.js │ │ │ │ ├── mode-glsl.js │ │ │ │ ├── mode-golang.js │ │ │ │ ├── mode-groovy.js │ │ │ │ ├── mode-haml.js │ │ │ │ ├── mode-handlebars.js │ │ │ │ ├── mode-haskell.js │ │ │ │ ├── mode-haxe.js │ │ │ │ ├── mode-html.js │ │ │ │ ├── mode-html_elixir.js │ │ │ │ ├── mode-html_ruby.js │ │ │ │ ├── mode-ini.js │ │ │ │ ├── mode-io.js │ │ │ │ ├── mode-jack.js │ │ │ │ ├── mode-jade.js │ │ │ │ ├── mode-java.js │ │ │ │ ├── mode-javascript.js │ │ │ │ ├── mode-json.js │ │ │ │ ├── mode-jsoniq.js │ │ │ │ ├── mode-jsp.js │ │ │ │ ├── mode-jsx.js │ │ │ │ ├── mode-julia.js │ │ │ │ ├── mode-latex.js │ │ │ │ ├── mode-lean.js │ │ │ │ ├── mode-less.js │ │ │ │ ├── mode-liquid.js │ │ │ │ ├── mode-lisp.js │ │ │ │ ├── mode-live_script.js │ │ │ │ ├── mode-livescript.js │ │ │ │ ├── mode-logiql.js │ │ │ │ ├── mode-lsl.js │ │ │ │ ├── mode-lua.js │ │ │ │ ├── mode-luapage.js │ │ │ │ ├── mode-lucene.js │ │ │ │ ├── mode-makefile.js │ │ │ │ ├── mode-markdown.js │ │ │ │ ├── mode-mask.js │ │ │ │ ├── mode-matlab.js │ │ │ │ ├── mode-maze.js │ │ │ │ ├── mode-mel.js │ │ │ │ ├── mode-mips_assembler.js │ │ │ │ ├── mode-mipsassembler.js │ │ │ │ ├── mode-mushcode.js │ │ │ │ ├── mode-mysql.js │ │ │ │ ├── mode-nix.js │ │ │ │ ├── mode-objectivec.js │ │ │ │ ├── mode-ocaml.js │ │ │ │ ├── mode-pascal.js │ │ │ │ ├── mode-perl.js │ │ │ │ ├── mode-pgsql.js │ │ │ │ ├── mode-php.js │ │ │ │ ├── mode-plain_text.js │ │ │ │ ├── mode-powershell.js │ │ │ │ ├── mode-praat.js │ │ │ │ ├── mode-prolog.js │ │ │ │ ├── mode-properties.js │ │ │ │ ├── mode-protobuf.js │ │ │ │ ├── mode-python.js │ │ │ │ ├── mode-r.js │ │ │ │ ├── mode-rdoc.js │ │ │ │ ├── mode-rhtml.js │ │ │ │ ├── mode-ruby.js │ │ │ │ ├── mode-rust.js │ │ │ │ ├── mode-sass.js │ │ │ │ ├── mode-scad.js │ │ │ │ ├── mode-scala.js │ │ │ │ ├── mode-scheme.js │ │ │ │ ├── mode-scss.js │ │ │ │ ├── mode-sh.js │ │ │ │ ├── mode-sjs.js │ │ │ │ ├── mode-smarty.js │ │ │ │ ├── mode-snippets.js │ │ │ │ ├── mode-soy_template.js │ │ │ │ ├── mode-space.js │ │ │ │ ├── mode-sql.js │ │ │ │ ├── mode-sqlserver.js │ │ │ │ ├── mode-stylus.js │ │ │ │ ├── mode-svg.js │ │ │ │ ├── mode-swift.js │ │ │ │ ├── mode-swig.js │ │ │ │ ├── mode-tcl.js │ │ │ │ ├── mode-tex.js │ │ │ │ ├── mode-text.js │ │ │ │ ├── mode-textile.js │ │ │ │ ├── mode-toml.js │ │ │ │ ├── mode-twig.js │ │ │ │ ├── mode-typescript.js │ │ │ │ ├── mode-vala.js │ │ │ │ ├── mode-vbscript.js │ │ │ │ ├── mode-velocity.js │ │ │ │ ├── mode-verilog.js │ │ │ │ ├── mode-vhdl.js │ │ │ │ ├── mode-xml.js │ │ │ │ ├── mode-xquery.js │ │ │ │ ├── mode-yaml.js │ │ │ │ ├── snippets/ │ │ │ │ │ ├── abap.js │ │ │ │ │ ├── abc.js │ │ │ │ │ ├── actionscript.js │ │ │ │ │ ├── ada.js │ │ │ │ │ ├── apache_conf.js │ │ │ │ │ ├── applescript.js │ │ │ │ │ ├── asciidoc.js │ │ │ │ │ ├── assembly_x86.js │ │ │ │ │ ├── autohotkey.js │ │ │ │ │ ├── batchfile.js │ │ │ │ │ ├── c9search.js │ │ │ │ │ ├── c_cpp.js │ │ │ │ │ ├── cirru.js │ │ │ │ │ ├── clojure.js │ │ │ │ │ ├── cobol.js │ │ │ │ │ ├── coffee.js │ │ │ │ │ ├── coldfusion.js │ │ │ │ │ ├── csharp.js │ │ │ │ │ ├── css.js │ │ │ │ │ ├── curly.js │ │ │ │ │ ├── d.js │ │ │ │ │ ├── dart.js │ │ │ │ │ ├── diff.js │ │ │ │ │ ├── django.js │ │ │ │ │ ├── dockerfile.js │ │ │ │ │ ├── dot.js │ │ │ │ │ ├── eiffel.js │ │ │ │ │ ├── ejs.js │ │ │ │ │ ├── elixir.js │ │ │ │ │ ├── elm.js │ │ │ │ │ ├── erlang.js │ │ │ │ │ ├── forth.js │ │ │ │ │ ├── ftl.js │ │ │ │ │ ├── gcode.js │ │ │ │ │ ├── gherkin.js │ │ │ │ │ ├── gitignore.js │ │ │ │ │ ├── glsl.js │ │ │ │ │ ├── golang.js │ │ │ │ │ ├── groovy.js │ │ │ │ │ ├── haml.js │ │ │ │ │ ├── handlebars.js │ │ │ │ │ ├── haskell.js │ │ │ │ │ ├── haxe.js │ │ │ │ │ ├── html.js │ │ │ │ │ ├── html_elixir.js │ │ │ │ │ ├── html_ruby.js │ │ │ │ │ ├── ini.js │ │ │ │ │ ├── io.js │ │ │ │ │ ├── jack.js │ │ │ │ │ ├── jade.js │ │ │ │ │ ├── java.js │ │ │ │ │ ├── javascript.js │ │ │ │ │ ├── json.js │ │ │ │ │ ├── jsoniq.js │ │ │ │ │ ├── jsp.js │ │ │ │ │ ├── jsx.js │ │ │ │ │ ├── julia.js │ │ │ │ │ ├── latex.js │ │ │ │ │ ├── lean.js │ │ │ │ │ ├── less.js │ │ │ │ │ ├── liquid.js │ │ │ │ │ ├── lisp.js │ │ │ │ │ ├── live_script.js │ │ │ │ │ ├── livescript.js │ │ │ │ │ ├── logiql.js │ │ │ │ │ ├── lsl.js │ │ │ │ │ ├── lua.js │ │ │ │ │ ├── luapage.js │ │ │ │ │ ├── lucene.js │ │ │ │ │ ├── makefile.js │ │ │ │ │ ├── markdown.js │ │ │ │ │ ├── mask.js │ │ │ │ │ ├── matlab.js │ │ │ │ │ ├── maze.js │ │ │ │ │ ├── mel.js │ │ │ │ │ ├── mips_assembler.js │ │ │ │ │ ├── mipsassembler.js │ │ │ │ │ ├── mushcode.js │ │ │ │ │ ├── mysql.js │ │ │ │ │ ├── nix.js │ │ │ │ │ ├── objectivec.js │ │ │ │ │ ├── ocaml.js │ │ │ │ │ ├── pascal.js │ │ │ │ │ ├── perl.js │ │ │ │ │ ├── pgsql.js │ │ │ │ │ ├── php.js │ │ │ │ │ ├── plain_text.js │ │ │ │ │ ├── powershell.js │ │ │ │ │ ├── praat.js │ │ │ │ │ ├── prolog.js │ │ │ │ │ ├── properties.js │ │ │ │ │ ├── protobuf.js │ │ │ │ │ ├── python.js │ │ │ │ │ ├── r.js │ │ │ │ │ ├── rdoc.js │ │ │ │ │ ├── rhtml.js │ │ │ │ │ ├── ruby.js │ │ │ │ │ ├── rust.js │ │ │ │ │ ├── sass.js │ │ │ │ │ ├── scad.js │ │ │ │ │ ├── scala.js │ │ │ │ │ ├── scheme.js │ │ │ │ │ ├── scss.js │ │ │ │ │ ├── sh.js │ │ │ │ │ ├── sjs.js │ │ │ │ │ ├── smarty.js │ │ │ │ │ ├── snippets.js │ │ │ │ │ ├── soy_template.js │ │ │ │ │ ├── space.js │ │ │ │ │ ├── sql.js │ │ │ │ │ ├── sqlserver.js │ │ │ │ │ ├── stylus.js │ │ │ │ │ ├── svg.js │ │ │ │ │ ├── swift.js │ │ │ │ │ ├── swig.js │ │ │ │ │ ├── tcl.js │ │ │ │ │ ├── tex.js │ │ │ │ │ ├── text.js │ │ │ │ │ ├── textile.js │ │ │ │ │ ├── toml.js │ │ │ │ │ ├── twig.js │ │ │ │ │ ├── typescript.js │ │ │ │ │ ├── vala.js │ │ │ │ │ ├── vbscript.js │ │ │ │ │ ├── velocity.js │ │ │ │ │ ├── verilog.js │ │ │ │ │ ├── vhdl.js │ │ │ │ │ ├── xml.js │ │ │ │ │ ├── xquery.js │ │ │ │ │ └── yaml.js │ │ │ │ ├── theme-ambiance.js │ │ │ │ ├── theme-chaos.js │ │ │ │ ├── theme-chrome.js │ │ │ │ ├── theme-clouds.js │ │ │ │ ├── theme-clouds_midnight.js │ │ │ │ ├── theme-cobalt.js │ │ │ │ ├── theme-crimson_editor.js │ │ │ │ ├── theme-dawn.js │ │ │ │ ├── theme-dreamweaver.js │ │ │ │ ├── theme-eclipse.js │ │ │ │ ├── theme-github.js │ │ │ │ ├── theme-idle_fingers.js │ │ │ │ ├── theme-iplastic.js │ │ │ │ ├── theme-katzenmilch.js │ │ │ │ ├── theme-kr_theme.js │ │ │ │ ├── theme-kuroir.js │ │ │ │ ├── theme-merbivore.js │ │ │ │ ├── theme-merbivore_soft.js │ │ │ │ ├── theme-mono_industrial.js │ │ │ │ ├── theme-monokai.js │ │ │ │ ├── theme-pastel_on_dark.js │ │ │ │ ├── theme-solarized_dark.js │ │ │ │ ├── theme-solarized_light.js │ │ │ │ ├── theme-sqlserver.js │ │ │ │ ├── theme-terminal.js │ │ │ │ ├── theme-textmate.js │ │ │ │ ├── theme-tomorrow.js │ │ │ │ ├── theme-tomorrow_night.js │ │ │ │ ├── theme-tomorrow_night_blue.js │ │ │ │ ├── theme-tomorrow_night_bright.js │ │ │ │ ├── theme-tomorrow_night_eighties.js │ │ │ │ ├── theme-twilight.js │ │ │ │ ├── theme-vibrant_ink.js │ │ │ │ ├── theme-xcode.js │ │ │ │ ├── worker-coffee.js │ │ │ │ ├── worker-css.js │ │ │ │ ├── worker-html.js │ │ │ │ ├── worker-javascript.js │ │ │ │ ├── worker-json.js │ │ │ │ ├── worker-lua.js │ │ │ │ ├── worker-php.js │ │ │ │ ├── worker-xml.js │ │ │ │ └── worker-xquery.js │ │ │ ├── ace.css │ │ │ ├── ace.js │ │ │ └── pdf.css │ │ ├── gitbook-plugin-advanced-emoji/ │ │ │ ├── LICENSE-IMAGES.md │ │ │ ├── LICENSE.md │ │ │ ├── emoji-book.css │ │ │ └── emoji-website.css │ │ ├── gitbook-plugin-anchor-navigation-ex/ │ │ │ ├── lib/ │ │ │ │ ├── config.js │ │ │ │ ├── log.js │ │ │ │ └── plugin.js │ │ │ └── style/ │ │ │ └── plugin.css │ │ ├── gitbook-plugin-anchors/ │ │ │ └── plugin.css │ │ ├── gitbook-plugin-chart/ │ │ │ └── highcharts/ │ │ │ └── highcharts.js │ │ ├── gitbook-plugin-disqus/ │ │ │ ├── plugin.css │ │ │ └── plugin.js │ │ ├── gitbook-plugin-edit-link/ │ │ │ └── plugin.js │ │ ├── gitbook-plugin-emphasize/ │ │ │ └── plugin.css │ │ ├── gitbook-plugin-expandable-chapters-small/ │ │ │ ├── expandable-chapters-small.css │ │ │ └── expandable-chapters-small.js │ │ ├── gitbook-plugin-fontsettings/ │ │ │ ├── fontsettings.js │ │ │ └── website.css │ │ ├── gitbook-plugin-github/ │ │ │ └── plugin.js │ │ ├── gitbook-plugin-page-footer-ex/ │ │ │ ├── lib/ │ │ │ │ └── plugin.js │ │ │ └── style/ │ │ │ └── plugin.css │ │ ├── gitbook-plugin-prism/ │ │ │ ├── prism-coy.css │ │ │ ├── prism-dark.css │ │ │ ├── prism-funky.css │ │ │ ├── prism-okaidia.css │ │ │ ├── prism-solarizedlight.css │ │ │ ├── prism-tomorrow.css │ │ │ ├── prism-twilight.css │ │ │ └── prism.css │ │ ├── gitbook-plugin-search-plus/ │ │ │ ├── search.css │ │ │ └── search.js │ │ ├── gitbook-plugin-sectionx/ │ │ │ ├── sectionx.css │ │ │ └── sectionx.js │ │ ├── gitbook-plugin-sharing-plus/ │ │ │ └── buttons.js │ │ ├── gitbook-plugin-splitter/ │ │ │ ├── splitter.css │ │ │ └── splitter.js │ │ ├── gitbook.js │ │ ├── style.css │ │ └── theme.js │ ├── index.html │ ├── package.json │ ├── scripts/ │ │ └── build.sh │ ├── search_plus_index.json │ └── thanks.html ├── package.json ├── scripts/ │ └── build.sh └── thanks.md