手把手完成前端Vue3 + Vite项目工程化搭建

这篇具有很好参考价值的文章主要介绍了手把手完成前端Vue3 + Vite项目工程化搭建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

vue3_vite_project

基于 Vue3 + Vite 搭建的前端工程化项目演示模板

环境准备

  • 开发环境:Node.js v16.14.2 + npm v8.3.2
  • 开发工具:Visual Studio Code or WebStorm
  • 源代码管理:Git
  • npm镜像:npm config set registry https://registry.npmmirror.com

技术栈

技术栈 描述
Vue 渐进式 JavaScript 框架
Vite 新一代前端开发与构建工具
Element Plus 基于 Vue 3,面向设计师和开发者的组件库
Pinia 符合直觉的 Vue.js 状态管理库
vue-router Vue.js 的官方路由管理库
Sass CSS 预处理器
VueUse 基于 Vue 组合式 API 的实用工具集
Axios 用于浏览器和 Node.js 的基于 Promise 的 HTTP 请求库
Echarts 一个基于 JavaScript 的开源可视化图表库
Eslint 可配置的 JavaScript 检查器
Prettier 代码格式化工具

项目构建

#创建项目
npm create vite

#安装依赖
npm install

#启动项目
npm run dev

#构建项目
npm run build

到这一步,如果能成功运行项目,恭喜你!一个项目的基本框架已经搭建完成!

整理项目结构

主要是让项目工程更加感觉清晰

<!--src/App.vue-->
<template>
  <div>
    <h1>App</h1>
  </div>
</template>

删除 src/style.css 文件

删除 src/main.js 中引入的 style.css 文件

使用 Git 管理源代码

#Git仓库初始化
git init

#添加所有文件到版本库
git add .

#提交所有文件到版本库
git commit -m "feat: 项目初始化完成"

#新建 dev 分支,并切换到 dev 分支
git checkout -b dev

本地代码仓库初始化完成,之后的开发工作都在当 dev 分支上进行

根据技术栈提供的文档,完成项目搭建

安装 Element Plus 组件库

#安装 Element Plus
npm install element-plus

引入 Element Plus 组件库并使用测试安装结果

# src/main.js

import { createApp } from 'vue'
import ElementPlus from 'element-plus' # 新增
import 'element-plus/dist/index.css' # 新增
import App from './App.vue'

const app = createApp(App)
app.use(ElementPlus) # 新增:使用 Element Plus 组件库
app.mount('#app')

测试安装结果

<!--src/App.vue-->
<template>
  <div>
    <h1>App</h1>
    <el-button type="primary">button</el-button>
  </div>
</template>

当按钮能正常显示时,说明安装成功

安装 Vue Router 路由管理库

#安装 Vue Router
npm install vue-router

在项目的 src 目录下新建一个 views 目录,然后在 views 目录下新建两个页面,用于路由跳转。

在项目的 src 目录下新建一个 router 目录,然后在 router 目录下新建一个 index.js 文件,该文件会作为 Vue Router 的入口文件,该文件内容如下

// src/router/index.js
import {createRouter, createWebHistory} from "vue-router";

const router = new createRouter({
    history: createWebHistory(),
    routes: [
        {
            path: "/login",
            name: "Login",
            component: () => import("../views/login/index.vue"),
        },
        {
            path: "/dashboard",
            name: "Dashboard",
            component: () => import("../views/dashboard/index.vue"),
        },
    ]

})
export default router

在 src/main.js 文件中引入 Vue Router,并使用 Vue Router

// src/main.js
// ...
import router from './router' // 新增
app.use(router) // 新增:使用 Vue Router
// ...

修改 App.vue 文件,添加路由跳转

<template>
  <div class="app-container">
    <ul>
      <li><router-link to="/dashboard">首页</router-link></li>
      <li><router-link to="/login">登录</router-link></li>
    </ul>
    <router-view />
  </div>
</template>

访问首页和登录页,查看路由是否正常跳转

router-linkrouter-view 是 Vue Router 的两个核心组件,router-link 是用来实现路由跳转,router-view 是用来显示路由对应的内容。

安装 Pinia 状态管理库

#安装 Pinia
npm install pinia

在项目的 src 目录下新建一个 store 目录,然后在 store 目录下新建一个 index.js 文件,该文件会作为 Pinia 的入口文件

// src/store/index.js
import {createPinia} from 'pinia'

const pinia = createPinia()
export default pinia

在 src/main.js 文件中引入 Pinia,并使用 Pinia

// src/main.js
// ...
import pinia from './store' // 新增
app.use(router) // 新增:使用 Pinia
// ...

在 src/store 目录下创建一个 modules 目录,然后在 modules 目录下创建一个 user 状态管理对象,用于管理整个项目的用户登录状态

// src/store/modules/user.js
import {defineStore} from 'pinia'
import {ref} from 'vue'

const useUserStore = defineStore('user', () => {
    const userInfo = ref({})
    const loginStatus = ref(false)
    const token = ref('')
    /**
     * 登录
     */
    function handleLogin() {
        return new Promise((resolve, reject) => {
            if(Math.random() > 0.8){
                loginStatus.value = true
                token.value = String(new Date().getTime())
                userInfo.value = {
                    name: 'admin',
                    avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif?imageView2/1/w/80/h/80',
                }
                resolve('登录成功')
            }else {
                reject('登录失败')
            }
        })
    }

    /**
     * 退出登录
     */
    function handleLogout() {
        return new Promise((resolve) => {
            loginStatus.value = false
            token.value = ''
            userInfo.value = {}
            resolve()
        })
    }

    return {
        userInfo,
        loginStatus,
        token,
        handleLogin,
        handleLogout
    }
})

export default useUserStore

在登录页面,使用 Pinia 获取用户状态管理对象,并调用登录方法

<!--src/views/login/index.vue-->
<script setup>
import useUserStore from '../../store/modules/user'
const userStore = useUserStore()
import {ElMessage } from 'element-plus'

/**
 * 登录
 */
function login() {
  userStore.handleLogin().then((res) => {
    ElMessage.success(res)
  }).catch(err => {
    ElMessage.error(err)

  })
}

/**
 * 退出登录
 */
function loginOut() {
  userStore.handleLogout().then(() => {
    ElMessage.success('退出登录成功')
  }).catch(err => {
    ElMessage.error(err)
  })
}
</script>

<template>
<div class="login-container">
  <el-button type="primary" @click="login">登 录</el-button>
  <el-button type="primary" @click="loginOut">退出登录</el-button>

  <hr>
  <h1>当前登录状态:{{ userStore.loginStatus ? '已登录' : '未登录' }}</h1>
  <ul>
    <li>用户名:{{ userStore.userInfo.name }}</li>
    <li>头 像:<img :src="userStore.userInfo.avatar" alt=""></li>
  </ul>
</div>
</template>

安装 Sass CSS 预处理器

#安装 Sass,安装时需要添加 -D 参数,表示将 Sass 添加到开发依赖中,在打包过程中,Sass 会自动编译为 CSS
npm install sass -D

在项目的 src 目录下新建一个 styles 目录,然后在 styles 目录下新建一个 variables.scss 文件,该文件存放全局的 Sass 变量

//src/styles/variables.scss
$success: #48C78E;
$danger: #F28482;

在首页测试 Sass 变量,在 src/views/dashboard/index.vue 文件中修改如下

<template>
  <h1 class="success">这是一个成功样式</h1>
  <h2 class="danger">这是一个告警样式</h2>
</template>

<style scoped lang="scss">
.success{
  color:$success;
}
.danger{
  color: $danger;
}
</style>

此时浏览器会提示 Undefined variable. ,因为我们需要在 vite.config.js 文件中引入该文件,才能使用 Sass 变量

// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
    plugins: [vue()],
    css: {
        // CSS 预处理器
        preprocessorOptions: {
            // 定义全局 SCSS 变量
            scss: {
                javascriptEnabled: true,
                additionalData: "@use '/src/styles/variables.scss' as *;",
            },
        },
    },
})

查看页面会显示成功和告警样式,表示 Sass 变量已经正常工作了

安装 VueUse 工具库

#安装 VueUse
npm i @vueuse/core

在 src/views/dashboard/index.vue 文件中,使用 VueUse 的 useMouse 方法,获取当前鼠标实时位置

<script setup>
import {useMouse} from '@vueuse/core'
const {x,y} = useMouse()
</script>
<template>
  <h1 class="success">这是一个成功样式</h1>
  <h2 class="danger">这是一个告警样式</h2>

  <p>当前鼠标位置:X:{{ x }}、Y:{{ y }}</p>
</template>

<style scoped lang="scss">
.success{
  color:$success;
}
.danger{
  color: $danger;
}
</style>

页面上会实时显示鼠标的位置,表示 VueUse 工具库已经正常工作了,需要使用其它函数,可以参考 VueUse 文档

安装 Axios 网络请求库

#安装 Axios
npm install axios

在 src 目录下新建一个 utils 目录,然后在 utils 目录下新建一个 request.js 文件,在该文件中,可以在发起请求前向请求头中添加一些请求头等信息

// src/utils/request.js
import axios from  'axios'

const request = axios.create({
    baseURL: 'http://xxx.xxx.xxx.xxx // 请求的后端接口地址
})
/**
 * 请求拦截器
 */
request.interceptors.request.use(config => {
    console.log('请求参数:',config)
})
/**
 * 响应拦截器
 */
request.interceptors.response.use(response => {
    console.log('响应参数:',response)

})

export default request

在 src 目录下新建一个 api 目录,然后在 api 目录下新建一个 user.js 文件,在该文件中,封装一些用户相关的接口

import request from "../utils/request";

/**
 * 获取验证码
 * @param checkKey
 */
export function getCodeInfo(checkKey) {
    return request({
        method: "get",
        url: `/xxx/xxx/${checkKey}`,
    });
}

回到登录页面,测试获取验证码接口,修改如下:

<script setup>
import {getCodeInfo} from '../../api/user'
import {onMounted, ref} from "vue";

const captchaInfo = ref('')
onMounted(() => {
  getCodeInfo(new Date().getTime()).then(({data}) => {
    captchaInfo.value = data.result
  })
})

</script>

<template>
<div class="login-container">
  <ul>
    <li>验证码:<img :src="captchaInfo" alt=""></li>
  </ul>
</div>
</template>

页面上成功显示了验证码,表示 Axios 工具库已经正常工作了,之后其它 API 接口都统一放到 src/api 目录下统一管理

安装 Echarts 图表库

#安装 Echarts
npm install echarts

在 src/views/dashboard/index.vue 文件中,使用 Echarts 的 init 方法,初始化一个图表

<script setup>
import * as echarts from 'echarts';
import {onMounted, ref} from "vue";

const chartRef = ref(null)
let echartClient = null
onMounted(() => {
  initChart()
})
function initChart() {
  echartClient =  echarts.init(chartRef.value)
  echartClient.setOption({
    tooltip: {},
    xAxis: {
      data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
    },
    yAxis: {},
    series: [
      {
        name: '销量',
        type: 'bar',
        data: [5, 20, 36, 10, 10, 20]
      }
    ]
  })
}

</script>
<template>
  <div class="chart-box" ref="chartRef" ></div>
</template>

<style scoped lang="scss">
.chart-box{
  width: 600px;
  height: 400px;
}
</style>

页面上可以看到一个柱状图,表示 Echarts 工具库已经正常工作了

安装 Eslint 代码检查工具

#安装 Eslint 及相关插件
npm install eslint -D
npm install eslint-config-airbnb-base -D
npm install eslint-define-config -D
npm install eslint-plugin-import -D
npm install eslint-plugin-vue -D

在项目更目录下新建一个 .eslintrc.js 文件,配置如下:

// .eslintrc.js
const { defineConfig } = require("eslint-define-config");

module.exports = defineConfig({
  root: true,
  env: {
    browser: true,
    node: true,
    jest: true,
    es6: true,
  },
  plugins: ["vue"],
  parser: "vue-eslint-parser",
  parserOptions: {
    ecmaVersion: "latest",
    sourceType: "module",
    allowImportExportEverywhere: true,
    ecmaFeatures: {
      jsx: true,
    },
  },
  extends: [
    "eslint-config-airbnb-base",
    "eslint:recommended",
    "plugin:vue/vue3-essential",
    "plugin:vue/vue3-recommended",
    "plugin:vue/vue3-strongly-recommended",
    "plugin:import/recommended",
    "plugin:import/errors",
    "plugin:import/warnings",
    // ".eslintrc-auto-import.json", // 解决 Eslint 提示 no-undef 错误
    "prettier",
    "plugin:prettier/recommended",
  ],
  /**
   * 规则说明:off 或 0 - 关闭规则;warn 或 1 - 打开规则作为警告(不影响退出代码);error 或 2 - 打开规则作为错误(退出代码将为 1)
   */
  rules: {
    // 不使用制表符
    "prettier/prettier": 2,
    // 强制使用分号
    semi: [2, "always"],
    // 强制使用双引号
    quotes: [2, "double"],
    // 解决最后一个逗号
    // "comma-dangle": [2, "never"],
    // 关闭默认参数应为最后一个
    "default-param-last": 0,
    // 禁止未使用的变量
    "no-unused-vars": 1,
    // 关闭组件命名规则
    "vue/multi-word-component-names": 0,
    // 禁止使用多余的包
    "import/no-extraneous-dependencies": 0,
    // 确保在导入路径内一致使用文件扩展名
    "import/extensions": 0,
    // 确保导入指向可以解析的文件/模块
    "import/no-unresolved": 0,
    // 首选默认导出导入/首选默认导出
    "import/prefer-default-export": 0,
    // 要求使用 let 或 const 而不是 var
    "no-var": 2,
    // 禁止使用 new 以避免产生副作用
    "no-new": 1,
    // 禁止变量声明与外层作用域的变量同名
    "no-shadow": 0,
    // 禁用 console
    "no-console": 0,
    // 禁止标识符中有悬空下划线
    "no-underscore-dangle": 0,
    // 禁止在可能与比较操作符相混淆的地方使用箭头函数
    "no-confusing-arrow": 0,
    // 禁用一元操作符 ++ 和 --
    "no-plusplus": 0,
    // 禁止对 function 的参数进行重新赋值
    "no-param-reassign": 0,
    // 禁用特定的语法
    "no-restricted-syntax": 0,
    // 禁止在变量定义之前使用它们
    "no-use-before-define": 0,
    // 禁止直接调用 Object.prototypes 的内置属性
    "no-prototype-builtins": 0,
    // 禁止可以在有更简单的可替代的表达式时使用三元操作符
    "no-unneeded-ternary": 2,
    // 禁止重复模块导入
    "no-duplicate-imports": 2,
    // 禁止在对象中使用不必要的计算属性
    "no-useless-computed-key": 2,
    // 禁止不必要的转义字符
    "no-useless-escape": 0,
    // 禁用 continue 语句
    "no-continue": 0,
    // 强制使用一致的缩进
    indent: [2, 2, { SwitchCase: 1 }],
    // 强制使用骆驼拼写法命名约定
    camelcase: 0,
    // 强制类方法使用 this
    "class-methods-use-this": 0,
    // 要求构造函数首字母大写
    "new-cap": 2,
    // 强制一致地使用 function 声明或表达式
    "func-style": 0,
    // 强制一行的最大长度
    "max-len": 0,
    // 要求 return 语句要么总是指定返回的值,要么不指定
    "consistent-return": 0,
    // 强制switch要有default分支
    "default-case": 2,
    // 强制剩余和扩展运算符及其表达式之间有空格
    "rest-spread-spacing": 2,
    // 要求使用 const 声明那些声明后不再被修改的变量
    "prefer-const": 2,
    // 强制箭头函数的箭头前后使用一致的空格
    "arrow-spacing": 2,
    // 只强制对象解构,不强制数组解构
    "prefer-destructuring": [2, { object: true, array: false }],
    // 禁止在对象中使用不必要的计算属性
    "no-unused-expressions": 0,
  },
});

修改 package.json 文件,在 scripts 中添加 "lint": "eslint --ext .js,.vue --fix src" ,运行 npm run lint 命令,会自动修复所有代码问题

安装 Prettier 代码格式化工具

#安装 Prettier 及相关插件
npm install -D prettier
npm install -D eslint-plugin-prettier

在项目根目录下新建一个 .prettierrc.cjs 文件,配置如下:

module.exports = {
  // JSX 中的右尖括号是否换行,默认false
  jsxBracketSameLine: false,
  // 文件末尾是否换行,默认true
  endOfLine: "auto",
  // 换行符类型 (lf|crlf|cr;默认lf)
  rangeStart: 0,
  // 单个属性是否换行,默认false
  singleAttributePerLine: false,
  // 是否使用双引号,默认true
  doubleQuote: true,
  // 是否使用单行注释,默认false
  experimentalTernaries: false,
  // (x)=>{},单个参数箭头函数是否显示小括号。(always:始终显示;avoid:省略括号。默认:always)
  arrowParens: "always",
  // 开始标签的右尖括号是否跟随在最后一行属性末尾,默认false
  bracketSameLine: false,
  // 对象字面量的括号之间打印空格 (true - Example: { foo: bar } ; false - Example: {foo:bar})
  bracketSpacing: true,
  // 是否格式化一些文件中被嵌入的代码片段的风格(auto|off;默认auto)
  embeddedLanguageFormatting: "auto",
  // 指定 HTML 文件的空格敏感度 (css|strict|ignore;默认css)
  htmlWhitespaceSensitivity: "css",
  // 当文件已经被 Prettier 格式化之后,是否会在文件顶部插入一个特殊的 @format 标记,默认false
  insertPragma: false,
  // 在 JSX 中使用单引号替代双引号,默认false
  jsxSingleQuote: false,
  // 每行最多字符数量,超出换行(默认80)
  printWidth: 120,
  // 超出打印宽度 (always | never | preserve )
  proseWrap: "preserve",
  // 对象属性是否使用引号(as-needed | consistent | preserve;默认as-needed:对象的属性需要加引号才添加;)
  quoteProps: "as-needed",
  // 是否只格式化在文件顶部包含特定注释(@prettier| @format)的文件,默认false
  requirePragma: false,
  // 结尾添加分号
  semi: true,
  // 使用单引号 (true:单引号;false:双引号)
  singleQuote: false,
  // 缩进空格数,默认2个空格
  tabWidth: 2,
  // 元素末尾是否加逗号,默认es5: ES5中的 objects, arrays 等会添加逗号,TypeScript 中的 type 后不加逗号
  trailingComma: "es5",
  // 指定缩进方式,空格或tab,默认false,即使用空格
  useTabs: false,
  // vue 文件中是否缩进 <style> 和 <script> 标签,默认 false
  vueIndentScriptAndStyle: false,
};

修改 package.json 文件,在 scripts 中添加 "prettier": "prettier --write src/**/*.{vue,js,jsx,ts,tsx,json,css,scss,md}" ,运行 npm run prettier 命令,会自动格式化所有代码

性能优化及打包策略

配置 Element Plus 按需导入

#安装插件
npm install -D unplugin-vue-components unplugin-auto-import

修改 vite.config.js 文件,添加了 vue, vue-router, @vueuse/core 相关函数自动导入配置

自动导入 src/**/components 目录下的组件,无需在页面中手动导入组件,添加了路径别名,@ 默认指向 src 目录,导入模块的时候可以直接使用 import xxx from "@/xxx/xxx" 形式

// vite.config.js
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
import { resolve } from "path";

const pathSrc = resolve(__dirname, "src");

export default defineConfig({
  plugins: [
    vue(),
    // 自动导入
    AutoImport({
      // 自动导入 Vue 相关函数,如:ref, reactive, toRef 等
      imports: ["vue", "vue-router", "@vueuse/core"],
      resolvers: [
        // 自动导入 Element Plus 相关函数
        ElementPlusResolver(),
      ],
      eslintrc: {
        enabled: true, // 解决 Eslint 提示 no-undef 错误
      },
      // 配置文件位置 (false:关闭自动生成)
      dts: resolve(__dirname, "src/types/auto-imports.d.ts"),
    }),
    Components({
      resolvers: [
        // 自动导入 Element Plus 组件
        ElementPlusResolver(),
      ],
      // 指定自定义组件位置(默认:src/components)
      dirs: ["src/**/components"],
      // 配置文件位置 (false:关闭自动生成)
      dts: resolve(__dirname, "src/types/components.d.ts"),
    }),
  ],
  resolve: {
    // 导入文件时省略文件扩展名
    extensions: [".js", ".ts", ".vue", ".json", "es"],
    // 配置路径别名
    alias: { "@": pathSrc },
  },
  // ...
});

删除 src/main.js 文件中之前引入的 Element Plus 的代码

// src/main.js
import { createApp } from "vue";
// import ElementPlus from "element-plus";  // 删除
import router from "./router";
import pinia from "./store";
// import "element-plus/dist/index.css";  // 删除
import App from "./App.vue";

const app = createApp(App);
app.use(router);
app.use(pinia);
// app.use(ElementPlus); // 删除
app.mount("#app");

删除 src/views/login/index.vue 中的 import { ElMessage } from "element-plus"; 代码,现在所有与 Element Plus 相关的代码都被自动导入了,无需再手动引入。

修改 .eslintrc.cjs 文件中 extends 项,添加 ".eslintrc-auto-import.json" 配置,解决 Eslint 提示 no-undef 错误

# ...
extends: [
# ...
  ".eslintrc-auto-import.json", # 解决 Eslint 提示 no-undef 错误
]
# ...

按需导入 Echarts 图表库

src/utils 文件夹下创建 echarts.js 文件,把需要用到的图表组件导入到该文件中,在需要使用 Echarts 的地方直接导入该文件,这样就可以按需导入 Echarts 图表库了

// src/utils/echarts.js

// 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
import * as echarts from "echarts/core";
// 引入柱状图图表,图表后缀都为 Chart
import { BarChart } from "echarts/charts";
// 引入提示框,标题,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
import {
  TitleComponent,
  TooltipComponent,
  GridComponent,
  DatasetComponent,
  TransformComponent,
} from "echarts/components";
// 标签自动布局、全局过渡动画等特性
import { LabelLayout, UniversalTransition } from "echarts/features";
// 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
import { CanvasRenderer } from "echarts/renderers";

// 注册必须的组件
echarts.use([
  TitleComponent,
  TooltipComponent,
  GridComponent,
  DatasetComponent,
  TransformComponent,
  BarChart,
  LabelLayout,
  UniversalTransition,
  CanvasRenderer,
]);

export default echarts;

修改 src/views/dashboard/index.vue 文件,引入 src/utils/echarts.js 文件,这样就可以按需导入 Echarts 图表库了

// import * as echarts from "echarts"; // 删除
import echarts from "@/utils/echarts"; // 新增
// ...

打包静态资源优化

#安装插件
npm install terser -D

修改 vite.config.js 文件,添加了 terser 配置,打包时会自动压缩 js 文件,配置了 build.rollupOptions 将打包后的静态资源按文件类型进行分类

import { defineConfig } from "vite";
// ...

export default defineConfig({
 // ...
  // 预览模式配置
  preview: {
    port: 8081,
    open: true,
  },
  // 开发模式配置
  server: {
    https: false, // 是否开启 https
    port: 8080, // 端口号
    host: "0.0.0.0", // 监听所有地址
    open: true, // 服务启动时是否自动打开浏览器
    cors: true, // 允许跨域
    proxy: {}, // 自定义代理规则
  },
  // 构建配置
  build: {
    chunkSizeWarningLimit: 2000, // 消除打包大小超过500kb警告
    minify: "terser", // Vite 2.6.x 以上需要配置 minify: "terser", terserOptions 才能生效
    terserOptions: {
      compress: {
        keep_infinity: true, // 防止 Infinity 被压缩成 1/0,这可能会导致 Chrome 上的性能问题
        drop_console: true, // 生产环境去除 console
        drop_debugger: true, // 生产环境去除 debugger
      },
      format: {
        comments: false, // 删除注释
      },
    },
    rollupOptions: {
      output: {
        // 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值
        entryFileNames: "js/[name].[hash].js",
        // 用于命名代码拆分时创建的共享块的输出命名
        chunkFileNames: "js/[name].[hash].js",
        // 用于输出静态资源的命名,[ext]表示文件扩展名
        assetFileNames: (assetInfo) => {
          const info = assetInfo.name.split(".");
          let extType = info[info.length - 1];
          // console.log('文件信息', assetInfo.name)
          if (/\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/i.test(assetInfo.name)) {
            extType = "media";
          } else if (/\.(png|jpe?g|gif|svg)(\?.*)?$/.test(assetInfo.name)) {
            extType = "img";
          } else if (/\.(woff2?|eot|ttf|otf)(\?.*)?$/i.test(assetInfo.name)) {
            extType = "fonts";
          }
          return `${extType}/[name].[hash].[ext]`;
        },
      },
    },
  },
});

开启 Gzip 压缩

#安装插件
npm install vite-plugin-compression -D

修改 vite.config.js 文件,添加了 vite-plugin-compression 插件

import { defineConfig } from "vite";
// ...
import viteCompression from "vite-plugin-compression";


export default defineConfig({
  plugins: [
    // ...
    viteCompression(),
  ],
// ...
});

Vite 构建项目时开启 Gzip 压缩后,为了确保 Nginx 能够正确处理并返回 Gzip 压缩后的文件,你需要在 Nginx 服务器上进行相应的配置

http {
    gzip on;
    gzip_static on; # 开启静态gzip功能,优先返回预压缩的.gz文件
    server {
        listen 8080;
        server_name localhost;
        location / {
              root /usr/share/nginx/html/dist; # 替换为你的实际项目部署目录
              index  index.html index.htm;
              try_files $uri $uri/ /index.html;
              # 指定如果存在预压缩文件,则优先返回 .gz 文件
              gzip_static always;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

在这个配置中,Nginx会在接收到请求时首先查找是否存在对应的.gz预压缩文件,如果存在则直接返回该文件,否则会返回原始未压缩的文件。

确保Vite构建时生成的预压缩文件与原始文件位于同一目录下,并且命名规范遵循Nginx的预期(即与原始文件同名,但扩展名为.gz)。同时,在重启Nginx服务后使新配置生效。文章来源地址https://www.toymoban.com/news/detail-847520.html

到了这里,关于手把手完成前端Vue3 + Vite项目工程化搭建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mars3D手把手开发教程(vue3)

    Mars3D三维可视化平台  是火星科技 (opens new window)研发的一款基于 WebGL 技术实现的三维客户端开发平台,基于Cesium (opens new window)优化提升与B/S架构设计,支持多行业扩展的轻量级高效能GIS开发平台,能够免安装、无插件地在浏览器中高效运行,并可快速接入与使用多种GIS数

    2024年04月15日
    浏览(81)
  • Docker容器部署前端Vue服务——手把手教学

    需要工具: Xftp Xshell   首先对前端项目进行打包:npm run build   打包完成 ​ 在项目中生成dist文件: 通过Xshell在/home目录下创建项目文件夹 通过Xftp将打包的dist文件上传到服务器的项目文件夹下; 利用Xshell在拉取nginx镜像 在项目文件夹下编写nginx config配置文件 default.conf内容

    2024年02月07日
    浏览(62)
  • vue系列(三)——手把手教你搭建一个vue3管理后台基础模板

    目录 一、前言: 二、网站页面分析 三、开发步骤 (一)、安装element (二)、安装使用svg插件 (三)、编写主界面框架代码  (四)、编写菜单栏  (五)、新建页面及路由 (六)、定制页面标签栏 第一步: 第二步: (七)、修改封装菜单栏 (八)、添加面包屑 四、结

    2023年04月24日
    浏览(61)
  • vue项目打包部署-手把手教程

    1.购买服务器 可选阿里云/腾讯云/华为云 等等… 购买时选择镜像,我们这里以CentOS为例 2.配置服务器 2.1 安装FinalShell ​ 需要本地使用一些软件来操作服务器,例如:FinalShell / Xshell … ​ 我这里使用的是FinalShell,安装好以后,打开软件与建立链接,就可以用命令行来操作服务器了 最

    2024年02月22日
    浏览(59)
  • [手把手系列之]Docker 部署 vue 项目

    Docker 作为轻量级虚拟化技术,拥有持续集成、版本控制、可移植性、隔离性和安全性等优势。本文使用Docker来部署一个vue的前端应用,并尽可能详尽的介绍了实现思路和具体步骤,以方便有类似需要的同学参考。 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应

    2024年03月24日
    浏览(64)
  • 手把手教你完成一个Python与OpenCV人脸识别项目(对图片、视频、摄像头人脸的检测)超详细保姆级记录!

    课程来源: 一天搞定人脸识别项目!学不会up直接下跪!(python+opencv)_哔哩哔哩_bilibili 环境配置详见: 在conda虚拟环境中安装OpenCv并在pycharm中使用_conda虚拟环境安装opencv_好喜欢吃红柚子的博客-CSDN博客 目录 一、读取图片 1.1 imshow和WaitKey方法   1.2 代码实现 1.3 效果展示 

    2024年02月03日
    浏览(40)
  • 手把手教你在Linux/Windows系统使用Nginx部署多个前端项目【详细操作】

            需求:项目上线需要将前端的前台和后台部署在服务器上提供用户进行使用,部署在不同的服务器直接在服务器安装nginx即可。但是在内网安装还是有点麻烦,因为需要联网,如果是内网可以参考Linux安装Nginx并部署前端项目【内/外网-保姆级教程】_MXin5的博客-CSDN博

    2024年02月14日
    浏览(61)
  • 手把手教你使用vue2搭建微前端micro-app

    ​ 本文主要讲述新手小白怎么搭建micro-app,几乎是每一步都有截图说明。上手应该很简单。 这段时间在网上找了很多有关微前端相关的知识,起初本来是想着先搭建一个single-spa,但是奈何网上能找到的内容都是千篇一律。我也是搭了好久没搭出来。不知道为啥,反正就是一

    2024年01月20日
    浏览(52)
  • 【运维】手把手教你在Linux/Windows系统使用Nginx部署多个前端项目【详细操作】

            需求:项目上线需要将前端的前台和后台部署在服务器上提供用户进行使用,部署在不同的服务器直接在服务器安装nginx即可。但是在内网安装还是有点麻烦,因为需要联网,如果是内网可以参考Linux安装Nginx并部署前端项目【内/外网-保姆级教程】_MXin5的博客-CSDN博

    2024年02月08日
    浏览(61)
  • 手把手教你实现一个JavaWeb项目:创建一个自己的网页博客系统(前端+后端)(一)

    一篇博客带你实现一个真正的项目!  先来看看它是什么样式的: 目录: 1、大体步骤🦖:         1、创建Maven项目🦕         2、引入依赖🦕         3、创建必要的目录🦕         4、编写代码🦕         5、打包部署(基于SmartTomcat)🦕         

    2024年02月06日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包