DEV Community

Alvaro Montoro
Alvaro Montoro Subscriber

Posted on

2 3

Digital Ocean Hackathon App: PWA time

There's one last step before completing the app (independently of adding new dictionaries, but that's a different story): transforming it into a PWA.

A Progressive Web Application (PWA) will serve two purposes in this case:

  • Make it appear like a native app (if it's saved on the home screen).
  • Cache the values so it works offline or with slow connections.

Dwindle is a static app. And it can be self-contained: once the content and the dictionaries are loaded, there's no real need for the Internet any more (apart from to publish into Twitter, d'uh! 😋)

By transforming Dwindle into a PWA, we will make it faster (pulled from cache) and available offline. So we are going to follow this DEV post about how to build a PWA (it's something that I've done in the past for my personal website, but I have to admit that I forgot.)

Some of the steps I had to follow:

  • Create a manifest.json
  • Create different icons for different resolutions
  • Link the icons and manifest in the HTML
  • Create the service worker to save in cache and fetch from cache
  • Register the service worker

The code of the service worker was:

const STATIC_DWINDLE = "dev-dwindle-site-v1";
const urlsToCache = [
  "/",
  "/index.html",
  "/fav.ico",
  // ... rest of the assets
];

self.addEventListener("install", function(event) {
  // Perform install steps
  event.waitUntil(
    caches.open(STATIC_DWINDLE).then(function(cache) {
      console.log("Opened cache");
      return cache.addAll(urlsToCache);
    })
  );
});

self.addEventListener("fetch", function(event) {
  event.respondWith(
    fetch(event.request).catch(function() {
      return caches.match(event.request);
    })
  );
});
Enter fullscreen mode Exit fullscreen mode

I placed that file at the root level of the website, and then in my code.js file, I registered the service worker like this:

// initizalize service worker
if ("serviceWorker" in navigator) {
  window.addEventListener("load", function () {
    navigator.serviceWorker
      .register("/serviceWorker.js")
      .then(res => console.log("Service worker registered"))
      .catch(err => console.log("Service worker not registered", err));
  });
}

Enter fullscreen mode Exit fullscreen mode

After a short moment of error –mainly because I had placed the service worker in the js folder but was trying to read it from the root–, the service worker was registered correctly, the cache was filled correctly, and we have a PWA!

Run Lighthouse and:

Screenshot of Lighthouse report: everything at 100 + PWA badge active

Yes, that deserves some fireworks!

And for the accessibility tests, they are still doing fine:

Screenshot of Wave report: no errors

That deserves some fireworks too!

Summary of the day

The positives:

  • Made the app into a PWA
  • All tests are positive

The not so positives

  • It could have a better design
  • Only 2 days left!

Although the two days left are not as important anymore: the app is basically complete. The only thing left to do is to prepare the submission.

Speedy emails, satisfied customers

Postmark Image

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay