Vite 常规配置

九、Vite 常规配置

在 Vite 的常规配置中,我会讲到以下几个方面的配置

  • Vite 开发服务器配置
  • Vite 代理服务配置
  • Vite 中如何配置别名路径
  • Vite 中如何配置多入口,进行多页面开发
  • Vite 中如何配置打包后资源分类存放到对应文件夹

1、Vite 开发服务器配置

当我执行npx vitenpx run vite命令时,会启动一个开发服务。Vite 提供了相关的配置允许更改服务的主机,端口等。

通过修改vite.config.js文件导出对象的server选项中来配置。

具体如下:

import { defineConfig } from "vite";

export default defineConfig({
  server: {
    port: 8880, // 自定义端口,默认为5173
    open: true, // 服务启动后,自动在浏览器中打开,默认是不打开的
    hmr: true, // 为开发服务启用热更新,默认是不启用热更新的
  },
});

更多配置:查阅 Vite 官方文档 - 开发服务选项配置(opens new window)

代码演示

  • 新建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.jsonmenu.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.jsjs/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.htmlindex.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.jsindex.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.cssindex.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)](

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值