vue优化首屏加载时间优化-cdn引入第三方包

news2024/11/27 12:39:50

前言

  • 为什么要进行首屏加载优化,因为随着我们静态资源和第三方包和代码增加,压缩之后包会越来越大

  • 随着网络的影响,在我们第一输入url请求资源时候,网络阻塞,加载时间长,用户体验不好

  • 仔细观察后就会发现,代码压缩之后并没有多大,大的都是项目自身,静态资源,第三方包

  • 除去代码层面我们可以通过静态图片网络请求,gzip压缩,CDN(第三方包引入方式),浏览器缓存

什么是cdn引入第三方包-为什么这样干

  • 当我们在本地开发,需要使用到别人的包的时候。通过npm下包。

  • 并且会在package.json文件中,分类好那些包在本地用,那些包需要生产用(会在打包时打进去)

  • 虽然这些包可能并没有那么大,但在小也是占用内存资源,在第一次加载时候需要加载的(受网络影响)

  • cdn就是这些第三方包对应好压缩文件存在服务器,我们只需要通过网络请求就行了(访问服务器资源)

  • 使用cdn之后,我们就可以配置在打包时候不把这些包依赖打到资源里,这样减少打包大小,在服务器压缩,传输更快,同步访问cdn资源包以gzip或者br形式传输,更快减轻服务器压力

  • 但我们使用gzip+cdn之后,一般首屏加载时间就会减少80%左右(不受网络影响前提下)

在哪里获取cdn-第三方包地址

  • 一些成熟框架,就会自己提供cdn地址,比如vue-element-ui。

  • 但是也有网站会把市面上主流的第三方包放在服务器供我们访问

  • bootcdn-主流推荐使用这个:BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务

  • jsdelivr也可以用:jsDelivr - A free, fast, and reliable CDN for JS and open source

代码实现

1.在开始之前我们先看一下有波动情况下element.js包要加载多长时间-3.37秒

2.我们怎么判断哪些包需要cdn方式引入

  • 首先element-ui-和vue及相关的全家桶肯定是要通过cdn方式引入的

  • 其次我们通过包分析打包资源来看哪些生产使用的包需要cdn引入

图例

查看打包之后资源文件包大小占比-不需要下载插件-自带

2.1我们在package.json文件/scripts里面配置一条命令

"build:report": "vue-cli-service build --report",

2.2使用命令打包-在打包文件会有一个report.html文件-直接在浏览器打开就可以看见生产资源包占比大小

// 运行打包命令
npm run build:report

3.需要在vue.config.js 配置生产环境标识,需要cdn引入包,配置拒绝把这些cdn引入的包打进资源

  • 此版本以vue全家桶加echarts为例

  • 可以直接复制我的,改你项目里的版本就可以了,也可以直接使用我的测过没问题

  • 注意cdn变量里左边值是package.json里面包名,右边值是使用该包时候的名字

  • router-和element特殊注意看备注

//生产环境标识
const IS_PRODUCTION = process.env.NODE_ENV === 'production'
​
// 配置引用的js,css地址
const cdn = {
  css: ['https://unpkg.com/element-ui@2.12.0/lib/theme-chalk/index.css'],
  js: [
    'https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.min.js',
    'https://cdn.bootcdn.net/ajax/libs/vue-router/3.4.9/vue-router.min.js',
    'https://cdn.bootcdn.net/ajax/libs/vuex/3.6.2/vuex.min.js',
    'https://cdn.bootcdn.net/ajax/libs/axios/0.27.2/axios.min.js',
    'https://unpkg.com/element-ui@2.12.0/lib/index.js',
    'https://cdn.bootcdn.net/ajax/libs/echarts/5.4.0/echarts.min.js',
  ]
}
​
// 配置打包时使用cdn节点,忽略第三方组件包
// 左边值是package.json里面包名
// 右边值是使用该包时候的名字
const externals = {
  vue: 'Vue',
  vuex: 'Vuex',
  axios: 'axios',
  echarts: 'echarts',
  // 右边值在router.js中使用时是router(直接写这个名字会报undefined)
  // 应该写 'VueRouter'
  'vue-router': 'VueRouter',
  // 右边值在main.js中使用名字是Element(直接写会报错)
  // 应该写ELEMENT-这个值是一个全局变量-跟main.js中引用名字并没有关系
  'element-ui': 'ELEMENT'
}
​
​
chainWebpack (config) {
    // 方便查看-其他默认配置省略
    // 配置是生产环境时,不包上面包打进去,通过cdn方式引入
    if (IS_PRODUCTION) {
      config.plugin('html').tap(args => {
        args[0].cdn = cdn
        return args
      })
      //视为一个外部库,而不将它打包进来
      config.externals(externals)
    }
  }

4.来到public静态文件的-index.html-引入这些资源-可以直接复制

// css资源
<% for (var i in
    htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.css) { %>
    <link
      href="<%= htmlWebpackPlugin.options.cdn.css[i] %>"
      rel="preload"
      as="style"
    />
    <link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="stylesheet" />
    <% } %>
    
// js资源
 <% for (var i in
    htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.js) { %>
    <script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
    <% } %>

图例

5.配置完成之后我们直接打包-丢到nginx启动

5.1当我们配置失败会出现加载不出来,控制台会报错-如果出现下面报错你应该高兴,这些报错都是可以解决的,就差一步

5.2如果配置成功-我们会发现没有报错首屏会很快加载出来,f12检查时在vue.config.js配置地址会看到。在js-css资源查看时都是很快地

5.3使用cdn包加载之后-js静态资源加载时间-压缩传输方式对比


总结:

经过这一趟流程下来相信你也对 vue优化首屏加载时间优化-cdn引入第三方包 有了初步的深刻印象,但在实际开发中我 们遇到的情况肯定是不一样的,所以我们要理解它的原理,万变不离其宗。加油,打工人!

什么不足的地方请大家指出谢谢 -- 風过无痕

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/979688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux和macOS平台中python语言文件上传的一处不同实现

背景 linux系统&#xff0c; python语言&#xff0c;tornado框架 现象 x文件在macOS平台可正常上传&#xff0c; linux平台上传失败。 x文件说明 文件名&#xff1a;xxxx秘密 .mp3 文件格式&#xff1a;mp3 原因 文件名包含\x20\x7f导致, \x20是设备控制&#xff0c; \…

Android逆向工程【黑客帝国】

Android逆向是一门艺术&#xff0c;涵盖的范畴非常广&#xff0c;要学习的东西也很多&#xff0c;如果是为了就业目的&#xff0c;学习的偏向性一定要掌握好。而Android逆向必须掌握的技能有以下&#xff1a; 负责安卓程序的加解密和数据传输分析、拆解、逆向等工作;逆向APK,了…

Agisoft/PhotoScan手动对齐照片

所以我到网上查了一下资料&#xff0c;了解了如何通过添加标记的方式&#xff0c;手动对齐照片。参考文档是PhotoScan的用户手册(http://www.agisoft.com/pdf/photoscan-pro_1_4_en.pdf)。 手动对齐照片&#xff0c;需要在未对齐照片上添加四个及以上标记&#xff0c;并在已对…

Android——数据存储(一)(二十一)

1. 数据存储 1.1 知识点 &#xff08;1&#xff09;掌握Android数据存储的分类&#xff1b; &#xff08;2&#xff09;可以使用SharedPreferences存储数据。 1.2 具体内容 对于我们数据的存储而言&#xff0c;Android一共提供了5个数据存储的方式&#xff1a;SharedPrefe…

Swift 另辟蹊径极速生成图片的缩略图

功能需求 在 App 开发中,创建图片缩略图是一种很常见的操作。但是超大图片如何快速且便捷的生成指定尺寸的缩略图呢? 如上图所示:我们极速生成缩略图比常规方式快了将近 27 倍之多!且生成代码没有用任何第三方库,完全是  原生实现。 在上面演示中包含几张数码相机原始…

huggingface 使用入门笔记

概念 Hugging Face Hub​​和 Github 类似&#xff0c;都是Hub(社区)。Hugging Face可以说的上是机器学习界的Github。Hugging Face为用户提供了以下主要功能&#xff1a; ​模型仓库&#xff08;Model Repository&#xff09;​​&#xff1a;Git仓库可以让你管理代码版本、…

动态规划区间dp之647回文子串

题目&#xff1a; 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例&#xff1a; 题目链接&#xff1a;647.…

Android 线程池源码详解(一)

线程池的创建是通过Executors 构造出来的&#xff0c;这是个典型的工厂类&#xff0c;使用了工厂模式。常用的有四种线程池&#xff1a; 分别是newFixedThreadPool&#xff0c;newSingleThreadExecutor&#xff0c; newCachedThreadPool&#xff0c;newScheduledThreadPool&am…

小白备战大厂算法笔试(二)——数组、链表、列表

常见数据结构 常见的数据结构包括数组、链表、栈、队列、哈希表、树、堆、图&#xff0c;它们可以从“逻辑结构”和“物理结构”两个维度进行分类。 逻辑结构可被分为“线性”和“非线性”两大类。线性结构比较直观&#xff0c;指数据在逻辑关系上呈线性排列&#xff1b;非线…

制药行业常见生产设备有哪些?

制药行业是一个关系到人民健康和生命安全的特殊领域&#xff0c;因此&#xff0c;生产质量和合规性是至关重要的。为了满足严格的生产质量管理规范&#xff08;GMP&#xff09;要求&#xff08;>>制药行业GMP是什么&#xff1f;&#xff09;&#xff0c;制药企业需要使用…

公司办公文件加密防泄密软件哪个好?

天锐绿盾是一款专业的数据安全解决方案&#xff0c;旨在保护企业的核心数据。它采用基于Windows、Mac、Linux内核的文档透明加解密技术&#xff0c;对指定类型的文件进行实时、强制、透明加密&#xff0c;使得文件在操作时自动解密&#xff0c;关闭时自动加密&#xff0c;能够有…

基于物理层网络编码的相位同步算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..........................................................................%数据长度 Len…

前端(十七)——gitee上开源一个移动端礼盒商城项目(前端+后台)

&#x1f917;博主&#xff1a;小猫娃来啦 &#x1f917;文章核心&#xff1a;gitee上开源一个移动端礼盒商城项目 文章目录 前言开源地址项目运行命令项目基本展示前端效果细节展示视频前端代码细节展示视频后台效果展示后台代码展示经典优势思维导图实现思路 前言 项目样式老…

Redux中间件源码解析与实现

基本介绍 本文中涉及到的关键npm包的版本信息如下&#xff1a; react 的版本为18.2.0 redux的版本为4.1.2 redux-thunk版本为2.4.2 redux-promise版本为0.6.0 redux-logger版本为3.0.6 在Redux源码解析与实现&#xff08;一&#xff09;Redux源码解析与实现&#xff08;二&…

Python爬虫:下载小红书无水印图片、视频

该代码只提供学习使用&#xff0c;该项目是基于https://github.com/JoeanAmier/XHS_Downloader的小改动 1.下载项目 git clone https://github.com/zhouayi/XHS_Downloader.git2.找到需要下载的文章的ID 写入main.py中 3.下载 python main.py最近很火的莲花楼为例<嘿嘿…

【Java】传输层UDP

传输层UDP UDP基本特点无连接不可靠面向数据报缓冲区大小受限 UDP协议端格式16位UDP长度16位UDP检验和 UDP基本特点 UDP传输的过程类似于寄信 无连接,不可靠传输,面向数据报,全双工 无连接 知道对端的IP和端口号就直接进行传输&#xff0c;不需要建立连接&#xff1b; 不可…

Linux进程间通信(IPC)的几种方式

概述: “ 进程间通信&#xff08;IPC&#xff0c;Inter-Process Communication&#xff09;&#xff0c;指至少两个进程或线程间传送数据或信号的一些技术或方法。进程是计算机系统分配资源的最小单位(进程是分配资源最小的单位&#xff0c;而线程是调度的最小单位&#xff0c;…

java八股文面试[数据库]——行溢出

行记录格式 1) 行格式分类 表的行格式决定了它的行是如何物理存储的&#xff0c;这反过来又会影响查询和DML操作的性能。如果在单个page页中容纳更多行&#xff0c;查询和索引查找可以更快地工作&#xff0c;缓冲池中所需的内存更少&#xff0c;写入更新时所需的I/O更少。 I…

如何利用TikTok营销策略,来帮你赢得用户的心?

TikTok作为一款全球热门的短视频社交应用&#xff0c;已经成为许多品牌和营销人员的首选平台之一。作为一个出海公众号博主&#xff0c;我将在下面的文章中探讨TikTok营销的重要性、策略和成功案例。 首先&#xff0c;我们来谈一谈TikTok营销的重要性。随着移动互联网的迅速发…

突然发现ONLYOFFICE支持了.wps格式系列文件了

突然发现ONLYOFFICE支持了.wps格式系列文件了 最近做慕课&#xff0c;突然发现&#xff0c;我国产金山的WPS办公软件的.wps后缀名格式文件&#xff0c;居然被ONLYOFFICE这款办公软件支持打开了&#xff0c;找到官网仔细查看更新说明才确认就是最新一次更新加入的&#xff0c;并…