尤雨溪直播介绍vue3的时候,说到了他正在做的一个新东西,名叫vite。


已经有几个月没有写博客了,疫情期间沉迷游戏,虽然也不忘记学习但还是多少有些罪恶感,接下来应该会恢复之前的状态,跑步,学习,看书。

开武魂,直入主题。。。

vite是什么

vite: 一个基于 Vue3 单文件组件的非打包开发服务器

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

vue3 beta直播
vue3 beta直播

优点就是:

Lightning fast cold server start

Instant hot module replacement (HMR)

True on-demand compilation

请阅读并背诵文档https://github.com/vitejs/vite

如何使用vite

1、全局安装

1
npm install create-vite-app -g

2、创建vite项目

1
2
3
create-vite-app demo  |  npm init vite demo(非全局)
cd demo
npm install

3、运行

1
npm run dev (生产环境基于Rollup)

一个vite项目就建好了,默认跑在3000端口

"运行效果"

简单解释一波

在命令行可以看到这么一句话

"优化依赖"

它会在node_modules下生成一个目录叫.vite_opt_cache,这个文件是做优化用的,第一次运行的时候编译的会有点慢,然后在后面再npm run dev的时候就是毫秒级的(通常玩vue的时候每次npm run dev或者npm run serve的时候都需要进行compiler,将vue等原文件进行编译,然后等compiler进度到100%才跑起来);vite项目也支持热更, 原因是它不需要compiler,而是将vue文件直接加载,(可以看到在vite项目跑起来的时候的network),然后在后端去处理,也就是一层本地服务,
"network"

尝试写一个点击增加的demo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<template>
<div>count:{{count}}</div>
<button @click="handleClick">add</button>
</template>

<script>
import {reactive, toRefs} from 'vue';
export default {
name: 'App',
setup(){
const state = reactive({count:0})
const handleClick = () => { state.count++ }
return { ...toRefs(state), handleClick }
}
}
</script>

这时候刷新一下然后查看network发现import {reactive, toRefs} from ‘vue’变成了import {reactive, toRefs} from ‘@modules/vue.js’,但是其他import的资源并没有变,而它将我们写的代码变成一个对象,然后再导出,说明vue文件在后端被解析了

"main.js"

将写的demo代码变成了一个对象
"写的demo"

再看看index.html里面对于js的引入
network''
network''

它是直接引入的main.js文件而且type是module,也就是以es module的方式进行引入,采用了原生es6的模块,而es module每次进行import的时候都会默认发送一个请求,这时候再通过node服务去做资源处理然后直接返回,所以项目整体没有看到需要配置webpack的地方,也实现了免编译。

为什么import的vue资源变成了/@modules?

因为服务一启动,就会加载main.js,而main.js又import了vue,浏览器不支持这种方式,会报这样的错误

1
Uncaught TypeError: Failed to resolve module specifier "vue". Relative references must start with either "/", "./", or "../".

为了在加载资源的时候不会报错,所以需要加上/@modules前缀(也可以加上/@abc或者/@xiaofangkuai或者/@hardy等)进行模块重写

为什么/@modules之后资源就可用了?

因为在vite运行之后,node服务会根据静态服务执行的目录去获取.js文件也就是main.js进行重写,再将重写后的内容返回,可以在vite源码的node部分看到这一段

rewrite''
rewrite''

返回的重写内容里面如果有import xx from ‘/@modules/aaa’,则会继续发一个aaa的请求,所以重写之后会对带有@modules前缀(加载第三方模块)的请求进行处理,也就是根据前缀去node_modules里头读取对应的真实的资源(运行时)然后把读取出来的结果以.js的类型返回

另外附上一个比较简单版的vite,可以直接拖下来看,它在这里‘https://github.com/HHardyy/vite-demo’

这一波通宵我感觉我的青春又回来了~~~