单页面vite打包学习

news2024/9/24 13:24:26

前端工程化本人真的很发怵,一直也没有专心去突破一下,都是能用就用,所以今天小小学习一下打包,先从单页面应用的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之后,默认是4kb
    assetsInlineLimit: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.coloradmin.cn/o/1388022.html

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

相关文章

动态规划:01背包问题(一)

本题力扣上没有,是刷的卡码网第46题感兴趣的小伙伴可以去刷一下,是ACM模式。本篇讲解二维dp数组来解决01背包问题,下篇博客将用一维dp数组来解决01背包问题。 题目: 46. 携带研究材料 时间限制:5.000S 空间限制&…

Java中的Socket你了解吗

☆* o(≧▽≦)o *☆嗨~我是小奥🍹 📄📄📄个人博客:小奥的博客 📄📄📄CSDN:个人CSDN 📙📙📙Github:传送门 📅&a…

stable diffusion使用相关

IP Adapter,我愿称之它为SD垫图 IP Adapter是腾讯lab发布的一个新的Stable Diffusion适配器,它的作用是将你输入的图像作为图像提示词,本质上就像MJ的垫图。 IP Adapter比reference的效果要好,而且会快很多,适配于各种…

任务14:使用MapReduce提取全国每年最低/最高气温

任务描述 知识点: 使用MapReduce提取数据 重 点: 开发MapReduce程序统计每年每个月的最低气温统计每年每个月的最高气温 内 容: 使用IDEA创建一个MapReduce项目开发MapReduce程序使用MapReduce统计每年每个月的最低气温使用MapReduce…

基于SSM的网上招聘系统的设计与实现

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

OpenCV-22高斯滤波

一、高斯函数的基础 要理解高斯滤波首先要直到什么是高斯函数,高斯函数是符合高斯分布的(也叫正态分布)的数据的概率密度函数。 高斯函数的特点是以x轴某一点(这一点称为均值)为对称轴,越靠近中心数据发生…

Ubuntu12.0安装g++过程及其报错

Ubuntu12.0安装g过程及其报错 https://blog.csdn.net/weixin_51286763/article/details/120703953 https://blog.csdn.net/dingd1234/article/details/124029945 2.报错二: [41/80] Building CXX object absl/synchronization/CMakeFiles/graphcycles_internal.di…

Java集合之LinkedList源码篇

☆* o(≧▽≦)o *☆嗨~我是小奥🍹 📄📄📄个人博客:小奥的博客 📄📄📄CSDN:个人CSDN 📙📙📙Github:传送门 📅&a…

微信小程序定义并获取日志/实时log信息

步骤一:开通实时日志 可以在开发者工具->详情->性能质量->实时日志,点击前往,在浏览器打开we分析界面: 也可登录小程序管理后台,点击统计进入we分析: 在we分析界面找到性能质量,打开实…

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

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

Linux知识(未完成)

一、Linux 1.1 Linux 的应用领域 1.1.1 个人桌面领域的应用 此领域是 Linux 比较薄弱的环节但是随着发展,近几年 linux 在个人桌面领域的占有率在逐渐提高 1.1.2 服务器领域 linux 在服务器领域的应用是最高的 linux 免费、稳定、高效等特点在这里得到了很好的…

区间预测 | Matlab实现LSSVM-ABKDE的最小二乘支持向量机结合自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现LSSVM-ABKDE的最小二乘支持向量机结合自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现LSSVM-ABKDE的最小二乘支持向量机结合自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现…

MATLAB - 使用运动学 DH 参数构建机械臂

系列文章目录 前言 一、 使用 Puma560 机械手机器人的 Denavit-Hartenberg (DH) 参数,逐步建立刚体树形机器人模型。在连接每个关节时,指定其相对 DH 参数。可视化机器人坐标系,并与最终模型进行交互。 DH 参数定义了每个刚体通过关节与其父…

QT图表-折线图、曲线图

时间记录:2024/1/15 一、使用步骤 1.添加图表模块 .pro项目管理文件中添加charts模块 QChart类:图表类 QChartView类:图表显示类 2.ui文件中添加QChartView组件 (1)选择一个QGrapicsView组件将其拖拽到ui界面上合适位…

小程序基础学习(缓存)

目录 设置用户信息缓存(同步): wx.setStorageSync(key,value) ​编辑 获取用户信息缓存(同步): wx.getStorageSync(key) 删除用户信息缓存(同步): wx.removeStorageSync(key) 清空用户信息缓存(同步): wx.clearStorageSync() 设置用户信息缓存加密信息(异步): wx.setStorage(…

计算机导论05-计算机网络

文章目录 计算机网络基础计算机网络概述计算机网络的概念计算机网络的功能计算机网络的组成 计算机网络的发展计算机网络的类型 网络体系结构网络互联模型OSI/RM结构与功能TCP/IP结构模型TCP/IP与OSI/RM的比较 网络地址与分配IP地址构成子网的划分IPv6 传输介质与网络设备网络传…

JS | JS调用EXE

JS | JS调用EXE 网上洋洋洒洒一大堆文章提供,然我还是没找打合适的方案: 注册表方案做了如下测试(可行但是不推荐?): 先,键入文件名为 myprotocal.reg 的注册表,并键入一下信息: Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\openExe] //协议名…

产品标识为什么要选择激光打标机

选择激光打标机作为产品标识的原因主要有以下几点: ​ 1. 独特的标识效果:激光打标机采用激光束照射在材料表面,通过控制激光束的运动轨迹和能量密度,可以在材料表面形成各种文字、图案和二维码等标识。这些标识具有永久性、耐磨、…

硅双通道光纤低温等离子体蚀刻控制与SiGe表面成分调制

引言 在过去的几年中,MOSFET结构从平面结构改变为鳍型结构(FinFETs ),这改善了短沟道效应,并导致更高的驱动电流泄漏。然而,随着栅极长度减小到小于20nm,进一步小型化变得越来越困难,因为它需要非常窄的鳍宽度&#x…

深度学习笔记(七)——基于Iris/MNIST数据集构建基础的分类网络算法实战

文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解,如有遗漏或错误,欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 认识网络的构建结构 在神经网络的构建过程中,都避不开以下几个步骤: 导入网络和依…