image.png
官网文档

概览

是什么(What)?

一种新型前端构建工具,能够显著提升前端开发体验。
Vite分两部分,开发时作为一个开发服务器,生产时依赖Rollup为项目打包。

  • 一个开发服务器,它基于 原生 ES 模块 提供了 丰富的内建功能,如速度快到惊人的 模块热更新(HMR)。
  • 一套构建指令,它使用 Rollup 打包你的代码,并且它是预配置的,可以输出用于生产环境的优化过的静态资源。

优势(Why)?

简单的了解和体验下来,感觉其最核心的优势在:开发快、配置方便;
Vite最早是随Vue3一起发布,最初也是只支持Vue,但早期版本迅速迭代掉了,如今的Vite已经能支持各种主流框架,而且提供了初始化模版,项目配置起来比较简单了。

Vite为什么在开发时快呢?
官网有一节专门讲了:Why Vite?总结几个核心的原因:

  • esbuild: Vite 使用 esbuild 预构建依赖。Esbuild 使用 Go 编写,并且比以 JavaScript 编写的打包器预构建依赖快 10-100 倍。
  • 动态导入代码: Webpack,即使是在开发阶段,也是从入口开始,遍历每一个依赖的文件,将他们进行转换和整合。但是得益于ESM被浏览器支持,浏览器本身就能接管了打包程序的部分工作,Vite做的事情是,对当前屏幕上实际使用的相关文件进行相关转换处理。

image.png
webpack模式
image.png
esm模式
上面这两幅图的对比再次强调了这样的不同:Vite启动的时候没有编译全部,不像webpack从entry进去每一个依赖的模块都编译一遍。这就可以说是按需求编译的,因为浏览器支持esm,所以不需要讲这些js文件合并成一个文件,也就不用都编译一遍了。

为了支持这个特性,Vite有一个重要的约定就是,项目入口在index.html(不是 .js 了),文件如下所示:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <link rel="icon" href="/favicon.ico" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>Vite App</title>
  8. </head>
  9. <body>
  10. <div id="app"></div>
  11. <!--这里是入口 -->
  12. <script type="module" src="/src/main.js"></script>
  13. </body>
  14. </html>

过程是这样的: 浏览器加载这个html,必然会加载那个script(type=”module”),所以,浏览器的请求到达了vite 的dev server,server去查找这个文件,然后编译这些文件。(这里参考这篇文档

初体验

Vite新建项目(@vitejs/app)

官网参考

  1. npm init @vitejs/app 或者 yarn create @vitejs/app
  2. 选择模版

image.png
这几个模版 vanilla(原生的)、vue、react、preact….比如选择react,选择react-ts,就这样就创建完成

  1. yarn 或yarn install(不推荐npm install 可能会报错)
  2. 看下vite-react的目录结构,熟悉的src、yarn.lock、tsconfig.json,vite.config.js是vite的配置文件,index.html是vite的入口,上面已经说过

image.png
这就体验一下:yarn dev
WO CAO~真快,确实是秒开!!!!

基础功能体验

(纯粹参考和实验官网文档所介绍的内容 )

依赖解析

尽管浏览器支持esm,但浏览器无法仅仅通过’my-dep’找到依赖路径,所以需要转换:

  1. import { someMethod } from 'my-dep'

Vite的解法是:

  1. 预构建:CommonJS / UMD 转换为 ESM 格式
  2. 导入重写为合法的 URL,例如 /node_modules/.vite/my-dep.js?v=f3sf2ebd,这样浏览器能够正确导入它们

TS支持

Vite 直接能用 .ts 文件。但是,Vite 仅执行 .ts 文件的翻译工作,不做类型检查。
这怎么办呢,按照ts:

  1. yarn add typescript

(你可以在构建脚本中运行 tsc —noEmit,比如,package.json中”build”:”tsc —noEmit&& vite build”, )。
另外还有一点:
Vite 使用 esbuild 将 TypeScript 翻译到 JavaScript,约是 tsc 速度的 20~30 倍。

但是, esbuild 只执行转译工作而不含类型信息,它不支持 TypeScript 的特定功能例如常量枚举和隐式 “type-only” 导入。你必须在你的 tsconfig.json 中的 compilerOptions 里设置 “isolatedModules”: true,这样 TS 才会警告你哪些功能无法与独立编译模式一同工作。

上面这段话啥意思,简单来说就是要配置 “isolatedModules”: true,否则小心线上问题。

  1. import IA from './type'
  2. const a: IA = {}
  3. export { IA } // 导出了一个类型

上面的代码,如果不开这个配置,你将不会发现这里报错,所以需要留心,枚举也是一样,那就别用了?

css支持

可以使用css variable:

:root{
  --commonColor: red;
}

.my{
  color: var(--commonColor);
}

postCss集成支持

很简单,搞个postcss.config.js就好,比如这个可以编译css的时候打印log:

// in postcss.config.js
module.exports = {
  plugins:[require("@postcss-plugins/console")]
}

css-modules

命名 index.module.css,以 .module.css 为后缀名的文件会被认为是css moudule

预编译工具支持

.scss, .sass, .less, .styl 和 .stylus 文件的内置支持。直接安装就能用 比如,yarn less

import资源

图片

Vite中导入一个静态资源会返回解析后的 URL

import avatarPng from './assets/yxnne_avatar.png'

// ...
<img src={avatarPng} />

json

直接可以引入

import pkg from '../package.json'
console.log('pkg', pkg)

// {name: 'vite-react', version: '0.0.0', scripts: {…}, dependencies: {…}, devDependencies: {…}}

vite中import的一些语法

  • 返回url ```javascript //import test from ‘./test’ import test from ‘./test?url’ // 这样返回的是./test.js的路径

console.log(‘>>’, test) // >> /src/test.js


- 返回文件字符raw
```javascript
//import test from './test'
import test from './test?raw' // 这样返回的是./test.js的路径 

console.log('>>', test) // 这里是这个文件的源代码
/*

>> const a = 1

export {a}

*/
  • worker用于加载web worker
    // 加载为 Web Worker
    import Worker from './worker.js?worker'
    

    Worker支持

    worker.js: ```javascript var i = 0

function task() { i += 1 postMessage(i) setTimeout(task, 1000) }

task()

使用app.js:
```javascript
import Worker from './worker.js?worker'

const worker = new Worker()
worker.onmessage = e => {
  console.log(e.data)
}

WASM支持

https://www.assemblyscript.org/introduction.html,fib.wasm 这样得到:asc fib.ts —binaryFile fib.wasm —optimize

import init from './fib.wasm'

init({}).then(m => {
  console.log(m?.fib(10))
})

vite中使用eslint
.eslintrc.js

环境变量

参考这里
vite中使用环境变量是通过这样:import.meta.env

console.log(import.meta.env)

// 得到对象的属性:
// BASE_URL: "/"
// DEV: true
// MODE: "development"
// PROD: false
// SSR: false

除了使用这些默认的环境变量,当然可以增加自定义的env,在根目录下新建文件.env:

VITE_HI = hello

注意,自定义的环境变量必须是 VITE_ 开头的
另外,不同的模式可区别加载环境变量文件,这是根据.env文件名后缀区分,默认就不加后缀。

  • .env.development是在开发阶段加载,.
  • env.production是线上环境加载(run build出来的都是production环境);

也可以通过添加启动参数,制定开发环境,从而加载不同的.env文件:
vite —mode test 可以去加载 .env.test

自定义环境变量没有ts提示?可以在vite.env.d.ts中声明

/// <reference types="vite/client" />

interface ImportMetaEnv {
  VITE_TITLE: string
}

以上就是简单的体验了一下vite,后续继续学习它的高级功能和原理~