单页面vite打包学习

前端工程化本人真的很发怵,一直也没有专心去突破一下,都是能用就用,所以今天小小学习一下打包,先从单页面应用的vite打包开始。本文主要是一些我的大白话和有限的经验,如有问题望指正。

一、问题

网页要从服务器请求对应的资源(我就暂时叫包了),我认为有两个问题。

1、首页渲染效率的问题:

资源就是http请求,包太大了不好,因为一般脚本是同步的,包太大下载慢耽误首页渲染;包太小也不好,太小的话老是向服务器请求,那是给服务器压力;

针对这个问题,我们需要尽可能缩小首页需要的包,可以让后续需要的资源动态引入,或者是使用平行、异步的方式去加载暂时用不到的包。前者就是动态加载(就是vue或者react当中的懒加载功能,不用到的不请求),后者则是使用带有prefetch和preload的link标签来帮助浏览器异步静默下载一些资源(先下重要的,后续的后台慢慢下)

2、有效打包的问题:

对多页面的情况,两个html的依赖也许是相同的,比如两个html都要用到vue,不进行配置的话,打包中vue的体积就要乘以2了,所以这里还有一个合并同类项的过程

这里就需要打包策略和vite、webpack这样的工具去辅助

当然我们现在经常写的spa,单页面应用是一种比较好的方式,一者借助动态引入能最小化包的体积,二者也不需要啥打包策略了,反正就一个页面

二、vite

vite我个人理解就是一个混合工具,它结合了esbuild、rollup去处理js和打包等过程(当然不止这些),其最重要的特征还是开发服务器显示页面非常快,原因是vite的开发服务器在显示页面的时候相比较webpack不用打包了,其使用了es模块直接能被现代浏览器识别(存疑,我还得看一下)。

三、前期准备

不放图了,直接写写就行了

首先vite初始化了一个vue项目

安装路由、vuex、sass、elementplus并进行了初始化、挂载到vue实例上的工作

准备了两个页面index和page1两个页面级别组件,其中page1组件是动态引入

四、配置

我的配置如下

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'// https://vitejs.dev/config/
export default defineConfig({// 插件部分plugins: [vue(),AutoImport({resolvers: [ElementPlusResolver()],}),Components({resolvers: [ElementPlusResolver()],}),],//构建部分,该部分涉及到打包的相关内容build:{// target指的是js的兼容版本,默认是['es2020', 'edge88', 'firefox78', 'chrome87', 'safari14']// 相关值可以是一个es版本(最低支持es2015),或者相关的流浪器版本// 该部分任务由esbuild完成target:"es2015",// 打包之后的文件放的文件夹,该部分其实根据项目不一样是不一样的outDir:"dist",//内联资源限制,图片等资源的请求需要http请求,小于该值的资源可以直接转成base64之后,默认是4kbassetsInlineLimit:4096,//懒加载组件之中的css分离,默认是true,css内联到对应的组件中,false的话项目中用到的css全放到一个css文件中cssCodeSplit:true,// cssTarget该熟悉是针对非主流浏览器使用,给css添加一个转换目标,类似target属性// cssMinify css的最小化压缩方式,我不是很懂,但应该和合并同类项类似// sourcemap:true是否储存sourcemap文件,这个文件记载着js源码和打包后代码的位置关系,方便定位出错,我暂时不知道有什么用// chunkSizeWarningLimitchunk大小限制,会和未压缩之前的chunk大小进行比较,有chunk超过这个值会报警,默认500kb// assetsDir静态资源的存放位置,默认是assets,注意这个静态资源包含了除js之外的其他内容assetsDir:"assets",// rollupOptions// vite使用rollup实现打包,这就是写具体配置的地方,为父没用过,先看一下rollupOptions:{// input不写其实啥事都没有,写的话,spa单页面必须注意要把html页面写进去否则不产生html页面// input:["./src/main.js",'./index.html'],// 出口,这里就涉及比较多的内容output:{// entry部分的文件命名,我们这里是spa,所以entry写死也没事,多入口的话需要注意了entryFileNames: "assets/js/[name]-[hash].js",// 自定义chunk如何命名法,包含懒加载或者自定义分包的一些内容的命名chunkFileNames: "assets/js/[name]-[hash].js",// 除js之外其他资源的存放assetFileNames: "assets/[ext]/[name]-[hash].[ext]",// 这里注意一下中括号里面的东西都是占位符// compact用于压缩rollup产生的临时代码compact: true,// 其他的一些内容// external哪些模块被排除在打包之外,我感觉cdn的引入应该挺需要使用这个// manualChunks自定义公共chunk,在多入口的时候很有用// 我们这里测试一下,将vue全家桶放在一个公共chunk之中manualChunks:{vueall:["vue","vue-router","vuex"]}},// 设置为true之后,后续打包的时候只对更改的模块重新分析,加快打包速度cache:true}}
})

打包之后的结果如下

 

五、说一些打包过程中的重点:

1.默认配置的打包情况(不是上述配置,上述配置是最终结果)

可以看到两个页面的css和js都分别打包了,此外index页面显得比较大,因为这个vue全家桶啥的都在这个index之中,默认打包配置就是有点乱,比如这里的js、css都在一个文件夹里面

2.cssCodeSplit属性

这是一个vite的属性,表示css文件是分开打包还是放在一个css文件中,默认是分开打包,false的话是这样的一个打包情况

可以看到直接生成了一个style开头的总的文件

3.rollupOptions.input属性

input不写其实啥事都没有,写的话,spa单页面必须注意要把html页面写进去否则不产生html页面,单页面的话可以写成这样的形式

input:["./src/main.js",'./index.html'],

4.rollupOptions.output.compact属性

压缩rollup产生的临时代码(存疑),设置成true之后确实在大小上有了一些微小的变化

可以看到index对应的js确实小了些(这里我在实验中改了名啊,当然一眼就可以看出大小最大的哪个是主包)

5.rollupOptions.output.entryFileNames

entry部分的文件命名,我们这里是spa,所以entry写死也没事,多入口的话需要注意了(这里的入口不是指main.js,而是指index主页面对应的js文件)

我的内容是这样写的

entryFileNames: "assets/js/[name]-[hash].js"

就是放在assets文件件的js对应的文件下,[name]和[hash]表示占位,题外话,我一直好奇为什么会有hash,后来想想更浏览器缓存有关,不加hash的话,浏览器保不齐会使用缓存,这样的话就显示不了更新后的内容了。

6.rollupOptions.output.chunkFileNames

这里的chunk指的是除上文那个entryFile之外的js文件,命名方式和上面一样,都是js文件嘛

chunkFileNames: "assets/js/[name]-[hash].js",

 7.rollupOptions.output.assetFileNames

除js之外其他资源的存放

assetFileNames:"assets/[ext]/[name]-[hash].[ext]"

[ext]是扩展名的占位符,比如css文件就应该放在css对应的文件夹中

8.rollupOptions.output.manualChunks

manualChunks自定义公共chunk,在多入口的时候很有用

我们这里测试一下,将vue全家桶放在一个公共chunk之中

manualChunks:{vueall:["vue","vue-router","vuex"]}

这样打包之后就会多一个vueall的chunk

六、上nginx看看结果

首先看看首页加载了哪些内容

跳转page1,看看多加载了啥

很明显多加载了对应page1的css和js

(这是先前的截图,所以hash对不上,并且截图时css部分还没有加上hash的部分,截图涉及到不同时期的配置,实验期间更改太多,影响阅读就抱歉了)

本篇文章结束 ,一个简单的单页面打包

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

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

相关文章

读书笔记——《未来简史》

前言 《未来简史》是以色列历史学家尤瓦尔赫拉利的人类简史三部曲之一。三部分别为《人类简史》《未来简史》《今日简史》。其中最为著名的当然是《人类简史》,非常宏大的一本关于人类文明历史的书籍,绝对可以刷新历史观,《人类简史》这本书…

磁盘raid1降级后,mdxxx rota发生变化

背景 虚拟机系统盘vda后端使用宿主机ssd盘lvm组raid1,虚拟机内部查看vda磁盘类型(rota=1):机械硬盘,vda后端raid1降级导致磁盘类型降级:rota 0---->1,vda磁盘类型显示不正确,应该是ssd类型(rota=0); 分析 1.基础 1.1 linux磁盘类型 Rota表示磁盘类型:(1)0,表…

css3过渡与动画

css3过渡与动画 前言过渡过渡的基本使用 transition兼容性transition属性基本使用哪些属性可以参与过渡all过渡的四个小属性 过渡的缓动效果常用缓动参数贝塞尔曲线 过渡效果实战 动画动画的定义和调用动画的执行次数 动画效果实战 案例:发光的灯泡案例:…

前端框架前置学习Node.js(2)npm使用,Node.js总结

npm - 软件包管理器 定义 npm是Node.js标准的软件包管理器 npm仓库中包含大量软件包,使其成为世界上最大的单一语言代码仓,并且可以确定几乎可用于一切的软件包 最初是为了下载和管理Node.js包依赖的方式,但其现在已成为前端JavaScript中使用的工具 使用: 1.初始化清单文…

编译 FastDFS 时报错 fatal error: sf/sf_global.h: No such file or directory 解决办法

编译 FastDFS 时,报错如下 gcc -Wall -D_FILE_OFFSET_BITS64 -D_GNU_SOURCE -g -O1 -DDEBUG_FLAG -c -o ../common/fdfs_global.o ../common/fdfs_global.c -I../common -I/usr/local/include In file included from ../common/fdfs_global.c:21:0: ../common/fdf…

力扣每日一题--2088. 统计农场中肥沃金字塔的数目

看到这道题有些人很容易放弃,其实这道题不是很难,主要是题目长,读的容易让人放弃,但是 只要抓住一些性质就可以解决该问题。 本题中的定义放到图像里其实就是个金字塔,下层的那部分比上一层的那部分,长度加…

【PID精讲 14 】积分分离PID和抗积分饱和PID

文章目录 一、积分分离PID1.1 积分分离PID算法基本思想1.2 积分分离PID算法实现步骤1.3 积分分离PID算法1.4 积分分离PID算法实现1.5 积分分离PID算法仿真实例1.6 积分分离PID算法的优缺点 二、抗积分饱和PID2.1 积分饱和现象2.2 抗积分饱和算法2.3 抗积分饱和算法实现2.4 抗积…

排序算法8----归并排序(非递归)(C)

1、介绍 归并排序既可以是内排序(在内存上的数据排序),也可以是外排序(磁盘上)(硬盘)(在文件中的数据排序)。 其他排序一般都是内排序。 区别于快速排序的非递归&#xf…

【React源码 - Diff算法】

介绍 在React学习中,Diff算法(协调算法),想必我们并不陌生,简单来说就是一个对比新老节点寻找差异,然后找出最小的一个变化集,最后对这个最小变化集进行最小的DOM操作,本文将从源码来分析在React(17.0.2)中…

Python入门-字面量,函数,类

Python 中常用的有6种值(数据)的类型 (1)字符串需要用英文的双引号包围起来,比如打印"helloworld" (2)浮点数,整数,字符串等字面量的写法 (3)字符串定义及打印…

【极光系列】springboot集成redis

【极光系列】springboot集成redis tips:主要用于快速搭建环境以及部署项目入门 gitee地址 直接下载源码可用 https://gitee.com/shawsongyue/aurora.git模块:aurora_rediswindow安装redis安装步骤 1.下载资源包 直接下载解压:https://pa…

汇编和c++初学,c++字符串加整型,导致的字符串偏移

从汇编角度分析"helloworld"1 “helloworld”1对应 mov dword ptr [a],1 mov eax,dword ptr [a] add eax,offset string "helloworld" (03CCCBCh)eax地址偏移加了1, lea ecx,[test]最终取的内存偏移地址&#xf…

【遥感专题系列】影像信息提取之——面向对象的影像分类技术

“同物异谱,同谱异物”会对影像分类产生的影响,加上高分辨率影像的光谱信息不是很丰富,还有经常伴有光谱相互影响的现象,这对基于像素的分类方法提出了一种挑战,面向对象的影像分类技术可以一定程度减少上述影响。 本…

Go-gin-example 第二部分 jwt验证

文章目录 使用 JWT 进行身份校验jwt知识点补充认识JWTTOKEN是什么jwt的使用场景jwt的组成headerpayloadsignature 下载依赖包编写 jwt 工具包jwt中间件编写如何获取token 编写获取token的Apimodels逻辑编写路由逻辑编写修改路由逻辑 验证token将中间件接入Gin功能验证模块 续接…

交友脱单盲盒源码,纸条广场,支持单独抽取/连抽/同城

源码介绍 交友脱单盲盒源码,纸条广场,单独抽取/连抽/同城。 盲 盒交友脱单系统源码包含了学校、爱好、城市、地区、星座等 等信息,具有首页轮转广告和页面美化功能。 首页提供了两款 连抽和高质量底部连抽的选项,并且可以在后台…

如何通过ISPC使用Xe(核显)进行计算

我一直以为 ISPC 的 Xe 是只包含独立显卡的,比如 A770 这些,没想到看了眼文档是可以使用核显的,但只能在 Linux 和 Windows 上,macOS 不行,就想试试看。 写本文是因为 ISPC 已经出现了三四个版本的大改,但…

基于SSM的网上挂号系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

每日一练:LeeCode-102、二又树的层序遍历【二叉树】

本文是力扣LeeCode-102、二又树的层序遍历 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode。 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点&…

【设计模式-3.3】结构型——享元模式

说明:说明:本文介绍设计模式中结构型设计模式中的,享元模式; 游戏地图 在一些闯关类的游戏,如超级玛丽、坦克大战里面,游戏的背景每一个关卡都不相同,但仔细观察可以发现,其都是用…

java基于Spring Boot的灾害应急救援评估调度平台

灾害应急救援平台的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与以往常规产品不同的体验风格。(1)鉴于该系统是一款面向…