.loading-container{font-size:0;position:fixed;top:0;left:0;height:5px;width:100%;opacity:0;display:none;z-index:100;transition:opacity200;}.loading-container.visible{display:block;}.loading-container.loading{opacity:1;}.loader{background:#23d6d6;display:inline-block;height:100%;宽度:50%;溢出:隐藏;边框半径:005px0;过渡:200widthease-out;}.loader>.light{float:right;height:100%;width:20%;background-image:linear-gradient(toright,#23d6d6,#29ffff,#23d6d6);动画:loading-animation2sease-ininfinite;}.glow{display:inline-block;height:100%;width:30px;margin-left:-30px;border-radius:005px0;box-shadow:0010px#23d6d6;}@keyframesloading-animation{0%{margin-right:100%;}50%{margin-right:100%;}100%{margin-right:-10%;}}简介通常在用Vue.js写单页面应用程序(SPA)时,页面加载时,所有需要的资源(如JavaScript和CSS文件)都会一起加载。在处理大文件时,这可能会导致糟糕的用户体验。使用Webpack,可以使用import()函数而不是import关键字在Vue.js中按需加载页面。为什么按需加载?Vue.js中SPA的典型工作方式是将所有功能和资源一起打包和交付,以便用户无需刷新页面即可使用您的应用程序。如果您没有明确地将您的应用程序设计为按需页面加载,所有页面将被一次加载,或者不必要地提前使用大量内存进行预加载。这对于页面很多的大型SPA来说是非常糟糕的,导致低端手机的用户体验很差,网速也很慢。通过按需加载,用户无需下载他们当前不需要的资产。Vue.js没有为动态模块提供任何与加载指示器相关的控件。即使进行了预取和预加载,也没有相应的空间让用户知道加载过程,所以需要增加一个进度条来提高用户体验。准备项目首先需要一个进度条与VueRouter通信的方式。事件总线模式更合适。事件总线是Vue实例的单例。由于所有Vue实例都有一个使用$on和$emit的事件系统,您可以使用它在应用程序的任何地方传递事件。首先在components目录下新建一个文件eventHub.js:importVuefrom'vue'exportdefaultnewVue()然后配置Webpack禁用预取和预加载,这样你就可以针对每个功能单独进行这样的操作,当然你也可以全局禁用。在根文件夹下创建一个vue.config.js文件,并添加相关配置来禁用预取和预加载:module.exports={chainWebpack:(config)=>{//Disableprefetchingandpreloadingconfig.plugins。delete('prefetch')config.plugins.delete('preload')},}添加路由和页面使用npx安装Vue路由器并使用:$npxvueaddrouter编辑位于router/index.js下的路由器文件并更新路由,以便可以将import语句替换成import()函数:如下默认配置:importAboutfrom'../views/About.vue'{path:'/about',name:'About',component:About},改一下to:{path:'/about',name:'About',component:()=>import('../views/About.vue')},如果你愿意你可以选择按需加载一些页面全局禁用预取和预加载,可以使用特殊的Webpack注解,不要在vue.config.js中配置Webpack:import(/*webpackPrefetch:true*//*webpackPreload:true*/'../views/About.vue')import()和import的主要区别在于,import()加载的ES模块是在运行时加载的,而import加载的ES模块是在编译时加载的。这意味着import()可以用来延迟模块的加载,只在必要时加载它们。实现进度条由于我们无法准确估计页面的加载时间(或完全加载),因此我们无法真正创建进度条。也没有办法检查页面加载了多少。但是,可以创建一个进度条并在页面加载时让它完成。所描述的进度只是随机跳跃,因为它并没有真正反映进度。先安装lodash.random,因为在生成进度条的过程中会用到这个包来生成一些随机数:$npmilodash.random然后,创建一个Vue组件components/ProgressBar.vue: