Vite
Vite
Vite 是一种新型前端构建工具,能够显著提升前端开发体验。它主要由两部分组成:
- 一个开发服务器,它基于 原生 ES 模块 提供了 丰富的内建功能,如速度快到惊人的 模块热更新(HMR) 。
- 一套构建指令,它使用 Rollup 打包你的代码,并且它是预配置的,可输出用于生产环境的高度优化过的静态资源。
Vite 意在提供开箱即用的配置,同时它的 插件 API 和 JavaScript API 带来了高度的可扩展性,并有完整的类型支持。
你可以在 为什么选 Vite 中了解更多关于项目的设计初衷。
vite的优势冷服务: 默认的构建目标浏览器是能 在 script 标签上支持原生 ESM 和 原生 ESM 动态导入HMR 速度快到惊人的 模块热更新(HMR)
Rollup 打包 它使用 Rollup 打包你的代码,并且它是预配置的 并且支持大部分 rollup 插件
pnpm create v目录结构
public- 不会被编译, 放置静态资源assets- 存放可编译的静态资源components- 存放组件App.vue- 全局组件main.ts- 全局 ts 文件index.html- 非常重要的入口文件**(webpack,rollup 他们的入口文件都是 enrty input 是一个 js 文件 而 Vite 的入口文件是一个 html 文件,他刚开始不会编译这些 js 文件 只有当你用到的时候 如 script src="xxxxx.js" 会发起一个请求被 vite 拦截这时候才会解析 js 文件) **vite.config.ts- vite 配置项tsconfig.json- TS 编译器配置
路径别名配置
vite.config.ts:
// vite.config.js/ts
import { join } from "path";
import { defineConfig } from "vite";
// https://vitejs.dev/config/
export default defineConfig({
resolve: {
alias: {
"@": join(__dirname, "src"),
},
},
});tsconfig.json
{
// ...
"compilerOptions": {
// ...其他配置
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
},
// ...
}如果你是刚创建的 TypeScript 项目,有可能会遇到找不到模块“path”或其相应的类型声明的错误提示,安装@types/node即可。
pnpm install @types/node --save-dev单页面应用与多页面应用

开始
搭建一个 Vite 项目
兼容性注意:
Vite 需要 Node.js 版本
>= 12.0.0。然而,有些模板需要依赖更高的Node版本才能正常运行,当你的包管理器发出警告时,请注意升级你的Node版本。
npmnpm create vite@latestyarnyarn create vitepnpmpnpm create vite
部署静态站点
构建应用
npmnpm run buildpnpmpnpm run build
默认情况下,构建会输出到 dist 文件夹中。你可以部署这个 dist 文件夹到任何你喜欢的平台。
本地测试应用
当构建完成应用后, 可以通过运行 npm run preview 命令, 在本地测试该应用
# pnpm 与 npm 命令一般是相似的
npm run build
npm run preview
# pnpm
pnpm run build
pnpm run previewvite preview 命令会在本地启动一个静态 Web 服务器,将 dist 文件夹运行在 http://localhost:4173。这样在本地环境下查看该构建产物是否正常可用就方便多了。
可以通过 --port 参数来配置服务的运行端口。
{
"scripts": {
"preview": "vite preview --port 8080"
}
}现在 preview 命令会将服务器运行在 http://localhost:8080。
环境变量与模式
环境变量
Vite 在一个特殊的 import.meta.env 对象上暴露环境变量。这里有一些在所有情况下都可以使用的内建变量:
import.meta.env.MODE: {string} 应用运行的模式。import.meta.env.BASE_URL: {string} 部署应用时的基本 URL。他由base配置项决定。import.meta.env.PROD: {boolean} 应用是否运行在生产环境。import.meta.env.DEV: {boolean} 应用是否运行在开发环境 (永远与import.meta.env.PROD相反)
生产环境替换
在生产环境中,这些环境变量会在构建时被静态替换,因此,在引用它们时请使用完全静态的字符串。动态的 key 将无法生效。例如,动态 key 取值 import.meta.env[key] 是无效的。
它还将替换出现在 JavaScript 和 Vue 模板中的字符串。这本应是非常少见的,但也可能是不小心为之的。在这种情况下你可能会看到类似 Missing Semicolon 或 Unexpected token 等错误,例如当 "process.env.NODE_ENV" 被替换为 "development": ""。有一些方法可以避免这个问题:
- 对于 JavaScript 字符串,你可以使用 unicode 零宽度空格
\u200b(一个看不见的分隔符)来分割这个字符串,例如:'import.meta\u200b.env.MODE'。 - 对于 Vue 模板或其他编译到 JavaScript 字符串的 HTML,你可以使用 <wbr> 标签,例如:
import.meta.<wbr>env.MODE。
.env 文件
Vite 使用 dotenv 从你的 环境目录 中的下列文件加载额外的环境变量:
.env # 所有情况下都会加载
.env.local # 所有情况下都会加载,但会被 git 忽略
.env.[mode] # 只在指定模式下加载
.env.[mode].local # 只在指定模式下加载,但会被 git 忽略
环境加载优先级
一份用于指定模式的文件(例如
.env.production) 会比通用形式的优先级更高(例如.env) 。另外,Vite 执行时已经存在的环境变量有最高的优先级,不会被
.env类文件覆盖。例如当运行VITE_SOME_KEY=123 vite build的时候。
.env类文件会在 Vite 启动一开始时被加载,而改动会在重启服务器后生效。
加载的环境变量也会通过 import.meta.env 以字符串形式暴露给客户端源码。
为了防止意外地将一些环境变量泄漏到客户端,只有以 VITE_ 为前缀的变量才会暴露给经过 vite 处理的代码。例如下面这个文件中:
DB_PASSWORD=foobar
VITE_SOME_KEY=123只有 VITE_SOME_KEY 会被暴露为 import.meta.env.VITE_SOME_KEY 提供给客户端源码,而 DB_PASSWORD 则不会。
像
Vben中的.env, 这里所有的变量都会暴露出来
如果你想自定义 env 变量的前缀,请参阅 envPrefix。
安全注意事项
.env.*.local文件应是本地的,可以包含敏感变量。你应该将.local添加到你的.gitignore中,以避免它们被 git 检入。由于任何暴露给 Vite 源码的变量最终都将出现在客户端包中,
VITE_*变量应该不包含任何敏感信息。
TypeScript 智能提示
默认情况下,Vite 在 vite/client.d.ts 中为 import.meta.env 提供了类型定义。随着在 .env[mode] 文件中自定义了越来越多的环境变量,你可能想要在代码中获取这些以 VITE_ 为前缀的用户自定义环境变量的 TypeScript 智能提示。
要想做到这一点,你可以在 src 目录下创建一个 env.d.ts 文件,接着按下面这样增加 ImportMetaEnv 的定义:
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_APP_TITLE: string;
// 更多环境变量...
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}模式
默认情况下,开发服务器 (dev 命令) 运行在 development (开发) 模式,而 build 命令则运行在 production (生产) 模式。
这意味着当执行 vite build 时,它会自动加载 .env.production 中可能存在的环境变量:
# .env.production
VITE_APP_TITLE=My App在你的应用中,你可以使用 import.meta.env.VITE_APP_TITLE 渲染标题。
然而,重要的是要理解 模式 是一个更广泛的概念,而不仅仅是开发和生产。一个典型的例子是,你可能希望有一个 “staging” (预发布|预上线) 模式,它应该具有类似于生产的行为,但环境变量与生产环境略有不同。
你可以通过传递 --mode 选项标志来覆盖命令使用的默认模式。例如,如果你想为我们假设的 staging 模式构建应用:
vite build --mode staging为了使应用实现预期行为,我们还需要一个 .env.staging 文件:
# .env.staging
NODE_ENV=production
VITE_APP_TITLE=My App (staging)现在,你的 staging 应用应该具有类似于生产的行为,但显示的标题与生产环境不同。
比如
Vben中的.env.test
报错收集
listen EACCES: permission denied 127.0.0.1:3000

Too many reserved port for Hyper-V · Issue #5514 · microsoft/WSL (github.com)
windows subsystem for linux - How to fix
listen EACCES: permission deniedon any port - Super User

找不到模块“vue”或其相应的类型声明。ts(2307)
vue3 报错解决:找不到模块‘xxx.vue’或其相应的类型声明。(Vue 3 can not find module) - 小船二 - 博客园 (cnblogs.com)
使用 vite 构建 vue-ts 项目时发现该报错

原因在于 typescript 只能理解 .ts 文件,无法理解 .vue 文件
解决方案: 在项目根目录或 src 文件夹下创建一个后缀为 .d.ts 的文件,并写入以下内容:
declare module "*.vue" {
import { ComponentOptions } from "vue";
const componentOptions: ComponentOptions;
export default componentOptions;
}然后发现本来就已经有了(

重启窗口后再看 HelloWorld.vue, 报错消失了 😅

PS:
App.vue里的错误是vuter报的, 使用 vue3 开发的话可以禁用vuter, 使用volar


