vue项目白屏的原因及优化

本文探讨了单页面应用白屏问题的解决方案,包括路由懒加载、组件懒加载、CDN资源优化、gzip压缩、vue.config.js配置和SSR等技术,以提升首屏加载速度和用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、原因:

单页面应用的 html 是靠 js 生成,因为首屏需要加载很大的js文件(app.js 和vendor.js),所以当网速差的时候会产生一定程度的白屏

二、解决办法:

1、路由懒加载,组件懒加载

1.路由懒加载

// 1、Vue异步组件技术:
{
  path: '/home',
  name: 'Home',
  component: resolve => require(['../views/home.vue'], resolve)
}

// 2、es6提案的import()
{
  path: '/',
  name: 'home',
  component: () => import('../views/home.vue')
}

// 3、webpack提供的require.ensure()
{
  path: '/home',
  name: 'Home',
  component: r => require.ensure([],() =>  r(require('../views/home.vue')), 'home')
}

2.组件懒加载

components:{
  "dailyModal":()=>import("./dailyModal.vue")
},
components:{
  "dailyModal":resolve=>require(['./dailyModal.vue'],resolve)
},

2、CDN 资源优化

CDN 的全称是 Content Delivery Network,即内容分发网络。CDN 是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN 的关键技术主要有内容存储和分发技术。
随着项目越做越大,依赖的第三方 npm 包越来越多,构建之后的文件也会越来越大。再加上又是单页应用,这就会导致在网速较慢或者服务器带宽有限的情况出现长时间的白屏。此时我们可以使用 CDN 的方法,优化网络加载速度。
1、将 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>

2、在 vue.config.js 配置 externals 属性

module.exports = {
 ···
    externals: {
      'vue': 'Vue',
      'vuex': 'Vuex',
      'vue-router': 'VueRouter',
      'axios':'axios'
    }
 }

3、卸载相关依赖的 npm 包

npm uninstall  vue vue-router vuex axios

3、gZip 加速优化

所有现代浏览器都支持 gzip 压缩,启用 gzip 压缩可大幅缩减传输资源大小,从而缩短资源下载时间,减少首次白屏时间,提升用户体验。
gzip 对基于文本格式文件的压缩效果最好(如:CSS、JavaScript 和 HTML),在压缩较大文件时往往可实现高达 70-90% 的压缩率,对已经压缩过的资源(如:图片)进行 gzip 压缩处理,效果很不好。

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, // 是否删除原文件
      })
    )
  }
}

4、vue.config.js中关闭map文件,能减少好多map文件
productionSourceMap是用来报错时定位到代码位置。
如果不想让别人看到源码可以设置为false,并且可以减少打包后包的体积,加密源码。

productionSourceMap: false,

5、SSR,服务端渲染,在服务端事先拼装好首页所需的 html
6、首页加 loading或 骨架屏(优化体验)
随着 SPA 在前端界的逐渐流行,单页面应用不可避免地给首页加载带来压力,此时良好的首页用户体验至关重要。很多 APP 采用了“骨架屏”的方式去展示未加载内容,给予了用户焕然一新的体验。
所谓的骨架屏,就是在页面内容未加载完成的时候,先使用一些图形进行占位,待内容加载完成之后再把它替换掉。在这个过程中用户会感知到内容正在逐渐加载并即将呈现,降低了“白屏”的不良体验。
骨架屏

本文转载地址

### Vue 项目白屏问题的原因及解决方案 #### 原因分析 1. **首屏加载过慢** 在 Vue 单页应用 (SPA) 中,如果初始渲染时间较长,可能会导致用户看到白屏。这通常是由于 JavaScript 文件过大或网络延迟造成的[^1]。 2. **资源加载错误** 如果项目的静态资源(如 CSS、JS 或图片)未能成功加载,可能导致页面无法正常渲染。这种问题可能由文件路径错误、CDN 配置不当或服务器配置问题引起[^2]。 3. **路由配置错误** 当使用 `history` 模式的路由时,如果没有正确配置服务端规则,访问非根路径的 URL 可能会返回 404 错误,从而导致白屏[^4]。 4. **环境变量配置不当** 不同环境下(开发、测试、生产),未正确设置环境变量也可能引发白屏问题。例如,API 地址错误或基础路径 (`publicPath`) 设置不正确[^2]。 5. **组件结构问题** 组件内部存在逻辑错误或不符合预期的行为,比如 `<Transition>` 的子节点不是一个单一的 DOM 节点,也可能是触发白屏的一个原因[^3]。 6. **打包后的文件引用路径错误** 打包后生成的 `dist` 目录中的文件路径如果不正确,浏览器将无法找到所需的资源,进而导致白屏。 --- #### 解决方案 ##### 1. 减少首屏加载时间 可以通过以下方式优化性能: - 使用代码分割(Code Splitting)技术,按需加载模块。 - 启用 Gzip/ Brotli 压缩来减少传输大小。 - 将第三方库外链到 CDN 上,减轻本地打包负担。 ```javascript // vue.config.js 示例:启用 gzip 和 code splitting module.exports = { chainWebpack: config => { config.optimization.splitChunks({ chunks: 'all', }); }, }; ``` ##### 2. 检查并修复资源加载错误 确保所有静态资源路径正确无误。如果是相对路径问题,可以在 `vue.config.js` 中调整 `publicPath` 属性: ```javascript module.exports = { publicPath: process.env.NODE_ENV === 'production' ? '/your-path/' : '/', }; ``` 此外,验证服务器是否支持跨域请求以及是否有缓存策略冲突。 ##### 3. 正确配置路由模式 对于 `history` 模式,需要在服务端增加重写规则,使所有未知路径都指向 `index.html` 文件。以下是 Nginx 配置示例: ```nginx location / { try_files $uri /index.html; } ``` 如果不需要 `history` 模式,可以直接将其更改为默认的 `hash` 模式: ```javascript const router = new VueRouter({ mode: 'hash', // 默认 hash 模式 }); ``` ##### 4. 校验环境变量 确认 `.env` 文件中的变量已正确定义,并且与当前运行环境相匹配。例如,在生产环境中应定义如下内容: ```bash NODE_ENV=production VUE_APP_BASE_URL=/api/ ``` ##### 5. 修改组件结构 针对 `<Transition>` 导致的问题,确保其包裹的内容是一个有效的单个根节点。修改前后的对比可参考以下代码片段: ```html <!-- 修改前 --> <transition> <div>你好</div> <div>您好</div> </transition> <!-- 修改后 --> <transition> <div> <div>你好</div> <div>您好</div> </div> </transition> ``` ##### 6. 检查打包后的文件路径 重新构建项目并上传至目标服务器之前,务必验证 `dist` 目录下是否存在缺失的文件。同时,检查 HTML 文件内的脚本标签和样式表链接是否指向正确的地址[^4]。 --- ### 总结 Vue 项目中的白屏问题往往涉及多个方面,包括但不限于前端代码质量、资源配置和服务端配合。通过逐步排查以上提到的各种可能性,能够有效定位并解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值