白屏出现的原因大部分是网络问题,我们的html文件都是依靠js生成了,所以就会出现一些白屏问题
解决办法
1、路由懒加载
简单的说就是当我们需要这个路由和组件的时候才加载
这是一个没有使用懒加载的例子:
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
component:HelloWorld
}
]
})我们在使用了懒加载后是这样的
import Vue from 'vue'
import Router from 'vue-router'
/* 此处省去之前导入的HelloWorld模块 */
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
component: resolve=>(require(["@/components/HelloWorld"],resolve))
}
]
})语法就是这样:
component:resolve=>(require(['需要加载的路由的地址']),resolve)
不过这种不常用
下面是一种常用的写法利用import
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
component: ()=>import("@/components/HelloWorld")
}
]
})还有一种方法是 webpack提供的require.ensure()
{
path: '/home',
name: 'Home',
component: r => require.ensure([],() => r(require('@/components/HelloWorld')), 'home')
}平时开发中也不太常用。
2. 组件懒加载
下面演示一个没有使用懒加载的写法
<template>
<div class="hello">
<mimiwuqi></mimiwuqi>
</div>
</template>
<script>
import One from './mimiwuqi'
export default {
components:{
mimiwuqi
},
data () {
return {
msg: '秘密武器开发者中心'
}
}
}
</script>使用import组件懒加载优化以后是这样写的
<template>
<div class="hello">
<mimiwuqi></mimiwuqi>
</div>
</template>
<script>
export default {
components:{
mimiwuqi:()=>import("./mimiwuqi");
},
data () {
return {
msg: '秘密武器开发者中心'
}
}
}
</script>还可以使用异步的方法
<template>
<div class="hello">
<mimiwuqi></mimiwuqi>
</div>
</template>
<script>
export default {
components:{
mimiwuqi:resolve=>(['./mimiwuqi'],resolve)
},
data () {
return {
msg: '秘密武器开发者中心'
}
}
}
</script>到此懒加载优化方法就介绍完了
引入cdn的方式优化
首先将 vue、vue-router、vuex、axios 这些 vue 全家桶的资源,全部改为通过 CDN 链接获取,在 index.html 里插入 相应链接。
<body> <div id="app"></div> <script src="https://cdn.bootcss.com/vue/2.6.10/vue.min.js"></script> <script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.min.js"></script> <script src="https://cdn.bootcss.com/vuex/3.1.0/vuex.min.js"></script> <script src="https://cdn.bootcss.com/vue-router/3.0.2/vue-router.min.js"></script> <script src="https://cdn.bootcss.com/element-ui/2.6.1/index.js"></script> </body>
然后在 vue.config.js 配置 externals 属性
module.exports = {
···
externals: {
'vue': 'Vue',
'vuex': 'Vuex',
'vue-router': 'VueRouter',
'axios':'axios'
}
}然后卸载引入的这些包
npm uninstall vue vue-router vuex axios
到此cdn方式优化就介绍完了
还可以使用gzip压缩来优化
gzip现在大部分浏览器都支持,他可以压缩我们的css和js文件的大小,然后提高传输的效率
compression-webpack-plugin可能存在兼容性问题,下载时固定版本
npm i compression-webpack-plugin@5.0.2 -S
const CompressionPlugin = require('compression-webpack-plugin')
configureWebpack: (config) => {
if (process.env.NODE_ENV === 'production') {
config.plugins.push(
new CompressionPlugin({
// gzip压缩配置
test: /\.js$|\.html$|\.css/, // 匹配文件名
threshold: 10240, // 对超过10kb的数据进行压缩
deleteOriginalAssets: false, // 是否删除原文件
})
)
}
}关闭map文件来优化体积
productionSourceMap是用来报错时定位到代码位置。 如果不想让别人看到源码可以设置为false,并且可以减少打包后包的体积,加密源码。
在vue.config.js
productionSourceMap: false
然后在nginx中配置一下
server {
#在这个server中加入下面这些代码
gzip on;
gzip_min_length 1k;
gzip_comp_level 9;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
}此处有bug:
发现启动gzip压缩后的包跟之前的有差异, js方面没啥问题,但是css方面会出现问题,例如opacity不能写百分比格式,百分比格式会默认转为0.1,要写成0-1之间的小数点格式
加一些骨架屏和一些加载效果
避免用户在等待的时候出现白屏,例如:
