vite是下一代前端开发与构建工具。目的在取代webpack,有更加快速的构建速度和热更新速度。
yarn create @vitejs/app
按照命令行提示构建项目即可。
Vite 在一个特殊的 import.meta.env
对象上暴露环境变量。这里有一些在所有情况下都可以使用的内建变量:
import.meta.env.MODE
: {string} 应用运行的模式。import.meta.env.BASE_URL
: {string} 部署应用时的基本URL。import.meta.env.PROD
: {boolean} 应用是否运行在生产环境。import.meta.env.DEV
: {boolean} 应用是否运行在开发环境 (永远与 import.meta.env.PROD
相反)。任何文件中都能访问这些变量,然后在生产环境中被静态替换。
.env
文件.env # 所有情况下都会加载
.env.local # 所有情况下都会加载,但会被 git 忽略
.env.[mode] # 只在指定模式下加载,mode可为production,development或其他自定义值。
.env.[mode].local # 只在指定模式下加载,但会被 git 忽略
为了防止意外地将一些环境变量泄漏到客户端,只有以 VITE_
为前缀的变量才会暴露给经过 vite 处理的代码。
VITE_SOME_KEY=123
我们可以使用vite提供的import.meta.glob
从文件系统导入多个模块。
const modules = import.meta.glob('./src/*.js')
// vite转译为
const modules = {
'./src/main.js': () => import('./src/main.js')
...
}
匹配到的文件默认是懒加载的,通过动态导入实现,并会在构建时分离为独立的 chunk。
for (const path in modules) {
modules[path]().then((mod) => {
console.log(path, mod)
})
}
vite的glob函数是基于fast-glob实现的,简单的规则有:
*
) – 匹配一切除了斜杆(/
)**
) – 匹配所有目录?
) – 匹配任何单个字符除了斜杆(/
)[seq]
) – 匹配任何字符在seq中出现的,如[01]即匹配0或1// vite.config.ts
server: {
proxy: {
// 字符串简写写法
'/foo': 'http://localhost:4567/foo',
// 选项写法
'/api': {
target: 'http://jsonplaceholder.typicode.com',
changeOrigin: true,
// 请求时将/api去掉,即直接请求http://jsonplaceholder.typicode.com
// 而非http://jsonplaceholder.typicode.com/api
rewrite: (path) => path.replace(/^\/api/, '')
},
// 正则表达式写法
'^/fallback/.*': {
target: 'http://jsonplaceholder.typicode.com',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/fallback/, '')
}
}
}
// vite.config.ts
base: './'
import { createApp } from 'vue'
import { createApp } from '@vue/runtime-dom'
第一行裸模块导入,原生ES不支持,但vite将会执行预构建操作或重写为合法的URL。
当两行一起出现的时候(或在不同文件),项目很容易就会报错,可能是重复导入了模块的原因。
当出现报错时,可以用 --force
命令行选项启动开发服务器,或者手动删除 node_modules/.vite
目录。
import { Ref } from 'vue' // error
import type { Ref } from 'vue' // correct
当我们需要从别的文件中导入类型定义时,第一行的做法ts会提示“Ref”仅表示类型,但在此处却作为值使用。ts(2693)
,而且不仅ts会报错,实际运行也会出现未在模块中找到Ref。
所以目前解决方案是第二条的写法,只要导入类型,就要在前面加入type。