初识Vite

Jin原创2021年1月7日
大约 4 分钟约 1273 字

vite是什么?

image.png

作者尤大: Viteopen in new window,一个基于浏览器原生 ES Modules 的开发服务器。利用浏览器去解析模块,在服务器端按需编译返回,完全跳过了打包这个概念,服务器随起随用。同时不仅有 Vue 文件支持,还搞定了热更新,而且热更新的速度不会随着模块增多而变慢。

有以下特点:
1、闪电般冷服务启动(就是输入启动command,如npm run dev 启动会很快)
2、即时热更新HRM (如webpack-dev-serveropen in new window 实现的模块热更新)
3、真正的按需编译

vite与webpack 有什么不同?

webpack

Webpack会把所有资源(包括Javascript,图像,字体和CSS等)打包后置于依赖关系中,如:
main.js中引入 a.jsb.js

// a.js
const a = () => { return 10 }
export { a }

// b.js
const b = () => { return 20 }
export { b }
// c.js
import { a } from './a'
import { b } from './b'

const c = return a() + b()
export { c }

经过webpack处理后打包生成bundle.js

// bundle.js
const a = 10;
const b = 20;
const c = return a + b;
export { c };

可以看到bundle.js里面的c模块依赖a和b模块的返回值来计算正确结果,因此如若a模块代码进行了更改,比如a = 30 那么webpack会对bundle.js所有依赖的模块重新打包生成新的bundle.js

//更改a模块后 生成新的bundle.js
// bundle.js
const a = 30;
const b = 20;
const c = return a + b;
export { c };

**总结:**修改了 bundle 模块中的一个子模块, 整个 bundle 文件都会重新打包然后输出,随着项目的扩大,整个项目依赖的子模块会越来越多,则需要打包的资源也增多了,打包的时间也会变得越来越长。

vite

重点:不需要打包,省去打包时间
vite利用浏览器支持的ES Moudle,遇到代码里的import xx from "xxxxxxx",就直接去找对应的资源,找到直接引入就完事了。例如,代码里有

// a.js
const a = () => { return 10 }
export { a }

// b.js
const b = () => { return 20 }
export { b }
// c.js
import { a } from './a'
import { b } from './b'

const c = return a() + b()
export { c }

使用:
image.png
打开控制台可以看到,模块 a b c 三个模块都被请求并加载了!image.png
接下来看看 更改代码的时候,热更新怎样的。
以下只更改a模块里面的代码
image.png
可以看到b模块不会更新,只更新了与a依赖的模块c以及vue文件(注意,若是c模块未在代码里使用,尽管更改了模块 a b的代码都是不会在控制台看到加载的,这就是按需引入

vite热更新原理是什么?


ES Moudle原理请戳open in new window
ES Modules 是用于处理模块的 ECMAScript 标准。 用法:

//script导入
<script type="module" src="index.js"></script>

// import导入
import Vue from 'vue'

// export导出
export default str => str.toUpperCase()
export {a, b, c}

如在vite项目中:
当服务启动时,vite便对当前import的文件进行了监听,热更新其实就是当文件有更改时,vite会判断更改的是什么文件,而采用对应的plugin对文件进行重新编译处理,而后返回给浏览器。并且会在文件加上时间戳,避免浏览器因为缓存而不更新文件。如更改helloworld.vue里面的代码,websocker会发送一个指令给vite,根据指令来执行不同的更新操作。
image.png

vite更新了什么?

官方中文文档: https://vitejs.dev/open in new window
从V1迁移到新版本,最明显的是vue被当成插件plugin抽离出来了,而vite就真真切切成为了一个编译打包工具,新建的时候可以选择需要支持的框架或者单文件

// 新建一个project
npm init @vitejs/app

image.png
选择一个vue项目,发现根目录下多了个vite.config.js文件,这也是此次更新的一大块内容,比如对于打包,sourceMap,server都变得易配置。详情open in new window
image.png