Skip to content

安装 vite

sh
# 推荐直接全局安装
npm i -g vite

# 直接用官方模板插件项目: https://vitejs.dev/guide/#trying-vite-online
# 或者也可以实用社区模板: https://github.com/vitejs/awesome-vite#templates
npm create vite@latest my-vue-app --template vue

# vue 就是模板的名字, 如果想插件 react 项目
npm create vite@latest my-react-app --template react

手动配置环境

安装依赖

sh
# vue2 项目依赖
npm i @vitejs/plugin-vue2 -D
npm i vue@2 vue-router@3 vuex@3

# vue3 项目依赖, vuex 可以替换为 pinia 使用哪个包都可以
npm i @vitejs/plugin-vue -D
npm i vue@3 vue-router@4 vuex@4

# react 项目依赖
npm i @vitejs/plugin-react -D
npm i react@18 react-dom@18 react-router@6 react-router-middleware-plus
# react-router-middleware-plus: 路由中间件

vue2 项目配置

js
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue2";

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
});

vue3 项目配置

js
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
});

raect 项目配置

js
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
});

环境变量

使用 import.meta.env 来获取所有的环境变量

js
// 可以结合 zod 来校验 env
console.log(import.meta.env);

glob 导入

glob 导入

js
const dataModules = import.meta.glob("./datas/*.json");

一些有用的插件配置

注入替换字符

这个插件可以将源码中的一些 "特殊字符串" 替换为想要的值(只在打包的时候执行), 这个非常有用, 有时候需要在调试控制台中输出一些打包信息, 或者在某些 API 中返回 package.json 文件中的内容

js
import vue from "@vitejs/plugin-vue";
import { resolve } from "path";
import { defineConfig } from "vite";
import { replaceCodePlugin } from "vite-plugin-replace";
import pkgJson from "./package.json";
import dayjs from "dayjs"; // 注意: 请先安装 dayjs

// 将源码中的 from 替换为 to
const replacements = [
  {
    from: "__BUILD_TIME__",
    to: dayjs().format("YYYY-MM-DD HH:mm:ss"),
  },
  {
    from: "__BUILD_VERSION__",
    to: pkgJson.version,
  },
];

export default defineConfig({
  plugins: [vue(), replaceCodePlugin({ replacements })],
});
js
// src/utils.js
export const version = "__BUILD_VERSION__";

// src/App.vue
import { version } from "./utils";
console.log(version);
sh
npm i vite-plugin-replace -D

自动导入插件配置

不要自动导入太多东西, 只将一些特别常用的库设置为自动导入即可(如: vue composition api) ref reactive cmoputed 因为这种的一看就知道这个 API 是做什么用的, 如果滥用这个插件, 就会导致看代码的时候不知道方法是从哪里来的, 还需要去看配置文件

js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import AutoImport from 'unplugin-auto-import/vite';
import { resolve as resolvePath } from 'path';

// https://vitejs.dev/config/
export default defineConfig({
  resolve: {
    alias: {
      '@': resolvePath('./src'),
    },
  },
  plugins: [
    vue(),
    AutoImport({
      include: [
        // 哪些文件需要自动导入?
        /\.[tj]sx?$/,
        /\.vue$/,
        /\.vue\?vue/,
        /\.md$/,
      ],
      imports: [
        // 1. 使用插件默认的自动导入预设, 支持哪些预设? 请看这里:
        // https://github.com/unplugin/unplugin-auto-import/tree/main/src/presets
        'vue',

        // 2.自定义自动导入
        {
          axios: [
            ['default', 'axios'], // 自动导入 axios
          ],

          // 导入格式如下:
          // "[package-name]": [
          //   "[import-names]",
          //   ["[from]", "[alias]"],
          // ],


          // 2.1 自动导入类型
          {
            from: 'vue-router',
            imports: ['RouteLocationRaw'],
            type: true,
          },
          dts: true,

          // 2.3 禁止 eslint 检测报错
          eslintrc: {
            enabled: false,
            // filepath: './.eslintrc-auto-import.json',
            globalsPropValue: true,
          },
        },
      ],
    }),
  ],
});
ts
import vue from "@vitejs/plugin-vue";
import { defineConfig } from "vite";
import { resolve as resolvePath } from "path";
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
import AutoImportComponents from "unplugin-vue-components/vite";

// https://vitejs.dev/config/
export default defineConfig({
  resolve: {
    alias: {
      "@": resolvePath("./src"),
    },
  },
  plugins: [
    vue(),
    AutoImportComponents({
      // 自动按需导入 element-plus
      extensions: ["vue"],
      include: [/\.vue$/, /\.vue\?vue/],
      resolvers: [ElementPlusResolver()],
    }),
  ],
});

多页应用配置

为什么要使用多页应用的开发方式?

虽然大多数情况下, 单页应用已经足够解决问题了, 但是, 单页应用有个很明显的缺陷, 那就是 SEO 不够友好, 因为所有东西都是 js 动态生成的, 而搜索引擎的爬虫是不会去执行 js 的, 但是有的时候, 需要写一些静态的 "企业官网" 这种多个页面的某一部分高度相似, 而且需要控制不同页面的 title meta 标签, 并且不能是用js动态生成的 那么就需要用一些工具手动来实现 "组件化"

既然要使用多页, 为什么不直接手写?

  1. 直接手写源码不会打包压缩等
  2. 直接手写不好实现 "组件化", 虽然 jquery 有 $.load 这样的方法可以实现复用, 但是那种是需要发送请求的

"组件化"

注意: 这里的组件化, 并不是和 vue 或 react 中的组件一样, 直接使用虚拟 DOM 去实现的, 只是利用模板引擎的导入功能然后编译实现复用(相当于复制多份)

PUG 模板引擎学习

Pug 是一个用 JavaScript 实现的高性能的模板引擎,支持 Node.js 和浏览器运行环境,其灵感来自 Haml 项目

使用 vituum 插件

使用vituum插件就可以很方便的集成 pug 实现多页并且 "组件化"

配置示例

Released under the MIT License.