首屏加载

2019-10-17  本文已影响0人  撑船的摆渡人

关于首屏加载相信很多人在项目中会遇到。

为什么要做首屏优化?

首屏时间的快慢直接影响到用户对网站的认知度。加载的越快可能用户停留的时间越长,用户转化率越高。
最能反映页面性能的一个指标是FPS(每秒传输帧数(Frames Per Second))。每秒钟帧数愈多,所显示的动作就会越流畅。一般系统设定屏幕的刷新率为60fps,一帧的时长约16ms,除去系统上下文切换开销,每一帧只留10ms左右的程序处理时间。

怎么做?

首先要明白的一点是,关键模块优先加载,要保证不论什么情况下都不能失去重点。然后首屏的内容强制渲染,其他的进入懒加载队列。懒加载一般在浏览器空闲时间处理,保证不阻塞;担心未触发onload事件,5s之后执行懒加载队列

前端缓存和异步加载

1.懒加载,我们只加载页面上第一眼看到的内容。
2.本地存储
3.loading动画或者一个海报
4.异步加载
5.在使用ui库时,尽量使用按需加载方式.
6.合理规划三方库的引用
7.善用webpack-bundle-analyzer优化项目依赖
8.服务端开启 gzip压缩

webpack-bundle-analyzer webpack打包分析工具

npm install --save-dev webpack-bundle-analyzer

然后在 webpack.prod.conf.js 中配置

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
plugins: [
new BundleAnalyzerPlugin(
    {
         analyzerMode: 'server',
         analyzerHost: '127.0.0.1',
         analyzerPort: 8888,
         reportFilename: 'report.html',
         defaultSizes: 'parsed',
         openAnalyzer: true,
         generateStatsFile: false,
         statsFilename: 'stats.json',
         statsOptions: null,
         logLevel: 'info'
       }
    ),
]

配置完成,在项目 npm run build 结束后,就会自动打开一个文件的模块组成图在默认浏览器中,图中面积大的就是对应模块占据的空间。
列如,打包后全局注册的elementUI包很大,我们可以改成按需引入的形式,然后看是否有安装babel-plugin-component插件,才能使局部引用有效。

CND,直接外链第三方库

首先在index.html加入需要引入的库
然后在webpack.base.conf.js中加入externals


module.exports = {
  context: path.resolve(__dirname, '../'),
  entry: {
    app: './src/main.js'
  },
  externals: {
    'jquery': 'jQuery',
    'element-ui':'ELEMENT',
    'vue': 'Vue'
  }
/**** 项目中使用是这样的 ****/
externals: {
    "Vue": "vueFamily.vue",
    "vue-router":'vueFamily.vueRouter',
    'vuex':'vueFamily.vuex',
  },
  plugins:[
    new HtmlWebpackExternalsPlugin({
      externals: [
        {
          module: 'vueFamily',
          entry: '//static.cn/fe-libs/vueFamily.js',
          global: 'vueFamily',
        },
      ],
    })
  ]

GZIP打包,首先安装gzip

npm install -save gzip
在webpack.prod.conf.js加入如下代码

if (config.build.productionGzip) {
  const CompressionWebpackPlugin = require('compression-webpack-plugin')
 
  webpackConfig.plugins.push(
    new CompressionWebpackPlugin({
      asset: '[path].gz[query]',
      algorithm: 'gzip',
      test: new RegExp(
        '\\.(' +
        config.build.productionGzipExtensions.join('|') +
        ')$'
      ),
      threshold: 10240,
      minRatio: 0.8
    })
  )
}

在index.js中加入如下代码

productionGzip: false,
productionGzipExtensions: ['js', 'css'],
上一篇 下一篇

猜你喜欢

热点阅读