如何 运行 在页面开始加载之前进行预加载 VUE.JS

How to run preloader before page starts loading VUE.JS

所以我正在尝试设置一个预加载器,但在它开始 运行 预加载器之前,它开始下载很多 CSS/js 等文件,这不应该发生,因为预加载器应该 运行 在它开始下载 vue 的东西之前,只有在页面准备好时才会停止。这个问题在快速连接下没有注意到,但在 FAST 3G 或 SLOW 3G 下非常明显。

我看到了一些使用 vue 路由的示例,但我正在使用 flask 路由 Vue,这意味着我至少不能使用我所知道的路由方式。

有没有办法设置它以便加载预加载器,然后开始在后台加载其他内容?

我正在为预加载器使用 vue 插件 Vue-loading-overlay

我的部分代码以备不时之需:

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<template>
  <div id="app">
    <vue-topprogress ref="topProgress" :color="'#1d1d25'"
                     :height="5" :errorColor="'#f81732'"/>
    <loading :active.sync="isLoading"
        :is-full-page="true" :opacity="1">
      <img src="../assets/images/testGif.gif" alt="this slowpoke moves"  width=250/>
    </loading>
  </div>
</template>
<script>
  import Loading from 'vue-loading-overlay';
  import 'vue-loading-overlay/dist/vue-loading.css';

  export default {
    name: 'index',
    components: {
      Loading,
    },
    data() {
      return {
        isLoading: true,
      };
    },
    mounted() {
      document.onreadystatechange = () => {
        if (document.readyState === 'complete') {
          this.isLoading = false;
        }
      };
    },
  }
</script>

我能想到 2 个解决方案:异步路由,和异步组件

异步路由

routes.js 文件中,我们用一个简单的 LoginPage 组件定义主路由 /,它将包含在主 JS 中捆绑文件。我们还用异步组件定义了 /app 路由——只有当用户打开 /app 路由时才会加载这个组件。 webpackChunkName 的注释告诉 Webpack 将该组件编译为另一个具有该特定名称的文件。

routes.js

import LoginPage from '../pages/login-page'

const routes = [
 {
  path: '/',
  component: LoginPage
 },
 {
  path: '/app',
  component: () => import('../pages/app-wrapper.vue' /* webpackChunkName: "page--app-wrapper" */),
  children: [
   // child routes
  ]
 }
]

现在在你的 login-page 组件中你可以做一些事情,比如通过 AJAX 加载配置,然后转到 /app 路由。

异步组件

另一种解决方案可能是使用 动态组件。最初它可能是一个简单的 loaderComponent 并且在加载完成后它会变成 appWrapperComponent 然后它的定义才会从另一个更大的块文件中加载。

<template>
  <div :is="componentName"></div>
</template>
export {
  data() {
    componentName: 'loaderComponent'
  },
  components: { loaderComponent },
  mounted() {
    this.$axios('/api/config.json') // its' just an example of loading something
    .then(config => {
      this.$root.config = config; 
      this.componentName = 'appWrapperComponent'; // this changes component name
    });
  }
}

现在要让它工作,我们需要appWrapperComponent异步。

Vue.component('appWrapperComponent', () => ({
    component: import('../pages/app-wrapper.vue' /* webpackChunkName: "pages--app-wrapper" */),
    delay: 200,
    timeout: 5000
}));