vue打包、网站运行速度优化

news2024/12/25 8:54:50

最近在做公司的官网,遇到的首要问题就是初次进入网站时,加载很慢,首页的视频和字体甚至需要30秒才能完全展示出来,用户体验可以说时很差了。接下来说几个优化的点。

一、减小图片的体积
如果项目中的图片过于多,并且体积大时,势必会加大打包的体积,影响网站的运行速率,推荐大家使用 TinyPNG,这是一个在线压缩图片的网站,5M以下的图片都能压缩,也不失真。

二、路由懒加载
利用以下写法进行懒加载

component: () => import('@/views/article')

三、打包不生成 .map文件
在vue.config.js文件中设置productionSourceMap为false
在这里插入图片描述
四、无用文件删除
在反复修改代码的过程中,如果项目中图片很多的话,可能会有很多无用的文件或图片存在。我们可以用插件 useless-files-webpack-plugin 来查找无用文件。
一般此类包不需要安装到项目中,减少node_modules体积(以项目实际情况决定-S/-D)

npm i useless-files-webpack-plugin -S

在vue.config.js中

const UselessFile = require('useless-files-webpack-plugin') //无用文件检查
module.exports = {
  publicPath:"./",
  productionSourceMap: false, // 生产环境是否生成 sourceMap 文件,一般情况不建议打开
  chainWebpack: (config) => {
    config.resolve.alias
      // .set('路径别名', resolve('vue.config文件的相对路径'))
      .set('@$', resolve('src'))
    // 无用文件检查(添加下面这一段)
    config.plugin('uselessFile')
      .use(
        new UselessFile({
          root: path.resolve(__dirname, './src'), // 项目目录
          out: './fileList.json', // 输出文件列表
          clean: false, // 是否删除文件,(为true的话会自动删除文件)
          exclude: /node_modules/ // 排除文件列表
        })
      )
  },
}

在这里插入图片描述
新生成这个文件,里面包含了所有未被使用的文件。

五、字体包压缩
展示类的网站往往会使用特定的字体,一般大家都会上网寻找字体包,目前我做的网站一共是用到了5个字体包,每个基本 都超过了10M,字体包在初次进入网站时就会进行加载,外加在首页还有视频的情况下,极大地拖慢了网站的加载速度。实际上我们是不需要字体包中的所有字的。所以需要提取我们项目中的所有用到的字。
Vue项目在vue.config.js同级目录新建一个word.js文件。这个文件是在网上找的,引用的哪位大佬的忘记了。

// 项目启动就会提取项目中的所有文字
const fs = require('fs');
const path = require('path');
let filesList = [];//vue 文件路径列表
let jsFilesList = [];//ts 文件路径列表
function readFileList(dir, filesList = []) {  
    const files = fs.readdirSync(dir); 
        files.forEach((item) => { 
            var fullPath = path.join(dir, item);    
            const stat = fs.statSync(fullPath); 
            if (stat.isDirectory()) {         
                readFileList(path.join(dir, item), filesList); //递归读取文件    
            } else if(fullPath.endsWith('.vue')) {              
                filesList.push(fullPath);              
            }else if (/(.ts|.js)$/g.test(fullPath)){
                jsFilesList.push(fullPath)
            }
         });  
        return filesList;
    }
    readFileList(path.resolve(__dirname, 'src'),filesList);

    fs.stat(path.resolve(__dirname, 'src/local'),function(err,statObj){
        // 判断local文件是否存在,如果不存在则创建,如果创建则直接处理json文件
        if(!statObj){
            fs.mkdir(path.resolve(__dirname, 'src/local'),function(err){
                writeFile(filesList,'index');
                writeFile(jsFilesList,'jsIndex');
            })
        }else{
            writeFile(filesList,'index');
            writeFile(jsFilesList,'jsIndex');
        }
    })
    
    function writeFile (fileArr,fileName){
       const reg_1 = /(?<!\/\/\s*.*|<!--\s.*)([\u2E80-\u9FFF]*\$?{{0,2}\w*\.*\w*}{0,2}[\u2E80-\u9FFF]+)*/g
        const obj = fileArr.reduce((pre,cur)=>{
            let  fileSuffix = cur.match(/(.ts|.js|.vue)$/g)?.[0];
            let pathName = path.basename(cur,fileSuffix)
            // 如果文件名是index,取父级文件名
            if(pathName === 'index'){
               const pathArr =  cur.split(path.sep);
               pathName = pathArr[pathArr.length-2];
            }
            pre[pathName] = {};
            let pkg = fs.readFileSync(cur,'utf-8');
            const strArr = pkg.match(reg_1); 
            if(strArr?.length){
                strArr.forEach((item,index)=>{
                    if(item.includes('{')){
                        let index = 0
                        item = item.replace(/\$?{{0,2}\w*\.*\w*}{0,2}/g,function(val){
                            if(val){
                                index ++ 
                                return `{${index-1}}`
                            }else{
                                return ''
                            }
                        })
                       
                    }
                    // 如果匹配的字符串的字数大于10,处理key 值
                    if(item.length){
                        let str = item.length >=10? `${item.substring(0,7)}...`:item;
                        pre[pathName][str] = item;
                    }
                   
                })
            }
            return pre
        },{})
        // 创建json文件
        fs.writeFile(path.resolve(__dirname, `src/local/${fileName}.json`),JSON.stringify(obj), 'utf8',function(err){
            // console.log(err)
        })
   }
    

项目运行以后就会生成一个local文件夹,里面分别是index.json和jsIndex.json,提取了.vue文件和.js文件中的所有文字。然后 就可以根据这些字进行字体包压缩了。(不过建议自己提取的时候 标点符号和 ‘撞‘ 这个字再写一下’),我项目中有撞这个字但没提取到。

压缩字体包推荐使用font-spider(字蛛),需要提前有node环境。

npm install font-spider -g


输入font-spider -V 出现版本就说明安装好了。在电脑新建一个文件夹,把需要压缩的ttf字体包放进去。新建index.html,

<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!--link rel="stylesheet" href="./index.css"-->
    <!-- style部分可以提取出来放在css文件中,使用link引入,也可以直接写在html文件内 -->
    <style>
        @font-face {
  			font-family: 'PingFang-Medium';
  			src: url('./PingFang-Medium.ttf')  format('truetype');
  			font-weight: normal;
  			font-style: normal;
		}

        .myFont{
          font-family: 'PingFang-Medium';
        }
    </style>
</head>
<body>
	//  这里写需要压缩的字,可以把项目中用到的字都放到这里来
	<h1 class="myFont">字体包压缩测试</h1>
</body>

ttf文件与index.html文件, css文件看个人要不要。样式我是直接写在index.html里面了。
在这里插入图片描述
之后在控制台执行

font-spider index.html

注意两种情况,一是报错<web font not found>,这说明你命令执行的路径不对,font-spider index.html主要在index.html同级下执行。第二个是我纠结很久的问题,在一开始我压缩的时候,压缩包的体积和原字体包的体积一直是一样的,不改变。如果出现这种情况就说明你找的ttf文件本来就不能压缩,我是压缩苹方字体,最后是在github才找到了能压缩的字体包。
在这里插入图片描述
成功的话则如上图所示,字体包极大地压缩了。最后说一下如果你实在找不到能压缩的字体包,并且你用的字体很少的情况下,你可以把不能压缩的字体包用FontCreator软件打开进行文字的提取,这个具体操作可以在网上搜一下这个软件怎么用的。这里就不赘述了,也比较麻烦。
以上内容有用的话麻烦大家点个赞喔,转载麻烦标明出处。

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

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

相关文章

Set up the compilation environment for ESP8266-RTOS-SDK using Git on Windows

Software to be installed&#xff1a; Git BashPython Environment&#xff0c;ESP8266 Master require Python v3 environment. Please check “add to PATH” while installing Open Git Bash&#xff0c;Enter a local disk&#xff0c;create an empty folder, enter the …

【雕爷学编程】Arduino动手做(159)---RCWL-0515微波检测模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

十大经典排序算法(代码实现),建议收藏

兜兜转转&#xff0c;一晃年关将至。时间证明了一个道理&#xff0c;学啥忘啥&#xff0c;学的越快忘得越快&#xff0c;还不如踏踏实实写点笔记心得来的实在。 编程初学期间&#xff0c;排序算法是让人抓头最多的一块。为什么我连最简单的冒泡排序都理解不了&#xff0c;我是…

webpack基础知识

webpack基础知识 1、定义2、环境安装3、初始化项目4、简单使用 1、定义 webpack的本质是一个第三方模块包&#xff0c;用于分析&#xff0c;并打包代码 支持所有类型的文件打包支持less/sass> css支持ES6/7/8>ES5压缩代码&#xff0c;提高加载速度 2、环境安装 yarn安…

Java并发编程中的HashMap、HashTable、ConcurrentHashMap

1、HashMap 1.1、为什么HashMap非线程安全的 &#xff08;1&#xff09;竞态条件 当多个线程同时对 HashMap 进行写操作&#xff08;如插入、删除、修改&#xff09;&#xff0c;由于没有同步控制&#xff0c;可能会导致数据不一致的情况。例如&#xff0c;两个线程同时向同…

LLM 生成视频 - pika

文章目录 关于 pika申请试用2023-07-12 关于 pika A powerful Text-to-Video platform that can unleash your creativity simply by typing. 官网: https://www.pika.art/官方 twitter : https://twitter.com/pika_labs相关功能介绍 相关报道/博客: 图片生成视频 from : h…

如何给视频配音?这几种配音方法一看就会

怎么给视频进行配音呢&#xff1f;如果原始视频的录音质量较差&#xff0c;存在噪音、回音或杂音等问题&#xff0c;配音可以用来替换原始音频&#xff0c;以提高声音质量和清晰度&#xff0c;或者是我们想要给视频配上一段搞笑的方言配音&#xff0c;怎么怎么做呢&#xff1f;…

超级自动化的3年:财务、IT等通用场景占比高达65%,垂直领域玩家开始晋级

从信息化时代走向数字化时代&#xff0c;企业的最终目标即利用先进的数字技术完成数字化转型升级&#xff0c;而这绝不是将业务、流程、数据、表单等搬到线上就“完事⼉”。 在此背景下&#xff0c;Gartner于2019年提出“超级自动化”&#xff0c;之后全球范围内越来越多的企业…

【C++】-关于vector的两个习题(二维数组和多路递归)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你…

论文浅尝 | 少样本学习的语言模型的持续训练

笔记整理&#xff1a;王贵涛&#xff0c;东南大学硕士&#xff0c;研究方向为自然语言处理 链接&#xff1a;https://github.com/UIC-Liu-Lab/CPT 一、动机 克服灾难性遗忘&#xff08;CF&#xff09;是持续学习&#xff08;CL&#xff09;的一个主要目标。目前有许多方法&…

施密特(Gram-Schmidt)正交化

引自于点击打开 如果没有空间向量解析几何基础&#xff0c;理解起来有些困难&#xff0c;因此稍微解说一下。 两个向量的正交变换我们分为3步&#xff1a; &#xff08;a1,a1)/ (|a1| * |a2|)是a1,a2之间的夹角的cos值cos值乘以|a2|后&#xff0c;得到a2在a1上映射的长度值&…

从浏览器进程角度分析从输入URL到页面显示发生了什么?

一、处理用户在浏览器地址栏中输入的URL&#xff08;统一资源定位符&#xff09; 用户在地址栏输入内容并按下回车&#xff0c;浏览器会检查输入是否符合 URL 规则&#xff0c;以Chrome为例&#xff0c;它会根据相应的规则&#xff0c;将地址栏输入解析成搜索请求或者URI请求。…

YOLOv8实战垃圾分类目标检测 (视频课程)

课程链接&#xff1a;https://edu.csdn.net/course/detail/38804 垃圾分类是一项利国利民的民生工程&#xff0c;需要全社会的共同参与。 YOLOv8是前沿的目标检测技术&#xff0c;它基于先前 YOLO 版本在目标检测任务上的成功&#xff0c;进一步提升性能和灵活性。 本课程将手…

已解决 BrokenPipeError: [Errno 32] Broken pipe

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

第三次CCF计算机软件能力认证

第一题&#xff1a;门禁系统 涛涛最近要负责图书馆的管理工作&#xff0c;需要记录下每天读者的到访情况。 每位读者有一个编号&#xff0c;每条记录用读者的编号来表示。 给出读者的来访记录&#xff0c;请问每一条记录中的读者是第几次出现。 输入格式 输入的第一行包含一个整…

《前端开发 实践之 腾讯地图API 学习》

目录 腾讯地图基础入门方式一方式二 事件监听监听地图瓦片加载完成事件 移除缩放控件 & 旋转控件 & 比例尺控件初始化marker图层创建信息窗点击地图拾取坐标打点标记反解析成详细地址根据输入详细地址 反解析成经纬度 腾讯地图 腾讯地图API学习-官方地址&#xff1a;ht…

浅谈Web前端开发软件包管理器—Bower的基本使用

前言 Bower 是一个客户端的软件包管理器&#xff0c;它可用于搜索、安装和卸载如 JavaScript、HTML、CSS 之类的网络资源&#xff0c;Bower 是 Web 开发中的一个前端文件包管理器&#xff0c;类似于 Node 模块的 npm 包管理器&#xff0c;bower 依赖于 Git、Node 和 npm。 安…

HarmonyOS课程尝鲜计划,优享特权大礼包

报名入口&#xff1a;https://developer.huawei.com/consumer/cn/activity/901689042385499023

Mendix Excel导入组件的分析和应用

一、前言 企业在发展的过程中会使用各种各样的系统&#xff0c;其中很多系统用了5-10年&#xff0c;我们称之为遗留系统存在诸多风险&#xff1a;维护耗时、中断频繁、用户不友好、与新软件的兼容性问题等。总有一天&#xff0c;这些庞大的问题会垄断IT资源&#xff0c;使数字…

事物的属性与观察者有关吗?

我们通常对世界的看法是以分析和概念为基础的&#xff0c;我们倾向于将事物划分为各种相对的存在和概念。然而&#xff0c;有些领域超越了这种相对的观点&#xff0c;揭示了所有现象的无常性、空虚性和无自性&#xff0c;认识到它们的真实本质。如在人机环境系统中就认为&#…