Vue打包优化 详解

这里写自定义目录标题分析工具Coverage:查看代码的使用状况除移死代码懒加载代码webpack-bundle-analyzer:打包资源树瘦身开始1. productionSourceMap:false2.路由懒加载3. 关闭Prefetch4.element-ui组件按需加载5.使用 CDN 外部加载资源-vue, vuex, vue-router,axios6.使用 CDN 外部加载资源-...
摘要由CSDN通过智能技术生成

分析工具

Coverage:查看代码的使用状况

Coverage 是chrome开发者工具的一个新功能,从字面意思上可以知道它是可以用来检测代码在网站运行时有哪些js和css是已经在运行,而哪些js和css是还没有用到的,如图,这是我在打开csdn网页时,所显示的已运行和尚未运行的代码情况。
Coverage效果

那这个新功能有什么作用呢?

如上图所示,最右边显示的是我们加载的css和js文件数量,红色区域表示已运行的代码,而青色表示已加载但未运行的代码。可用来发现页面中尚未用到的js 和 css代码,你可以为用户只提供必要的代码,这样就可以提升页面的性能。这对于找出可以进行拆分的脚本以及延迟加载非关键脚本来说非常有用。

上面录制的数据中,最大的文件是 vendor.js,其中 55% 的代码都没有执行过,约 80 KB,这已经相当于一张典型图片的文件大小了。
如果某个文件覆盖率低(即未使用代码比例很高),通常意味着用户加载了太多不必要的代码(要么真的是无用代码,要么是当前时点还没执行到的代码),有性能常识的同学不难推断出,这会导致页面的完全加载时间、或单页应用的启动时间变慢,在慢速网络下的性能损耗会尤其明显;此外,更多代码的解析、编译也就意味着更多的硬件资源消耗,在低端设备上也会存在明显的性能问题。

在笔者看来,Coverage 数据至少能从下面 2 个方面指导我们进行 WEB 应用的优化:

移除死代码

以 Coverage 数据为参考,我们能了解页面重无用代码的比例到底有多大。现实世界中,很多工程师可能是在遗留代码库上工作,并且遗留代码库存在的时间还很长,那么很可能这个代码库中存在大量的无用代码,但是谁也不敢删除他们,因为 JS 这门语言的动态性,你不能粗暴的把哪些看起来“没有被使用”的代码直接删掉,除非你很清楚所有的代码执行路径,很显然这对于大型应用或者遗留代码库来说是不现实的。
怎么移除死代码呢?我们可以依赖打包工具,比如 UglifyJS 在压缩代码时支持直接删除死代码的配置项。而 Webpack 2 中引入了 Tree Shaking 的特性,能够自动把项目中没有用到的代码从打包中去掉,但是这种优化仅限于被 export 的代码。总而言之,死代码要尽可能想办法去掉,Coverage 工具能提供一个判断基准。

懒加载代码

如果能删的死代码都删了,但是 Coverage 数据还是居高不下,那么你应该换个角度思考。就像前文所说,JS 是动态语言,可能部分代码在页面加载时并没有用到,但是用户后来的操作会触发这些代码的执行,为什么不让这些代码在需要的时候再加载呢?聪明的你可能已经想到了,这就是懒加载的技术。
使用 Webpack 打包且没有对配置做特别调优的话,它默认会把所有依赖打包成一个巨大的文件,很容易出现首次加载覆盖率很低的情况,在 Webpack 中实现懒加载可以参考 Code Splitting 和 bundle-loader,具体的配置细节这里不展开讲。使用懒加载之后可以极大的减少页面初次下载的代码,从而提高性能。需要注意的是,懒加载优化需要在模块数量和模块大小之间把握一个平衡,否则过多的模块懒加载反而对性能不利,因为每个 HTTP 请求也是有额外开销的。

webpack-bundle-analyzer:查看资源树

我使用的是vue-cli 3.0,需要先安装插件webpack-bundle-analyzer(npm安装会很慢,推荐使用cnpm)

cnpm i webpack-bundle-analyzer

在vue.config.js中添加分析工具的配置:

module.exports = {
   
  chainWebpack: (config) => {
   
    /* 添加分析工具 */
    if (process.env.NODE_ENV === 'production') {
   
      config
        .plugin('webpack-bundle-analyzer')
        .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
        .end()
      config.plugins.delete('prefetch')
    } else {
   
    }
  }
}

再运行

npm run build --report

会在浏览器打开一个项目打包的情况图,便于直观地比较各个bundle文件的大小。
在这里插入图片描述

瘦身开始

1. productionSourceMap:false

修改vue.config.js中的配置

module.exports = {
   
  outputDir: `${
     srcFile}`, // 在npm run build时 生成文件的目录 type:string, default:'dist'
  productionSourceMap: false, // 是否在构建生产包时生成 sourceMap 文件,false将提高构建速度
}

把productionSourceMap改为false。不然在最终打包的文件中会出现一些map文件,map文件的作用在于:项目打包后,代码都是经过压缩加密的,如果运行时报错,输出的错误信息无法准确得知是哪里的代码报错。

有了map就可以像未加密的代码一样,准确的输出是哪一行哪一列有错。
如果不关掉,生产环境是可以通过map文件看到源码的。

2.路由懒加载

在router.js文件中,原来的静态引用方式

import ShowBlogs 
  • 11
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值