九、Vite 常规配置
在 Vite 的常规配置中,我会讲到以下几个方面的配置
- Vite 开发服务器配置
- Vite 代理服务配置
- Vite 中如何配置别名路径
- Vite 中如何配置多入口,进行多页面开发
- Vite 中如何配置打包后资源分类存放到对应文件夹
1、Vite 开发服务器配置
当我执行npx vite
或npx run vite
命令时,会启动一个开发服务。Vite 提供了相关的配置允许更改服务的主机,端口等。
通过修改vite.config.js
文件导出对象的server
选项中来配置。
具体如下:
import { defineConfig } from "vite";
export default defineConfig({
server: {
port: 8880, // 自定义端口,默认为5173
open: true, // 服务启动后,自动在浏览器中打开,默认是不打开的
hmr: true, // 为开发服务启用热更新,默认是不启用热更新的
},
});
代码演示
- 新建
index.html
文件,内容如下
<script type="module" src="./index.js"></script>
- 新建
index.js
文件,内容如下:
console.log("Hello Vite");
- 在根目下,新建
vite.config.js
文件,内容同上。
注:
最后,我执行npx vite
来启动服务,会自动在浏览器打开"http://127.0.0.1:8880"
地址访问服务。
接下来,我把index.js
中的内容改为console.log("Hello HMR")
同时保存,发现浏览器控台输出内容自动更新为“Hello HMR"
(本质是启用了热更新)
2、Vite 代理服务配置
当我在项目中利用Ajax
向服务端发请求时,会遇到跨域的限制。
为了能让请求成功,我通常会在请求和真实服务之间架设一个代理服务。代理服务再向真实服务器发请求拿到数据并返回给到客户端。
Vite 允许我为开发服务配置自定义代理规则,我只需要在
server.proxy
选项下进行相关配置就可。
server.proxy 配置
import { defineConfig } from 'vite'
export default defineConfig({
server:{
proxy:{
// /api是字符串 http://localhost:5173/api 的简写法
// 以下表示,当我向 http://localhost:5173/api地址及下级路径发请求时,帮我转发到`http://127.0.0.1:8990/api`地址及对应的下级路径发请求
// http://localhost:5173/api --> http://127.0.0.1:8990/api
// http://localhost:5173/api/menu --> http://127.0.0.1:8990/api/menu
"/api":"http://127.0.0.1:8990/api
//
}
}
})
2.1、代码演示 -(项目结构)
我利用node
来搭建两个请求数据的服务
http://127.0.0.1:8990/api/menu
获取菜单数据http://127.0.0.1:8990/api/course
获取课程数据
然后在 Vite 项目中,利用axios
向上面两个地址发送请求来获取数据。
因为受到跨域限制,所以我需要设置开发服务的代理服务,利用代理服务帮帮我拿到数据并转发给我。
整体项目目录结构如下
vite
├─ data // JSON数据,node服务会读取JSON文件中内容,然后返回给客户端
│ ├─ blog.json
│ └─ menu.json
├─ index.html // Vite 项目的入口文件
├─ index.js // 文件中会利用axios向服务端发请求获取数据
├─ node-api.js // 搭建node服务,返回JSON数据
├─ package-lock.json
├─ package.json
└─ vite.config.js // 配置文件
2.2、代码演示 - 搭建 node 服务
node-api.js
文件内容如下 :
const http = require("http"); // 加载http模块,用来创建http服务
const fs = require("fs"); // 加载fs模块,用来操作文件
// 创建http服务,req请求对象 res响应对象
http
.createServer((req, res) => {
// 获取请求地址主机端口后地址
const url = req.url;
// 设置响应头,响应的数据类型
res.writeHead(200, {
"Content-Type": "application/json",
});
// 请求地址拦截
if (url === "/api/menu") {
// 读取JSON文件中数据,并响应到客户端
const data = fs.readFileSync("./data/menu.json", "utf-8");
res.end(data);
} else if (url === "/api/blog") {
const data = fs.readFileSync("./data/blog.json", "utf-8");
res.end(data);
} else {
res.end("Hello Node");
}
})
.listen("8990"); // 设置端口号
// 服务器正常启动,打印下面这句话作为提示
console.log("Server running at http://127.0.0.1:8990");
- data 文件夹中
blog.json
和menu.json
文件,内容如下
{
"code": "0000",
"data": [
{
"blogName": "vite下一代的前端工具链",
"imageUrl": "https://img-blog.csdnimg.cn/8441a1c7b63b4e60abebafecea16e16a.png",
"desc": "CSS 的默认处理行为CSS 模块化处理CSS 预处理器CSS 兼容性处理限定大小的图片转为 Base64 编码JSON 的导入JSON 支持具名导入"
},
{
"blogName": "Vite静态资源处理",
"imageUrl": "https://img-blog.csdnimg.cn/8441a1c7b63b4e60abebafecea16e16a.png",
"desc": "Vite(法语意为 “快速的”,发音 /vit/,发音同 “veet”)是一种新型前端构建工具,能够显著提升前端开发体验,其最大的特点就是快 !"
}
],
"message": "成功"
}
{
"code": "0000",
"data": [
{
"category_id": 1001,
"title": "人气 TOP"
},
{
"category_id": 1002,
"title": "爆款套餐"
},
{
"category_id": 1003,
"title": "咖啡"
},
{
"category_id": 1004,
"title": "奶茶"
},
{
"category_id": 1005,
"title": "甜品小点"
}
],
"message": "成功"
}
注:
以上文件创建好后,只需要 Vite 目录执行node node-api.js
就可以启动node
服务。
访问http://127.0.0.1:8990/api/menu
和http://127.0.0.1:8990/api/blog
地址,可以查看到返回的 JSON 字符串。
如下:
2.3、代码演示 - 搭建 Vite 项目
index.html
文件内容如下
<script type="module" src="./index.js"></script>
index.js
文件内容如下
import axios from "axios";
// 向 http://localhost:5173/api/menu 发请求,因为设置了代理,代理转发向http://127.0.0.1:8990/api/menu 发请求
axios.get("/api/menu").then((res) => {
console.log(res.data.data);
});
// 向 http://localhost:5173/api/course 发请求 因为设置了代理,代理转发向http://127.0.0.1:8990/api/course 发请求
axios.get("/api/course").then((res) => {
console.log(res.data);
});
vite.config.js
配置文件内如下
import { defineConfig } from "vite";
export default defineConfig({
server: {
proxy: {
"/api": "http://127.0.0.1:8990",
},
},
});
注:
最后执行npx vite
启动开发服务,访问http://localhost:5173/
地址,可以看到控制台正常打印了请求到的内容。
如果我把配置文件中内容去掉,就会出现报错。
3、Vite 中如何配置别名路径
- 当我在访问静态资源时,如果书写的路径非常长,那每次书写时就会非常麻烦。
- 如果能把相同部分的路径用别名代替,那我在书写路径时只需要书写别名+不同的路径部分就好了。
我可以在
vite
的配置文件中, 为文件系统路径配置别名,如下:
import { defineConfig } from 'vite'
export default defineConfig({
resolve:{
alias:{
/*
@js 为 路径 /src/assets/js 的别名
导入JS: import { username } from "/src/assets/js/basic.js"
可简写成: import { username } from "@js/basic.js"
*/
"@js":"/src/assets/js",
}
})
注意事项
- 当使用文件系统路径的别名时,请始终使用绝对路径,相对路径的别名值会原封不动地被使用,因此无法被正常解析。
- 在
index.html
项目入口文件中不要使用别名加载文件,因为启动开发服务并不会对源码
3.2、代码演示:为路径配置别名
- 新建项目目录结构如下:
vite
├─ index.html
├─ package-lock.json
├─ package.json
├─ src
│ └─ assets
│ ├─ css
│ │ └─ index.css
│ ├─ images
│ │ └─ a.jpg
│ └─ js
│ ├─ basic.js
│ └─ index.js
└─ vite.config.js
index.html
文件内容如下:
<script type="module" src="/src/assets/js/index.js"></script>
在
index.html
文件加载的 JS 和 CSS,不要使用别名,因为在开发服务下,并不会去解析别名,所以会出现找不到资源的 404 错误。
css/index.css
内容如下:
body {
background-color: skyblue;
}
js/index.js
与js/basic.js
内容如下:
// js/index.js
import "@css/index.css";
import url from "@images/a.jpg";
import { username } from "@js/basic.js";
document.body.innerHTML = ` <img src="${url}" />---- ${username}`;
// js/basic.js
export const username = "艾编程";
vite.config.js
文件内容如下
import { defineConfig } from 'vite'
export default defineConfig({
resolve:{
alias:{
"@images":"/src/assets/images",
"@js":"/src/assets/js",
"@css":"/src/assets/css",
}
}
})
// 或下面写法
import { defineConfig } from 'vite'
import { resolve } from 'path';
export default defineConfig({
resolve:{
alias:{
"@images":resolve(__dirname,"src/assets/images"),
"@js":resolve(__dirname,"src/assets/js"),
"@css":resolve(__dirname,"src/assets/css"),
}
}
})
最后,执行
npx vite
,在浏览器中可以访问到如下效果,说明配置生效了。
4、vite 中如何配置多入口,进行多页面开发
- Vite 在开发环境下默认是多入口开发的
- 在生产环境下,如果想要多入口开发,需要额外的配置。
- Vite 在生产环境下是利用
rollup
来实现打包,所以我需要对rollup
的打包入口进行配置。
生产环境下多入口打包配置如下
import { defineConfig } from "vite";
import { resolve } from "path";
export default defineConfig({
// 生产环境下打包配置在build选项中配置
build: {
// rollup 相关配置在rollupOptions选项中配置
rollupOptions: {
// 打包入口,以下是多入口
input: {
index: resolve(__dirname, "index.html"),
app: resolve(__dirname, "app.html"),
},
},
},
});
代码演示
- 新建项目录如下
vite
├─ app.html
├─ index.html
├─ package-lock.json
├─ package.json
├─ src
│ └─ assets
│ ├─ css
│ │ ├─ app.css
│ │ └─ index.css
│ ├─ images
│ │ ├─ app.jpg
│ │ └─ index.jpg
│ └─ js
│ ├─ app.js
│ └─ index.js
└─ vite.config.js
app.html
和index.html
内容如下
<!--app.html内容-->
<script type="module" src="/src/assets/js/app.js"></script>
<!--index.html内容-->
<script type="module" src="/src/assets/js/index.js"></script>
app.js
和index.js
内容如下
// app.js 内容
import "/src/assets/css/app.css";
import url from "/src/assets/images/app.jpg";
document.body.innerHTML = `<img src="${url}" />`;
// index.js
import "/src/assets/css/index.css";
import url from "/src/assets/images/index.jpg";
document.body.innerHTML = `<img src="${url}" />`;
app.css
和index.css
内容如下
/* app.css */
body {
background-color: skyblue;
}
/* index.css */
body {
background-color: red;
}
vite.config.js
文件中配置同上
执行
npx vite build
打包,然后执行npx vite preview
预览打包的项目,按我预期显示以下内容
接下来,我看下生成的dist
目录下的文件,其结构如下。
dist
├─ app.html
├─ assets
│ ├─ app-632f0828.js
│ ├─ app-8cce9ece.jpg
│ ├─ app-d0983e99.css
│ ├─ index-244a1ddb.jpg
│ ├─ index-28a21df5.css
│ ├─ index-f029a56b.js
│ └─ modulepreload-polyfill-3cfb730f.js // 自动注入的 模块预加载 polyfill
└─ index.html
注:
观察上面,发现所有资源文件全部打包后放在了dist/assets
目录下,如果我想按文件类型,将 JS、CSS、Images 分别放到 JS、CSS、Images 文件夹,还需要我做额外配置。
modulepreload
模块预加载:可以预加载原生模块,保证某些文件可以不必等到执行时才加载
5、Vite 打包后资源分类存到对应文件夹
针对上面项目,如果我想按文件类型,将 JS、CSS、Images 分别放到 JS、CSS、Images 文件夹。
可以做如下配置
import { defineConfig } from "vite";
import { resolve } from "path";
export default defineConfig({
build: {
rollupOptions: {
// 打包输出路径,默认是dist/assets,以下相当于dist/static
assetsDir: "static",
// 打包入口,以下是多入口
input: {
index: resolve(__dirname, "index.html"),
app: resolve(__dirname, "app.html"),
},
// 出口设置
output: {
// 入口文件中JS输出地址
entryFileNames: "static/js/[name]-[hash].js",
// 对代码分割中产生的 chunk 自定义命名
chunkFileNames: "static/chunk/[name]-[hash].js",
// 资源出口路径(如:图片、css等)
assetFileNames: function (assetInfo) {
const name = assetInfo.name;
if (/.css$/.test(name)) {
return "static/css/[name]-[hash].[ext]";
} else if (/.[jpe?g|png|gif]$/.test(name)) {
return "static/images/[name]-[hash].[ext]";
} else {
return "static/[ext]/[name]-[hash].[ext]";
}
},
},
},
},
});
执行npx vite build
打包后,生成的dist
目录结构如下
dist
├─ app.html
├─ index.html
└─ static
├─ css
│ ├─ app-d0983e99.css
│ └─ index-28a21df5.css
├─ images
│ ├─ app-8cce9ece.jpg
│ └─ index-244a1ddb.jpg
├─ js
│ ├─ app-0e78e232.js
│ └─ index-8695444c.js
└─ chunk
└─ modulepreload-polyfill-3cfb730f.js
关于 rollup 更多配置,大家可以参考 [rollup 官网的配置选项(opens new window)](