Vue 进阶,Vuex 核心概念 + 项目打包发布配置全解析

Vue 开发中,Vuex是状态管理的核心工具(统一管理全局数据),而打包发布是项目上线的关键步骤。

一、Vuex:Vue 的全局状态管理工具

当多个组件需要共享数据(如用户信息、购物车)时,Vuex 可以统一管理这些 "全局状态",避免组件间频繁通信。

1. Vuex 核心概念(5 大模块)

Vuex 的核心由StateGetterMutationActionModule组成(本文先讲前 4 个基础模块):

(1)State:存储全局状态

State是 Vuex 的 "数据仓库",用于存储全局共享的数据。

示例:

javascript 复制代码
// src/store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);

export default new Vuex.Store({
  // 全局状态
  state: {
    userInfo: null, // 用户信息
    cartCount: 0 // 购物车数量
  }
});

组件中使用 State:

vue 复制代码
<!-- 方式1:直接通过$store访问 -->
<div>{{ $store.state.cartCount }}</div>

<!-- 方式2:通过mapState辅助函数(更简洁) -->
<div> {{ cartCount }} </div>
<div> {{ userInfo }} </div>

<script>
import { mapState } from 'vuex';
export default {
  computed: {
    ...mapState(['cartCount', 'userInfo'])
  }
};
</script>

(2)Getter:对 State 的计算属性

Getter类似 Vue 的computed,用于对State进行计算、过滤(结果会缓存)。

示例:

javascript 复制代码
// src/store/index.js
export default new Vuex.Store({
  state: {
    cartList: [
      { id: 1, name: '苹果', count: 2 },
      { id: 2, name: '香蕉', count: 3 }
    ]
  },
  // Getter:计算购物车总数量
  getters: {
    totalCartCount(state) {
      return state.cartList.reduce((sum, item) => sum + item.count, 0);
    }
  }
});

组件中使用 Getter:

vue 复制代码
<!-- 方式1:直接通过$store访问 -->
<template>
  <div>购物车总数:{{ $store.getters.totalCartCount }}</div>
</template>
----------------------
<!-- 方式2:通过mapGetters辅助函数(更简洁) -->
<script>
import { mapGetters } from 'vuex';
export default {
  computed: {
    ...mapGetters(['totalCartCount'])
  }
};
</script>

<template>
  <div>购物车总数:{{ totalCartCount }}</div>
</template>

(3)Mutation:修改 State 的唯一方式

Mutation是同步修改State 的唯一入口(必须是同步函数),用于保证状态变更可追踪。

示例:

javascript 复制代码
// src/store/index.js
export default new Vuex.Store({
  state: { cartCount: 0 },
  // Mutation:定义修改规则
  mutations: {
    // 增加购物车数量
    INCREMENT_CART(state, payload) {
      state.cartCount += payload;
    },
    // 设置用户信息
    SET_USER_INFO(state, userInfo) {
      state.userInfo = userInfo;
    }
  }
});

组件中触发 Mutation:

vue 复制代码
<script>
import { mapMutations } from 'vuex';
export default {
  methods: {
    ...mapMutations(['INCREMENT_CART']),
    addCart() {
      // 方式1:通过mapMutations触发
      this.INCREMENT_CART(1);

      // 方式2:直接通过$store.commit触发
      // this.$store.commit('INCREMENT_CART', 1);
    }
  }
};
</script>

(4)Action:处理异步操作

Action用于处理异步逻辑(如接口请求),最终通过触发Mutation修改 State

示例:

javascript 复制代码
// src/store/index.js
import { login } from '@/api/user'; // 假设已封装登录接口
export default new Vuex.Store({
  mutations: {
    SET_USER_INFO(state, userInfo) {
      state.userInfo = userInfo;
    }
  },
  // Action:处理异步请求
  actions: {
    async loginAction({ commit }, form) {
      const res = await login(form); // 异步请求
      commit('SET_USER_INFO', res.userInfo); // 触发Mutation修改State
      return res; // 返回结果给组件
    }
  }
});

组件中触发 Action:

vue 复制代码
<script>
import { mapActions } from 'vuex';
export default {
  methods: {
    // 方式1:通过mapActions辅助函数(简化写法)
    ...mapActions(['loginAction']),
    async onLoginByMap() {
      const res = await this.loginAction(this.form);
      console.log('登录成功', res);
    },

    // 方式2:原生$store.dispatch调用(更直观)
    async onLoginByDispatch() {
    // dispatch 和 commit 用法一样, 区别就是 commit 调用的是 mutations 的函数, dispatch 调用的是 actions 的函数
      const res = await this.$store.dispatch('loginAction', this.form);
      console.log('登录成功', res);
    }
  }
};
</script>

二、项目打包发布:核心配置

项目开发完成后,需要打包为静态资源部署到服务器,关键配置包括publicPath和 "路由懒加载"。

1. 配置 publicPath:解决资源路径问题

publicPath用于指定项目部署的基础路径(如部署在子目录/my-app/下),避免打包后资源路径错误。

配置方式:

vue.config.js中添加:

javascript 复制代码
// vue.config.js
module.exports = {
  // 若部署在根目录,设为'/';若部署在子目录,设为'/子目录名/'
  publicPath: process.env.NODE_ENV === 'production' ? '/my-app/' : '/'
};

2. 路由懒加载:优化打包体积

默认打包会将所有页面代码打包到一个文件中,体积较大。路由懒加载可以将页面拆分为多个小文件,按需加载。

配置方式:

router/index.js中,将组件导入改为动态导入:

javascript 复制代码
// 原写法:全部打包到一个文件
// import Home from '@/views/Home.vue';

// 懒加载写法:拆分多个文件
const Home = () => import('@/views/Home.vue');
const Login = () => import('@/views/Login.vue');

const routes = [
  { path: '/', component: Home },
  { path: '/login', component: Login }
];

效果:打包后会生成多个chunk文件,访问对应页面时才加载对应的代码,提升首屏加载速度。

相关推荐
hqk7 分钟前
我给 AI 造了一个原型工具:AIWireframeViewer V1
前端·ai编程·vibecoding
Highcharts.js15 分钟前
商业授权与开源图表库如何选择?
前端·javascript·开源·highcharts·chart.js·echarts.js
工具派25 分钟前
写代码时,我把这个本地 AI Commit Message 生成器接进了工作流
前端·后端
一缕清烟在人间35 分钟前
鸿蒙应用开发实战【27】— DatabaseService 数据库初始化
javascript·数据库·harmonyos·鸿蒙系统
LaughingZhu41 分钟前
Product Hunt 每日热榜 | 2026-07-15
前端·人工智能·神经网络·react.js·搜索引擎·前端框架
研☆香44 分钟前
JavaScript 绘制简单不规则图形:三角形与五角星实战教程
开发语言·javascript·ecmascript
想要成为糕糕手1 小时前
NO.48 旋转图像 —— LeetCode 热题 100 面试导向深度解析
javascript·算法·面试
掘金者阿豪1 小时前
从Oracle迁到金仓,第一个月踩的最大的坑就是它
前端·后端
阿黎梨梨1 小时前
从敲下回车到文字逐字出现:AI 流式输出的前端必修课
vue.js·人工智能
铁皮饭盒1 小时前
Bun 制作 IDE 的第一个坑:Electrobun 模拟缩放和关闭,没想到这么难
javascript