Search code examples
javascriptasynchronousencryptionvue.jslibsodium

Delay Vue.JS component loading until promise is resolved


I'm extensively using libsodium.js in a Vue.JS application I'm building. Libsodium.js isn't usable right away, it does some async loading.

Because I use this library in pretty much every .vue component, I need to delay the actual component loading in Vue until libsodium is fully loaded.

I'm imagining something like this:

// My root component
const app = new Vue({
    data() {
        return {
            sodium: null
        }
    },
    el: '#app',
    components: { ... },
    router,
    created() {
        const _sodium = require('libsodium-wrappers');
        (async() => {
            await _sodium.ready;
            this.sodium = _sodium;

            // Start loading the vue-router routes (and thus my components) here
            startLoadingComponents();
        })();
    }
});

What is the best way to accomplish this?


Solution

  • Restructure your code so that the Vue isn't created until sodium is ready.

    const _sodium = require('libsodium-wrappers');
    
    function startLoadingComponents(){
      const app = new Vue({
          data() {
              return {
                  sodium: _sodium
              }
          },
          el: '#app',
          components: { ... },
          router,
      });  
    }
    
    (async() => {
      await _sodium.ready;
    
      // Start loading the vue-router routes (and thus my components) here
      startLoadingComponents();
      // you could also just really do the new Vue right here...
    })();