I recently updated apps.frickjack.com to use unbundled javascript modules to load custom elements and style rules. It worked great, except I soon noticed that initial page load would present an un-styled, no-custom-element rendering of the page until the javascript modules finished loading asynchronously... ugh.
I worked around the problem by implementing a simple application shell. The html pages under https://apps.frickjack.com now extend a compile-time nunjucks template, basicShell.html.njk (npm install @littleware/little-elements). The shell hides the page content with a style rule, maybe loads the webcomponentsjs polyfill, and renders a "Loading ..." message if the main.js javascript module doesn't load fast enough. I also extended the main javascript module on each page to signal the shell when it has finished rendering the initial page content. For example - indexMain.js for https://apps.frickjack.com/index.html looks like this:
import './headerSimple/headerSimple.js'; if ( window['littleShell'] ) { window['littleShell'].clear(); }
The index.html nunjucks template looks like this:
{% extends "little-elements/lib/styleGuide/shell/basicShell.html.njk" %} {% block head %} <title>frickjack.com</title> {% endblock %} {% block content %} <lw-header-simple title="Home"> </lw-header-simple> ... <script src="{{ jsroot }}/@littleware/little-apps/lib/indexMain.js" type="module"></script> {% endblock %}
A visitor to https://apps.frickjack.com may now briefly see a "Loading" screen for the first page load, but subsequent page loads generally load fast enough from cache that the shell doesn't bother to show the "Loading" screen. I can improve on this by extending the shell with a service worker - that will be my next project.
I envy gmail's loading screen that renders a crazy animation of a googley envelope. Fancy!
No comments:
Post a Comment