10分钟了解一下最近很火的Vite

可莉
• 阅读 7477

10分钟了解一下最近很火的Vite

关注公众号 前端人,回复“加群

添加无广告学习群

Vite 是 vue的作者尤雨溪开发的打包工具,目前亮点是本地开发时热加载编译极快,在大型项目中体验较好。

贴一下作者微博原话:

Vite,一个基于浏览器原生 ES imports 的开发服务器。利用浏览器去解析 imports,在服务器端按需编译返回,完全跳过了打包这个概念,服务器随起随用。同时不仅有 Vue 文件支持,还搞定了热更新,而且热更新的速度不会随着模块增多而变慢。针对生产环境则可以把同一份代码用 rollup 打包。虽然现在还比较粗糙,但这个方向我觉得是有潜力的,做得好可以彻底解决改一行代码等半天热更新的问题。

从上面可以看出:

  • Vite 主要对应的场景是开发模式,跳过打包按需加载,因此热更新的速度非常快;

  • 在大型项目上可以有效提高本地开发编译打包的速度,解决 “改一行代码等半天” 问题;

  • 浏览器解析 imports,利用了 type="module" 功能,然后拦截浏览器发出的 ES imports 请求并做相应处理;

  • 生产模式是用 rollup 打包,这里后续应该会做优化;

一、现代浏览器的模块功能

script标签的type属性设置为module,那么在js中就可以使用模块功能(import '**.js'),es6兼容性为IE11及以下不支持,从 Vue3 的 proxy 和 Vite 的模块,可以看出尤大是彻底放弃 IE 了。

<script type="module" src="main.js"></script><script type="module">import { a } from './a.js'</script>

二、拦截http请求

针对不同类型的文件做不同的处理

  1. js文件 用 es-module-lexer 来对 js 进行的语法分析获取 imports 数组(依赖分析),然后将import语法替换为请求对应的js文件。

原代码:

<div id="app"></div><script type="module">import { createApp } from 'vue'import App from './App.vue'createApp(App).mount('#app')</script>

转换后:

<div id="app"></div><script type="module">import { createApp } from '/@modules/vue'import App from './App.vue'createApp(App).mount('#app')</script>

2. vue文件

vue单文件组件包含的三个部分 template、script、style, Vite 会将单文件组件分成三个部分分别请求,以及做相应处理。

2.1 template

Vite 将 template 编译成 render 函数后返回。

2.2 script

分析 js 中的 import 依赖,重新发起请求。

2.3 style

将 style 编译成 css 插入head中。原本的 App.vue 文件是:

<template>  <h1>Hello Vite + Vue 3!</h1>  <p>Edit ./App.vue to test hot module replacement (HMR).</p>  <p>    <span>Count is: {{ count }}</span>    <button @click="count++">increment</button>  </p></template><script>export default {  data: () => ({ count: 0 }),}</script><style scoped>h1 {  color: #4fc08d;}h1, p {  font-family: Arial, Helvetica, sans-serif;}</style>

转换后变成了:

// localhost:3000/App.vueimport { updateStyle } from "/@hmr"// 抽出 script 逻辑const __script = {  data: () => ({ count: 0 }),}// 将 style 拆分成 /App.vue?type=style 请求,由浏览器继续发起请求获取样式updateStyle("c44b8200-0", "/App.vue?type=style&index=0&t=1588490870523")__script.__scopeId = "data-v-c44b8200" // 样式的 scopeId// 将 template 拆分成 /App.vue?type=template 请求,由浏览器继续发起请求获取 render functionimport { render as __render } from "/App.vue?type=template&t=1588490870523&t=1588490870523"__script.render = __render // render 方法挂载,用于 createApp 时渲染__script.__hmrId = "/App.vue" // 记录 HMR 的 id,用于热更新__script.__file = "/XXX/web/vite-test/App.vue" // 记录文件的原始的路径,后续热更新能用到export default __script

三、热更新

Vite 的是通过 WebSocket 来实现热更新通信,当代码改动以后,通过 websocket 仅向浏览器推送改动的文件。因此 Vite 本地热更新的速度不会受项目的大小影响太多,在大型项目中本地开发速度快。Vite 的客户端热更新代码是在 app.vue 文件编译过程中,将代码注入进去的。

四、Vite 和 vue-cli 的优缺点对比

10分钟了解一下最近很火的Vite

10分钟了解一下最近很火的Vite

五、小结 目前 Vite 正在以很快的速度迭代着,优化自身的功能,未来可期

>原文:https://juejin.cn/post/6928175048163491848

  • 回复 资料包领取我整理的进阶资料包

  • 回复 加群,加入前端进阶群

  • console.log("点赞===再看===快乐")

  • Bug离我更远了,快乐离我更近了

本文分享自微信公众号 - 前端人(FrontendPeople)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这