精华内容
下载资源
问答
  • 首屏加载

    2020-08-15 23:10:11
    首屏加载 用户能够看到第一屏区域内所有元素加载完的时间就是“首屏加载”时间 首屏位置调用 API 开始统计 -> 绑定首屏内所有图片的 load 事件 -> 页面加载完后判断图片是否在首屏内,找出加载最慢的一张 -&...

    首屏加载

    定义

    • 用户能够看到第一屏区域内所有元素加载完的时间就是“首屏加载”时间
    • 首屏位置调用 API 开始统计 -> 绑定首屏内所有图片的 load 事件 -> 页面加载完后判断图片是否在首屏内,找出加载最慢的一张 -> 首屏时间

    指标

    白屏时间 = 开始渲染时间(首字节时间+HTML下载完成时间)+头部资源加载时间。

    (chrome.loadTimes().firstPaintTime - chrome.loadTimes().startLoadTime)*1000

    用户可操作时间(即 document.ready)

    performance.timing.domContentLoadedEventEnd - performance.timing.navigationStart

    onload 总下载时间

    performance.timing.loadEventEnd - performance.timing.navigationStart

    优化

    1、cdn
    2、gzip
    3、缓存

    接口缓存(前端、后端)
    文件强缓存

    4、懒加载

    路由懒加载
    组件懒加载
    图片懒加载

    5、script延迟加载 async/defer
    6、骨架屏、loading
    7、ssr
    8、http2.0/子域名解决队头阻塞
    9、webp

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>demo</title>
        <style>
        #loader-wrapper { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; z-index: 999999; }
        #loader {
          display: block; position: relative; left: 50%; top: 40%; z-index: 1001; width: 90px; height: 90px; margin: -45px 0 0 -45px; border-radius: 50%; border: 3px solid transparent;border-top-color: #fe9501;         
          -webkit-animation: spin 2s linear infinite;
          -ms-animation: spin 2s linear infinite;
          -moz-animation: spin 2s linear infinite;
          -o-animation: spin 2s linear infinite;
          animation: spin 2s linear infinite;
        }
        #loader:before {
          content: ""; position: absolute; top: 5px; left: 5px; right: 5px; bottom: 5px; border-radius: 50%; border: 3px solid transparent; border-top-color: #fe9501;
          -webkit-animation: spin 3s linear infinite;
          -moz-animation: spin 3s linear infinite;
          -o-animation: spin 3s linear infinite;
          -ms-animation: spin 3s linear infinite;
          animation: spin 3s linear infinite;
        }
        #loader:after {
          content: ""; position: absolute; top: 15px; left: 15px; right: 15px; bottom: 15px; border-radius: 50%; border: 3px solid transparent; border-top-color: #fe9501;
          -moz-animation: spin 1.5s linear infinite;
          -o-animation: spin 1.5s linear infinite;
          -ms-animation: spin 1.5s linear infinite;
          -webkit-animation: spin 1.5s linear infinite;
          animation: spin 1.5s linear infinite;
        }
        @-webkit-keyframes spin {
          0% { -webkit-transform: rotate(0deg); -ms-transform: rotate(0deg); transform: rotate(0deg); }
          100% { -webkit-transform: rotate(360deg); -ms-transform: rotate(360deg); transform: rotate(360deg); }
        }
        @keyframes spin {
          0% { -webkit-transform: rotate(0deg); -ms-transform: rotate(0deg); transform: rotate(0deg); }
          100% { -webkit-transform: rotate(360deg); -ms-transform: rotate(360deg); transform: rotate(360deg); }
        }
        </style>
      </head>
      <body>
        <noscript>
          <strong>We're sorry but yearlybill doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
        </noscript>
        <div id="app">
          <div id="loader-wrapper">
            <div id="loader"></div>
          </div>
        </div>
        <!-- built files will be auto injected -->
      </body>
    </html>
    
    
    
    展开全文
  • 写在前面本文记录笔者在Vue SPA项目首屏加载优化过程中遇到的一些坑及优化方案!我们以 vue-cli 工具为例,使用 vue-router 搭建SPA应用,UI框架选用 element-ui , ajax方案选用 axios, 并引入 vuex ,使用 vuex-...

    写在前面

    本文记录笔者在Vue SPA项目首屏加载优化过程中遇到的一些坑及优化方案!

    我们以 vue-cli 工具为例,使用 vue-router 搭建SPA应用,UI框架选用 element-ui , ajax方案选用 axios, 并引入 vuex ,使用 vuex-router-sync 将 router 同步到 store ,服务器使用本地Nginx服务。

    构建项目

    vue-init webpack vue-spa-starter-kit

    cd vue-spa-starter-kit

    npm install

    npm install vuex element-ui axios -S

    npm run dev

    vue-cli会自动打开浏览器,可以看到效果。我们在入口文件中引入vue-router、element-ui、axios

    // src/main.js

    import 'babel-polyfill'

    import Vue from 'vue'

    import App from './App'

    import axios from 'axios'

    import store from './store'

    import router from './router'

    import {sync} from 'vuex-router-sync'

    import ElementUI from 'element-ui'

    import 'element-ui/lib/theme-chalk/index.css'

    Vue.config.productionTip = false

    Vue.use(ElementUI)

    Vue.prototype.$http = axios

    sync(store, router)

    /* eslint-disable no-new */

    new Vue({

    el: '#app',

    store,

    router,

    template: '',

    components: { App }

    })

    接下来我们不做任何修改,使用默认的配置进行打包,Nginx采用默认配置,部署到Nginx,启动Nginx服务,查看效果:

    可以看出,在没有开发任何页面及功能的情况下,vendor.js 有788kb。如果我们再依赖一些其他的库,比如 echarts 等,vendor.js 能到 1M 以上。

    使用CDN资源

    我们要将 vue、 vue-router、 vuex、element-ui 从 vendor.js 中分离出来,使用CDN资源引入。国内的CDN服务推荐使用 BootCDN。国外不是很好用。。。

    首先在模板文件index.html中添加以下内容:

    ...

    修改 build/webpack.base.conf.js。关于 externals 配置项请自行查阅相关资料。

    module.exports = {

    ...

    externals: {

    'vue': 'Vue',

    'vuex': 'Vuex',

    'vue-router': 'VueRouter',

    'element-ui': 'ELEMENT'

    }

    ...

    }

    修改 src/router/index.js

    // import Vue from 'vue'

    import VueRouter from 'vue-router'

    // 注释掉

    // Vue.use(VueRouter)

    ...

    修改 src/store/index.js

    ...

    // 注释掉

    // Vue.use(Vuex)

    ...

    修改 src/main.js

    import 'babel-polyfill'

    import Vue from 'vue'

    import App from './App'

    import axios from 'axios'

    import store from './store'

    import router from './router'

    import {sync} from 'vuex-router-sync'

    import ELEMENT from 'element-ui'

    // import 'element-ui/lib/theme-chalk/index.css'

    Vue.config.productionTip = false

    Vue.use(ELEMENT)

    Vue.prototype.$http = axios

    sync(store, router)

    /* eslint-disable no-new */

    new Vue({

    el: '#app',

    store,

    router,

    template: '',

    components: { App }

    })

    注意!这里 element-ui 变量名要使用 ELEMENT,因为element-ui的 umd 模块名是 ELEMENT

    再次打包,部署到Nginx服务,可以看到:

    vendor.js 减少到了 112kb,提升85.5%!

    再看CDN资源:

    可以看出,5个请求共216kb,耗时619ms!

    Nginx 开启 gzip

    对 vendor.js 我们优化完了,接下来我们优化服务器上的资源。先看看没有开启 gzip 的效果:

    可以看到有 13.5kb

    Nginx开启gzip,修改nginx配置文件 nginx.conf:

    ...

    http {

    ...

    gzip on;

    gzip_min_length 1k;

    gzip_buffers 4 16k;

    #gzip_http_version 1.1;

    gzip_comp_level 2; # 压缩级别

    # 要压缩的mine类型

    gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss image/jpeg image/gif image/png image/svg+xml;

    gzip_vary off;

    gzip_proxied expired no-cache no-store private auth;

    gzip_disable "MSIE [1-6]\."; # IE6不支持gzip

    ...

    }

    关于 nginx gzip,请自行查阅相关资料

    重启nginx服务,再看效果:

    可以看到服务器上的资源经过gzip压缩之后有 9kb,压缩比 13.3%。

    development 和 production

    上文中我们修改的是 build/webpack.base.conf.js,这样一来,本地开发的时候我们就不能使用 vue-devtools Chrome调试工具了,为了方便调试,我们需要将development和production 配置分开。首先将 build/webpack.base.conf.js 中 externals 配置项挪到 build/webpack.prod.conf.js 中:

    // build/webpack.prod.conf.js

    module.exports = {

    ...

    externals: {

    'vue': 'Vue',

    'vuex': 'Vuex',

    'vue-router': 'VueRouter',

    'element-ui': 'ELEMENT'

    }

    ...

    }

    拷贝 index.html 模板文件,并命名为 index.prod.html; 将原来的 index.html 重命名为 index.dev.html,并删除 CDN 资源:

    ...

    修改 build/webpack.dev.conf.js:

    plugins: [

    ...

    new HtmlWebpackPlugin({

    filename: 'index.html',

    template: 'index.dev.html',

    inject: true

    })

    ]

    修改 build/webpack.prod.conf.js:

    plugins: [

    ...

    new HtmlWebpackPlugin({

    filename: 'index.html',

    template: 'index.prod.html',

    inject: true,

    ...

    })

    ]

    修改 vue-router、vuex、element-ui 的引用:

    // src/main.js

    ...

    if (process.env.NODE_ENV === 'development') {

    require('element-ui/lib/theme-chalk/index.css')

    }

    ...

    // src/router/index.js

    import Vue from 'vue'

    import VueRouter from 'vue-router'

    if (process.env.NODE_ENV === 'development') {

    Vue.use(VueRouter)

    }

    ...

    // src/store/index.js

    import Vue from 'vue'

    import Vuex from 'vuex'

    if (process.env.NODE_ENV === 'development') {

    Vue.use(Vuex)

    }

    ...

    这样我们就可以愉快的在开发环境使用 vue-devtools Chrome调试工具了!

    总结

    至此,我们初步的优化就完成了。我实际的项目首屏加载加上一些第三方客服,第三方校验等优化到近4s 左右。由于是演示项目,并没有开发其他的页面和功能,效果不是很明显,大家可以自行踩坑。大家有更好的方案,可以共同学习!

    展开全文
  • Vue项目部署上线后经常会发现首屏加载的速度特别慢:那么有那写能做的简单优化呢一、路由的懒加载路由懒加载也就是 把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件。结合 Vue 的...

    Vue项目部署上线后经常会发现首屏加载的速度特别慢:那么有那写能做的简单优化呢

    一、路由的懒加载

    路由懒加载也就是 把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件。

    结合 Vue 的异步组件和 Webpack 的代码分割功能,轻松实现路由组件的懒加载。

    在router中,我们平时是这样引入组件的:

    import Foo from './Foo.vue'

    文档中指出,如下定义一个能够被 Webpack 自动代码分割的异步组件

    const Foo = () => import('./Foo.vue')

    在路由配置中什么都不需要改变,只需要像往常一样使用 Foo:

    const router = newVueRouter({

    routes: [

    { path:'/foo', component: Foo }

    ]

    })

    官网介绍地址:

    https://router.vuejs.org/zh/guide/advanced/lazy-loading.html

    二、使用cdn

    打包时,把vue、vuex、vue-router、axios等,换用国内的bootcdn直接引入到根目录的index.html。

    在webpack build 下 base.conf.js 设置中添加externals,忽略不需要打包的库。

    module.exports ={

    context: path.resolve(__dirname,'../'),

    entry: {

    app:'./src/main.js'},

    externals:{'vue':'Vue','vue-router':'VueRouter','vuex':'Vuex'},//格式为'aaa':'bbb',其中,aaa表示要引入的资源的名字,bbb表示该模块提供给外部引用的名字,由对应的库自定。例如,vue为Vue,vue-router为VueRouter

    去掉原有的引用直接使用就可以了,否则还是会打包

    具体步骤为

    (1)、引入

    在这里有些名字是不能变的,尽量按照规定的来写

    'vue': 'Vue','vuex': 'Vuex','vue-router':'VueRouter',//'axios': 'axios',

    'element-ui': 'ElementUI'

    2、引入cdn。推荐引入 百度静态资源库的

    地址为:https://www.bootcdn.cn/

    3、注释

    main.js中

    //import Vue from 'vue'//import ELEMENT from 'element-ui'//Vue.use(ELEMENT)//import ElementUI from 'element-ui'//import 'element-ui/lib/theme-chalk/index.css'//Vue.use(ElementUI)

    router.js中

    //import Vue from 'vue'//import Router from 'vue-router'

    Vue.use(VueRouter)

    use不能去在router中。

    再就是vuex文件中的注释了

    4、删除掉 package.json 里面原本引入的。

    展开全文
  • 特别在移动端,单页面应用的首屏加载优化更是绕不开的话题。下面我会写出我在项目中做的一些优化,希望大家能够相互讨论,共同进步。我的项目vue-cli3构建的,vue+vue-router+vuex,UI框架选用 element-ui,ajax方案...

    问题

    单页面应用的一个问题就是首页加载东西过多,加载时间过长。特别在移动端,单页面应用的首屏加载优化更是绕不开的话题。下面我会写出我在项目中做的一些优化,希望大家能够相互讨论,共同进步。

    我的项目vue-cli3构建的,vue+vue-router+vuex,UI框架选用 element-ui,ajax方案选用 axios,服务器使用Nginx。用到的这些技术都是现在用的比较广泛的,看到这篇文章,我估计你和我用的技术应该差不多。

    第一步:webpack-bundle-analyzer 分析

    首页我们来看看没有经过任何优化的打包分析,vue-cli3的项目直接vue-cli-service build --report就会生成一个report.html,打开这个html就能看到,不是vue-cli3的项目需要自行安装这个插件,参考链接,点击。

    0d726c7cc712c3f8773aec9688e8c7d5.png

    如上图所示在vendor比较大的文件有element,moment,echart,还有jquery,然后还有一些没见过的vue-qriously这些组件,接下来我们来一步一步让vendor变小

    第二步:初步优化

    1. 仔细考虑组件是否需要全局引入

    在我们的main.js,我发现有很多组件被全局引入,其中有些组件只有1,2个页面用到,这些组件不需要全部引入

    import ImageComponent from 'COMMON/imageComponent'import InfiniteLoading from'COMMON/infiniteLoading'import SearchDialog from'COMMON/SearchDialog'import BasicTable from'COMMON/BasicTable'import VueQriously from'vue-qriously'Vue.use(ImageComponent)

    Vue.use(InfiniteLoading) // 可以去除

    Vue.use(SearchDialog) // 可以去除

    Vue.use(BasicTable) // 可以去除

    Vue.use(VueQriously) // 可以去除

    上面一段代码是我们main.js中的代码,其中ImageComponent是用来处理图片的,用到的页面很多,其他的组件都只要较少的页面用到,我们在main.js中删除,移到具体的页面中去。

    2. 手动引入 ECharts 各模块

    默认引入 ECharts 是引入全部的```import * as ECharts from 'echarts' ```我们只需要部分组件,只需引入自己需要的部分。参考地址,点击

    import VueECharts from 'vue-echarts/components/ECharts.vue'import'echarts/lib/chart/line'import'echarts/lib/chart/bar'import'echarts/lib/chart/pie'import'echarts/lib/component/title'import'echarts/lib/component/tooltip'import'echarts/lib/component/legend'import'echarts/lib/component/markPoint'

    3.使用更轻量级的工具库

    moment是处理时间的标杆,但是它过于庞大且默认不支持tree-shaking,而且我们的项目中只用到了moment(), format(), add(), subtract()等几个非常简单的方法,有点大材小用,所以我们用 date-fns 来替换它,需要什么方法直接引入就行。

    0afb7c15fee9559f662be5c210b910e0.png

    经过上面的三步初步优化,我们可以看到vendor.js变小了很多,去除了moment,我们项目之前echart就是按需加载的。

    第三步:CDN优化

    进过上面的优化,发现 Vue 全家桶以及 ElementUI 仍然占了很大一部分 vendors 体积,这部分代码是不变的,但会随着每次 vendors 打包改变 hash 重新加载。我们可以使用 CDN 剔除这部分不经常变化的公共库。我们将vue,vue-router,vuex,axios,jquery,underscore,使用CDN资源引入。国内的CDN服务推荐使用 BootCDN

    1.首先我们在index.html中,添加CDN代码

    ...

    展开全文
  • 单页面应用的一个问题就是首页加载东西过多,加载时间过长。特别在移动端,单页面应用的首屏加载优化更是绕不开的话题,这篇文章主要介绍了vue项目首屏加载时间优化实战,感兴趣的小伙伴们可以参考一下
  • 浅谈vue首屏加载优化

    2020-08-27 07:24:52
    主要介绍了浅谈vue首屏加载优化,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 标控近术第发据也商蔽最移构一个使用Vue做的网站,这个网站不可避免地出现了首屏加载过慢的问题,那么为什么出现这个问题?怎么解决这个问题呢?这就是本篇博客要讨一说为年供发架据制个似业告了到会转和大效以插各...
  • 首屏加载优化

    2021-04-11 21:50:25
    首屏加载优化 preload(提高优先级,优先加载本页资源)、prefetch(降低优先级,提前加载可能用到的资源) 利用LocalStorage缓存资源 图片资源压缩,icon资源使用雪碧图 对于vue项目: 分离打包,对于第三...
  • 主要介绍了vue-cli 首屏加载优化问题,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
  • 异步加载组件就是在定义组件的时候什么都不做,页面首屏加载时不对异步加载的组件进行加载和渲染,只有当组件第一次使用的时候才进行加载和渲染,适用于当页面首屏加载时隐藏的组件。 实现方式 1、webpack代码分割。...
  • 主要介绍了Vue项目使用CDN优化首屏加载问题,本文以vue、vuex、vue-touter为例,给大家介绍处理流程,需要的朋友可以参考下
  • 主要介绍了Vue如何提升首屏加载速度实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 本篇文章主要介绍了浅谈Vue SPA 首屏加载优化实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 首屏加载速度优化

    2020-11-30 12:10:34
    首屏加载速度优化 首屏加载速度优化,总结下来有两个方向: 跑得快 传得少 下面,就这两个方向展开谈谈个人的经验,一些在工程化时代已经成为基操的,就不谈了,比如代码压缩、图片压缩之类的。 跑得快 跑得快,即...
  • H5 分包实现首屏加载时间优化H5 分包实现首屏加载时间优化一、为什么首屏加载需要优化二、分析产物三、分包实现四、解析 splitChunks H5 分包实现首屏加载时间优化 一、为什么首屏加载需要优化 因为做了很多事情: ...
  • 主要介绍了vue-cli项目优化 缩短首屏加载时间,需要的朋友可以参考下
  • 主要介绍了浅谈VUE单页应用首屏加载速度优化方案,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 单页面应用首次进入时加载的文件较多,导致首屏渲染速度很慢。以下总结了一些解决单页面应用首屏渲染慢的方式。1、路由懒加载a)、require/*vue异步组件技术*/{path:'/home',name:'home',component: resolve=> ...
  • vue项目首屏加载优化

    2021-03-08 20:31:35
    我们习惯用vue-cli搭建脚手架,再配合vue-router控制路由,vuex控制状态及复杂组件通讯,实现顺畅的spa应用,但是往往在项目应用插件框架时后首屏加载时间非常长。故此可做一些优化。
  • 直播中的首屏加载时间指的是进入直播间时从播放器加载到第一帧画面渲染出来的时间,这个时间是直播体验中的一项重要的指标。这篇文章就简要介绍一下优化直播首屏加载时间的一些经验。 客户端业务侧优化 说到优化,...
  • vue实现首屏加载等待动画

    千次阅读 2020-06-17 17:13:09
    vue实现首屏加载等待动画 vue实现首屏加载等待动画 避免首次加载白屏尴尬 hua 不多说直接上代码 直接修改index.html // An highlighted block <!DOCTYPE html> <html lang="en"> <head> <...
  • react 首屏加载优化

    2018-10-31 17:59:00
    react 首屏加载优化,原本是在入口HTML文件中加载loading动画,但是部署在测试环境上的时候一直无法显示loading的部分,也是奇怪了,我们测试环境的部署一直跟本地的都不太一样,内外网的转发多次,总感觉会丢掉一些...
  • 默认情况下,Angular应用程序在首次加载根组件时,会在浏览器的显示一个loading...我们可以轻松地将loading修改成我们自己定义的动画。这是我们要实现首次加载的效果:根组件标签中的内容请注意,在你的入口文件index...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,467
精华内容 986
关键字:

首屏加载