介绍
vite是什么
- vite是一个快速、简单且现代化的前端构建工具。
- 它是基于rollup和esbuild的。
- 官网:cn.vitejs.dev/
支持的语言和框架
- vite支持多种前端框架,包括Vue.js、React、Preact等,并能够直接运行TypeScript、JavaScript、CSS、lESS等多种语言。
- vite1.0与vue强绑定,vite2.0开始与框架无关,目前最新的是4.5.0
vite的优势
- 上手非常简单,开箱即用,常用的功能都封装好了
- 开发环境项目启动超快(依赖esbuild)
- 社区成本低(因为基于rollup,所以rollup的插件基本都兼容)
esbuild和rollup简介
esbuild
- 官网:esbuild.github.io/
- go语言(编译型多线程语言,js是解释性单线程语言,性能弱于go)写的,没有配置文件,需要通过命令行使用
- esbuild为什么打包快:zhuanlan.zhihu.com/p/379164359
- 使用esbuild打包react项目
css
// 内置jsx解析
npm i esbuild
npx esbuild index.jsx --outfile=dist.js --bundle
rollup
- 官网:cn.rollupjs.org/
- rollup默认支持es,不支持commonJS,需要使用插件来支持
- 专注于模块打包, 常用于第三方类库的打包
- 使用rollup打包react项目
sql
npm i @babel/preset-react @rollup/plugin-babel @rollup/plugin-commonjs @rollup/plugin-node-resolve rollup
npx rollup -c rollup.config.mjs
相关的其他代码
javascript
// index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div id="root"></div>
<script src="./dist.js"></script>
</body>
</html>
====
// index.jsx
import React from "react";
import { render } from "react-dom";
const domContainer = document.getElementById("root");
const App = () => {
return <h1 onClick={() => alert("hello")}>Hello, world!</h1>;
};
render(React.createElement(App), domContainer);
====
// rollup.config.mjs
import commonjs from "@rollup/plugin-commonjs";
import resolve from "@rollup/plugin-node-resolve";
import babel from "@rollup/plugin-babel";
export default {
input: "index.jsx",
plugins: [
resolve(),
commonjs(),
babel({
presets: ["@babel/preset-react"],
}),
],
output: {
file: "dist.js",
format: "es",
banner: `var process = {
env: {
NODE_ENV: 'production'
}
}`,
},
};
vite基本使用(react项目举例)
初始化
sql
npm create vite@latest
- swc: rust重写的类babel的编译工具
安装依赖
bash
cd xxx
npm i
启动
arduino
npm run dev
vite中使用less
直接安装(无需配置less-loader啥的)
css
npm i less
新建less 文件
less
App.less
@bgColor: orange;
.container{
background-color: @bgColor;
}
使用
arduino
import './App.less'
<div className='container'>xxx</div>
命名空间的使用
ini
App.less ==> App.module.less
====
import styles from './App.module.less'
<div className={styles.container}>hello world</div>
vite中使用less
直接安装(无需配置less-loader啥的)
css
npm i less
新建less 文件
less
App.less
@bgColor: orange;
.container{
background-color: @bgColor;
}
使用
arduino
import './App.less'
<div className='container'>xxx</div>
命名空间的使用
ini
App.less ==> App.module.less
====
import styles from './App.module.less'
<div className={styles.container}>hello world</div>
vite中使用环境变量
import.meta.env
arduino
console.log('env', import.meta.env)
自定义环境变量
- 项目根目录新建.env文件
- 定义VITE_ 开头变量
ini
VITE_CUSTOM_VAE=hello
- 通过import.meta.env获取
- 自动区分 .env.development (npm run dev) 和 .env.production (npm run build) 里的变量
vite中的预编译(启动快原因)
- vite第一次启动时,会把node_module中的包,编译完放到cache 里(node_modules下的.vite),后边用到就直接去cache里取,不再走编译(内置实现了webpack4的cache-loader功能)
- 需要调试第三方库的代码时,注意先把cache删除,否则不是最新的代码
vite中的插件
vite基于rollup封装的,所以rollup的插件天然支持
- github.com/rollup/plug...
- vite中处理json的能力就是利用了@rollup/plugin-json这个插件
vite独有的插件
- cn.vitejs.dev/plugins/
- vite-plugin-progress的使用
-
- 安装
css
npm i vite-plugin-progress -D
- vite.config.js中配置
javascript
import progress from 'vite-plugin-progress'
export default {
plugins: [
progress()
]
}
自己实现一个基本版的vite-mdx-react插件(目的:让mdx文件可以直接当React组件使用)
- mdx = md+jsx,允许在 Markdown 文档中无缝地插入 JSX 代码
- 不使用插件的问题
markdown
// hello.mdx
# hello
## world
- 1
- 2
- 3
1. 第一项
2. 第二项
3. 第三项
1***2***3
```javascript
console.log('123')
```
`123`
> 123
这是一个链接 [百度](https://www.baidu.com)
<div onClick={()=> alert(123)}>123</div>
===
import HelloMDX from "./hello.mdx";
<HelloMDX />
- 解决
-
- 新建vite-mdx-react.js
- 安装依赖
bash
npm i @mdx-js/mdx @rollup/pluginutils -D
- 编写代码
javascript
// 通过vite插件的用法,我们知道vite的plugin本质上就是一个函数
import { createProcessor } from "@mdx-js/mdx";
import { createFilter } from "@rollup/pluginutils";
export default (options = {}) => {
return {
name: 'vite-mdx-react', // 插件名称
/**
* transform: rollup 插件 hooks用来转换代码的
* @param code 源代码
* @param id 文件路径相关信息
*/
transform(code, id){ //
const {include = /.mdx/, exclude} = options // options: 传入的配置
const filter = createFilter(include, exclude) // createFilter: 创建一个过滤器,用来确定哪些文件被rollup插件处理
let result = code
if(filter(id)){
const processor = createProcessor() // 创建一个mdx文件的处理器
result = processor.processSync(code).value // 这个处理器的processSync可以同步把mdx转换为js
}
return {
code: result
}
}
}
}
- vite.config.js
css
import viteMdxReact from "./vite-mdx-react";
plugins: [react(), viteMdxReact()],
小结
Vite的Github仓库累计获得了超过60k Star,每周的下载量达到了720万次,相比去年增长了4倍。 此外,许多知名项目如Storybook、Angular、Preact、Redwood等都开始采用Vite。
尽管取得了这些成就,但Vite仍面临一些挑战,例如生产构建速度相对较慢、开发和生产环境之间的一致性问题等。 为了解决这些问题,Vite团队正在研发一个名为Rolldown(它是使用 Rust 开发的 Rollup 替代品)的新打包工具。
总的来说,Vite正在成为继webpack后的又一个基础工具,越来越多的项目都在其之上构建。 对于前端开发者来说,还是非常有必要了解的。