mpoehler / firebase-amp-pwa

sample project for amp landingpages and a VueJs app as a PWA using firebase
Apache License 2.0
0 stars 0 forks source link

WELCHES PROBLEM LÖST DIESES PROJEKT

PWAs Single-Page-Apps bieten eine tolle UserExperience. Leider laden sie nicht sehr schnell. Da gibt es viele Ansätze die dazu führen dass PWAs/SPAs schneller laden, aber sie werden nie so schnell laden wie zum Beispiel AMP-Seiten, die ja ggf. auch von Google gecached werden oder schon per prefetch geholt werden.

Die Idee dieses Projekts ist es, schnelle Landingages aus AMP-Basis zu erstellen, für eine SPA/PWA die dann komplexere Funktionaliäten wie SignIn, komplexe Screens mit clientseitigem Zustand (FLUX), third-party payment providern usw. enthält. Beim Laden der AMP-Seiten soll ein ServiceWorker installiert werden, der die App bereits in den Cache lädt.

LÖSUNG

Wir bauen einen Generator, der AMP-Pages aus einer Datenquelle - in unserem Fall einfach eine JSON-Datei - und ein paar Templates generiert. Dazu entwickeln wir eine SPA/PWA auf VueJs Basis. Auf den AMP-Seiten wird bereits ein Service-Worker installiert, der die SPA/PWA in wesentliche Teilen precached. Damit ist die SPA/PWA beim Aufruf der eigentlichen App-Url bereits im ServiceWorker Cache und damit instant da.

Rahmendaten zur Lösung:

  1. AMP-Landingpage Generator, data.json + pug-templates
  2. VueJs-SPA-PWA
  3. ServiceWorker mit precache der SPA/PWA
  4. Firebase Hosting to host AMP-Pages and SPA/PWA App
  5. Firebase Auth to use Authentication in the SPA/PWA App
  6. Firebase Cloud functions to deliver content to the AMP-Pages amp-list tag (to show a logged in user on an AMP Page)
  7. Das Projekt liegt public bei github und wird automatisch gebaut bei gitlab

TODOs

  1. Jetzt die Integration von Cloud-Functions probieren. Dabei soll man sich in der VueJS-App einloggen können. Der Login-Zustand soll dann per AMP-List auf den AMP-Seiten eingeblendet werden können.
  2. Einen ServiceWorker mit Workbox erstellen, den ServiceWorker auf allen Seiten (/app/index.html & AMP-Serviceworker im layout) einbinden.
  3. passwordless login könnte man noch einbauen.
  4. Google Analytics ist auf jeden Fall noch ein wichtiges Thema. Da also den GTM einbauen in der App und auch auf den AMP Seiten. Dazu könnte man dann später die KPIs definieren und in einem dedizierten Dashboard über Google Datastudio auswerfen.
  5. Einen Artikel in Medium schreiben

TODO Next

Ich hab' dann noch mit

# build the image
cd docker
docker build -t amp-pwa-buildimage .

# do the login in the image
cd ..
docker run -p 9005:9005 -v "$PWD:/app" -w "/app" --name amp-pwa -it amp-pwa-buildimage firebase login

# persist container state
docker commit amp-pwa amp-pwa-buildimage

# select/init project 
docker run -p 9005:9005 -v "$PWD:/app" -w "/app" -it amp-pwa-buildimage firebase init

# generate a FIREBASE_TOKEN for use with gitlab runner
docker run -p 9005:9005 -v "$PWD:/app" -w "/app" -it amp-pwa-buildimage firebase login:ci

# start hosting local
docker run -v "$PWD:/app" -w "/app" -p "5000:5000" -it amp-pwa-buildimage yarn run serve

# start local hosting + watch
docker run -v "$PWD:/app" -w "/app" --name amp-pwa -p "3000:3000" -it amp-pwa-buildimage yarn run serve:watch

# create a project in app with vue-cli
# first install vue-cli and commit 
docker run -v "$PWD:/app" -w "/app" -it amp-pwa-buildimage yarn global add @vue/cli
docker commit `docker ps -n 1 | grep -v '^CONTAINER' | awk '{ print $1 }'` amp-pwa-buildimage
docker run -v "$PWD:/app" -w "/app/app" -p "8080:8080" -it amp-pwa-buildimage yarn global add @vue/cli-service-global
docker commit `docker ps -n 1 | grep -v '^CONTAINER' | awk '{ print $1 }'` amp-pwa-buildimage

# then create the project
docker run -v "$PWD:/app" -w "/app" -it amp-pwa-buildimage vue create app

# then run the vue app
docker run -v "$PWD:/app" -w "/app/app" -p "8080:8080" -it amp-pwa-buildimage yarn serve

# add vuetifiy
docker run -v "$PWD:/app" -w "/app/app" -it amp-pwa-buildimage vue add vuetify

# build the app
docker run -v "$PWD:/app" -w "/app/app" -it amp-pwa-buildimage yarn build

ein Image gebaut um das Projekt im Container zu bauen und zu deployen.

Directory Structure

Build Process

  1. Every build starts with a clean, cleaning the public and generated directories. (clean)
  2. Then the static folder is copied into the public folder. Subsequent processes can overwrite copied files here if necessary. (build:static)
  3. Then the images from the image folder are optimized and copied into the public/img folder. (build:images)
  4. Optimized CSS files are generated from the SCSS, which are later integrated inline into the pages. (build:scss, build:postcss)
  5. Now the AMP pages can be created from the PUG templates and the data.json as well as other sources if necessary. (build:createPages)