vite为什么速度快
原因
vite快的原因是因为 vite在开发环境中是使用的 esbuild,esbuild 是 go 写的,go = 编译型语言、多线程,nodejs = 解释型语言、单线程,并且 vite 使用了原生 esm 导入的,所以快一点,当然,这也只是开发环节,build 的时候vite使用的是 rollup ,回归js,打包速度并没什么提升
- esbuild 的优势:
-
- esbuild 使用 Go 语言编写,Go 语言天生支持多线程(goroutines)和并发,这使得 esbuild 在编译 JavaScript 和 CSS 时能够充分利用多核 CPU 的性能。
- esbuild 专注于构建时的快速性能,采用了简单而高效的算法,避免了像 Babel 这样的工具在转换代码时可能产生的额外开销。
- Vite 的开发环境:
-
- Vite 在开发环境中使用原生 ES 模块(ESM)进行热模块替换(HMR),这避免了传统的打包步骤,从而大大加快了启动速度和模块更新速度。
- Vite 利用了浏览器的原生 ESM 支持,将项目中的模块按需提供给浏览器,而不是将所有代码打包成一个或多个 bundle。
- Vite 的构建过程:
-
- 虽然 Vite 在开发环境中使用了 esbuild,但在生产构建时,它默认使用 Rollup 进行打包。Rollup 是一个专注于打包 ES6 模块的打包器,它本身并不比 webpack 或其他打包器快很多,但在配合 Vite 的优化策略(如预构建、依赖预处理等)时,可以提供不错的构建性能。
- Vite 的构建性能并不是其主打优势,其主要优势在于开发环境的快速反馈和原生 ESM 的支持。然而,通过一些配置和优化,Vite 的生产构建也可以达到相当的性能水平。
- Node.js 的单线程与多线程:
-
- Node.js 本身是单线程的,但它是基于事件循环和非阻塞 I/O 设计的,这使得它能够在高并发环境下表现出色。此外,Node.js 可以通过 Worker Threads 实现多线程编程,但需要注意的是,这与 Go 语言的 goroutine 在设计和使用上有所不同。
- 尽管 Node.js 在某些情况下可能不如 Go 语言快,但它仍然是一个强大且灵活的平台,特别适合构建 Web 应用程序和工具。
总之,Vite 的快速开发体验主要归功于其使用原生 ESM 和 esbuild 的优势,而在生产构建方面,虽然它默认使用 Rollup,但通过适当的配置和优化也可以实现不错的性能。
补充:
vite主要优化配置
- 基于ES模块的快速热更新:Vite 利用浏览器对 ES 模块的支持,能够在开发环境下实现近乎即时的模块热替换(HMR),无需打包整个项目,仅重新加载变更的模块,极大提高了开发速度。
- 按需编译:在开发模式下,Vite 对每个请求的模块进行即时编译,而不是像传统构建工具那样预先打包所有资源。这种方式减少了初次启动和更改后重新加载的时间。
- 预构建依赖:Vite 会在启动时预编译项目依赖到一个高效的格式,通常是 ES 模块格式,这样在开发过程中这些依赖就可以被浏览器直接加载,进一步加快加载速度。
- HTTP2 和缓存策略:Vite 利用 HTTP2 多路复用的特性,将多个模块请求合并到少量的连接中,减少网络延迟。同时,通过ETag和强缓存策略确保静态资源能够被有效缓存,提升加载速度。
- Rollup 打包:在生产构建时,Vite 使用 Rollup 进行代码打包,Rollup 以其高效的树摇(Tree Shaking)和代码分割能力著称,帮助减小最终输出的文件大小。
- 懒加载和代码分割:Vite 支持自动代码分割,允许将应用程序的不同部分拆分成单独的 chunks,仅在需要时加载,这对于大型应用来说可以显著提升初始加载速度。
- Vue 3 的原生支持:Vite 对 Vue 3 提供了原生支持,利用Vue 3的Composition API和其它性能优化特性,进一步提升Vue应用的运行效率。
- Dev Server 配置优化:Vite 的 dev server 配置简单且强大,提供了很多开箱即用的优化选项,比如对静态资源的处理、代理设置等,便于开发者根据需要进行微调。
事件循环和非阻塞 I/O
事件循环(Event Loop)和非阻塞 I/O(Non-blocking I/O)是现代异步编程模型中的两个核心概念,特别是在处理高并发或I/O密集型任务时。以下是它们的基本解释和关系:
事件循环(Event Loop)
事件循环是一个程序结构,它等待事件的发生(如用户输入、网络请求完成等),然后响应这些事件。在单线程环境中,事件循环特别有用,因为它允许我们在不阻塞主线程的情况下处理多个事件。
在事件循环中,通常会有一个事件队列(Event Queue),用于存储待处理的事件。当事件发生时,它们会被添加到事件队列中。事件循环会不断地从队列中取出事件,并执行相应的回调函数来处理这些事件。
非阻塞 I/O(Non-blocking I/O)
非阻塞 I/O 是一种I/O操作模式,它允许程序在等待I/O操作完成时不阻塞当前线程。与传统的阻塞I/O相比,非阻塞I/O可以提高程序的并发性和响应性。
在非阻塞I/O中,当程序发起一个I/O请求(如读取文件、发送网络请求等)时,如果I/O操作不能立即完成(例如,数据还没有准备好),程序不会阻塞等待,而是立即返回并继续执行其他任务。当I/O操作完成时,程序会收到一个通知(通常是通过回调函数或事件的方式),然后可以处理I/O操作的结果。
事件循环和非阻塞 I/O 的关系
事件循环和非阻塞I/O经常一起使用,以实现高效的异步编程。在基于事件循环的异步编程模型中,通常会使用非阻塞I/O来执行I/O操作。这样,当I/O操作不能立即完成时,程序可以继续执行其他任务,而不会阻塞等待I/O操作的完成。当I/O操作完成时,相应的回调函数会被添加到事件队列中,然后由事件循环来处理这些回调函数。
这种模型使得程序能够充分利用CPU和I/O资源,提高整体的并发性和响应性。它特别适合于处理大量并发请求或I/O密集型任务的情况。
示例(以Node.js为例)
Node.js 是一个使用事件循环和非阻塞I/O的JavaScript运行时环境。在Node.js中,你可以使用异步函数和Promise来处理异步操作,这些操作通常基于非阻塞I/O。当异步操作完成时,相应的回调函数或Promise的resolve函数会被调用,并添加到事件队列中等待事件循环的处理。这使得Node.js能够高效地处理大量并发请求,并成为构建高性能Web服务器和API的流行选择。
相关文章:
vite为什么速度快
原因 vite快的原因是因为 vite在开发环境中是使用的 esbuild,esbuild 是 go 写的,go 编译型语言、多线程,nodejs 解释型语言、单线程,并且 vite 使用了原生 esm 导入的,所以快一点,当然,这也…...
Java网络编程(下)
White graces:个人主页 🙉专栏推荐:Java入门知识🙉 🙉 内容推荐:Java网络编程🙉 🐹今日诗词:姑苏城外寒山寺,夜半钟声到客船🐹 ⛳️点赞 ☀️收藏⭐️关注💬卑微小博主…...
APISIX的安装与测试(springboot服务测试)
安装: 1.1安装依赖: curl https://raw.githubusercontent.com/apache/apisix/master/utils/install-dependencies.sh -sL | bash -1.2 安装 OpenResty yum-config-manager --add-repo https://openresty.org/package/centos/openresty.reposudo yum i…...
AI技术:探索未来智能的无限可能
随着科技的飞速发展,人工智能(AI)技术已经成为我们这个时代最引人瞩目的科技力量。从简单的自动化任务到复杂的决策支持系统,AI技术正在以前所未有的速度改变着我们的世界。本文将深入探讨AI技术的定义、发展历程、当前应用、面临…...
npm install 出错,按照版本不匹配解决
一、现象 npm install npm WARN config global --global, --local are deprecated. Use --locationglobal instead. npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: panshi-main-web0.1.0 npm ERR! Found…...
【第1章】SpringBoot实战篇之注册接口
文章目录 前言一、代码部分1. User2.UserMapper13. UserSerivce4. UserController15. Result 二、测试1.注册2.再次注册 总结 前言 下面介绍用户注册接口。 一、代码部分 1. User package org.example.springboot3.bigevent.entity;import com.baomidou.mybatisplus.annotat…...
代码随想录-Day25
216.组合总和III 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输…...
JavaWeb_SpringBootWeb基础
先通过一个小练习简单了解以下SpringBootWeb。 小练习: 需求:使用SpringBoot开发一个Web应用,浏览器发起请求/hello后,给浏览器返回字符串"Hello World~"。 步骤: 1.创建SpringBoot项目,勾选We…...
Stable Diffusion生成图片的参数查看与抹除方法
前几天分享了几张Stable Diffusion生成的艺术二维码,有同学反映不知道怎么查看图片的参数信息,还有的同学问怎么保护自己的图片生成参数不会泄露,这篇文章就来专门分享如何查看和抹除图片的参数。 查看图片的生成参数 1、打开Stable Diffus…...
Linux下多线程的相关概念
🤖个人主页:晚风相伴-CSDN博客 💖如果觉得内容对你有帮助的话,还请给博主一键三连(点赞💜、收藏🧡、关注💚)吧 🙏如果内容有误或者有写的不好的地方的话&…...
在java java.util.Date 已知逝去时间怎么求年月日
在java中,可以使用java.util.Date类来获取年、月和日。以下是一种方法: 首先创建一个java.util.Date对象,表示逝去的时间。 Date pastDate new Date(逝去的时间的毫秒数);然后使用java.util.Calendar类来获取年、月和日。 Calendar calen…...
LeetCode 2928.给小朋友们分糖果 I:Java提交的运行时间超过了61%的用户
【LetMeFly】2928.给小朋友们分糖果 I:Java提交的运行时间超过了61%的用户 力扣题目链接:https://leetcode.cn/problems/distribute-candies-among-children-i/ 给你两个正整数 n 和 limit 。 请你将 n 颗糖果分给 3 位小朋友,确保没有任何…...
【typescript/flatbuffer】在websocket中使用flatbuffer
目录 说在前面场景fbs服务器代码前端typescript代码问题 说在前面 操作系统:Windows11node版本:v18.19.0typescript flatbuffer版本:24.3.25 场景 服务器(本文为golanggin)与前端通信时使用flatbuffer进行序列化与反序列化通信协议为websock…...
构建一个文字冒险游戏:Python 编程实战
在本文中,我们将探索如何使用 Python 创建一个简单的文字冒险游戏。通过这个项目,你将了解到基础的编程技术,包括条件语句、函数和基本的用户输入处理,同时也能体会到文本游戏的魅力和设计的挑战。 项目概述 文字冒险游戏是一种…...
09Linux GDB学习笔记
Linux GDB使用 目录 文章目录 Linux GDB使用先编译文件1.检查安装1.1 安装GDB 2.启动GDB3.退出GDB4.设置断点4.1 在指定行号处设置断点4.2 在指定函数名处设置断点4.3 在指定源文件和行号处设置断点 4.4查看断点信息4.5删除断点5.运行5.1 <font color#ff0000>逐过程&am…...
海外金融牌照
一般来说牌照申请分两个大类:数字货币牌照和外汇牌照。每个国家的牌照具体监管的情况也是不一样的。申请牌照时该如何选择? 今天先说说区块链牌照,具有代表性的有美国msb牌照,加拿大msb牌照,爱沙尼亚数字货币牌照&…...
addEventListener()方法中的几个参数,以及作用
addEventListener() 方法是 JavaScript 中用于处理指定元素的指定事件的函数。它有三个参数: type(必需):一个字符串,指定要监听的事件名。 listener(必需):一个实现了 EventListen…...
FreeRtos进阶——通用链表的实现方式
通用链表实现方式(一) struct node_t {struct node_t *next; };struct person {struct node_t node;char *name;int age; };struct dog {struct node_t node;char *name;int age;char *class; };在此链表中,node结构体被放在了最前面&#x…...
【kubernetes】关于k8s集群如何将pod调度到指定node节点(亲和与反亲和等)
目录 一、调度约束 1.1K8S的 List-Watch 机制 ⭐⭐⭐⭐⭐ 1.1.1Pod 启动典型创建过程 二、调度过程 2.1Predicate(预选策略) 常见的算法 2.2priorities(优选策略)常见的算法 三、k8s将pod调度到指定node的方法 3.1指定…...
AOP基础
黑马程序员JavaWeb开发教程 文章目录 一、AOP概述二、AOP快速入门2.1 步骤2.2 AOP的使用场景2.3 AOP的优势 三、AOP核心概念3.1 AOP核心概念3.2 AOP执行流程 一、AOP概述 AOP:Aspect Oriented Propragramming(面向切面变成、面向方面编程)其实就是面向特定方法编程…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
