在 Vuex 中,中间件和插件的执行顺序是怎样的?

简介: 在 Vuex 中,中间件和插件的执行顺序是怎样的?

在 Vuex 里,中间件和插件的执行顺序需要结合它们的实现方式以及 Vuex 的工作流程来理解。下面详细介绍它们的执行顺序和相关机制:

1. 插件(Plugins)的执行时机

Vuex 插件是在 store 实例化时就会被初始化并执行的函数。插件可以监听 state 的变化、action 的分发等事件,并且在这些事件发生时执行相应的回调函数。

插件执行顺序

  • 初始化阶段:当创建 Vuex store 实例时,会依次执行注册的插件。插件的执行顺序与它们在 plugins 数组中的顺序一致。
  • 运行时阶段:插件内部通过 store.subscribestore.subscribeAction 注册的回调函数,会在对应的事件(如 mutation 或 action 发生)时被触发。

示例代码

const plugin1 = (store) => {
   
    console.log('Plugin 1 initialized');
    store.subscribe((mutation, state) => {
   
        console.log('Plugin 1: Mutation fired');
    });
};

const plugin2 = (store) => {
   
    console.log('Plugin 2 initialized');
    store.subscribeAction((action, state) => {
   
        console.log('Plugin 2: Action fired');
    });
};

const store = new Vuex.Store({
   
    plugins: [plugin1, plugin2]
});

执行顺序

  1. 初始化阶段:依次输出 Plugin 1 initializedPlugin 2 initialized
  2. 当触发 mutation 时,按注册顺序执行插件中的 subscribe 回调。
  3. 当触发 action 时,按注册顺序执行插件中的 subscribeAction 回调。

2. 中间件(Middleware)的执行时机

在 Vuex 中,虽然没有明确的“中间件”概念,但可以通过重写 store.dispatch 方法来实现类似中间件的功能,这种方式通常在插件内部完成。

中间件执行顺序

  • Action 分发阶段:当调用 store.dispatch 时,会先执行自定义的中间件逻辑,然后再执行实际的 action 处理函数。
  • 嵌套执行:如果有多个中间件,它们会按照注册顺序依次嵌套执行,形成一个“洋葱模型”。

示例代码

const middlewarePlugin = (store) => {
   
    const originalDispatch = store.dispatch;
    store.dispatch = (action) => {
   
        console.log('Before dispatch:', action);
        const result = originalDispatch(action);
        console.log('After dispatch:', action);
        return result;
    };
};

const store = new Vuex.Store({
   
    plugins: [middlewarePlugin]
});

执行顺序

  1. 调用 store.dispatch 时,先执行中间件中的 Before dispatch 日志。
  2. 执行实际的 action 处理函数。
  3. 执行中间件中的 After dispatch 日志。

3. 插件与中间件的综合执行顺序

当同时使用插件和自定义中间件时,它们的执行顺序如下:

  1. 初始化阶段:按注册顺序执行所有插件的初始化逻辑。
  2. Action 分发阶段
    • 执行自定义中间件(通过重写 store.dispatch 实现)。
    • 执行插件中通过 subscribeAction 注册的 before 回调。
    • 执行实际的 action 处理函数。
    • 执行插件中通过 subscribeAction 注册的 after 回调。
  3. Mutation 执行阶段
    • 执行实际的 mutation 处理函数。
    • 执行插件中通过 subscribe 注册的回调。

示例代码

// 中间件插件
const middlewarePlugin = (store) => {
   
    const originalDispatch = store.dispatch;
    store.dispatch = (action) => {
   
        console.log('Middleware: Before dispatch');
        const result = originalDispatch(action);
        console.log('Middleware: After dispatch');
        return result;
    };
};

// 插件 1
const plugin1 = (store) => {
   
    console.log('Plugin 1 initialized');
    store.subscribeAction({
   
        before: (action, state) => {
   
            console.log('Plugin 1: Before action');
        },
        after: (action, state) => {
   
            console.log('Plugin 1: After action');
        }
    });
};

// 插件 2
const plugin2 = (store) => {
   
    console.log('Plugin 2 initialized');
    store.subscribe((mutation, state) => {
   
        console.log('Plugin 2: Mutation handled');
    });
};

const store = new Vuex.Store({
   
    plugins: [middlewarePlugin, plugin1, plugin2]
});

// 触发 action
store.dispatch('increment');

执行输出

Plugin 1 initialized
Plugin 2 initialized
Middleware: Before dispatch
Plugin 1: Before action
// 执行实际的 action 逻辑
Plugin 1: After action
Middleware: After dispatch
// 执行 mutation
Plugin 2: Mutation handled

4. 注意事项

  • 插件执行顺序:插件的注册顺序会影响它们的执行顺序,特别是在处理共享状态或副作用时需要注意。
  • 中间件性能:过多的中间件或复杂的中间件逻辑可能会影响性能,建议只在必要时使用。
  • 异步操作:对于异步 action,中间件和插件的回调会在异步操作开始或结束时触发,具体取决于代码实现。

通过理解插件和中间件的执行顺序,可以更有效地管理状态变化和副作用,提高代码的可维护性和性能。

目录
相关文章
|
1月前
|
中间件
在 Vuex 中,如何使用中间件?
在 Vuex 中,如何使用中间件?
133 76
|
1月前
|
存储 JavaScript 中间件
Vuex 中间件和 Pinia 中间件的性能有何区别?
Vuex 中间件和 Pinia 中间件的性能有何区别?
165 74
|
1月前
|
JavaScript 前端开发 中间件
对比 Vuex 和 Pinia 中间件在不同场景下的性能表现
对比 Vuex 和 Pinia 中间件在不同场景下的性能表现
207 76
|
1月前
|
存储 监控 中间件
中间件和插件在 Vuex 中的作用有什么区别?
中间件和插件在 Vuex 中的作用有什么区别?
149 75
|
1月前
|
监控 中间件
如何在 Vuex 中实现类似 Pinia 中间件的功能?
如何在 Vuex 中实现类似 Pinia 中间件的功能?
158 71
|
1月前
|
缓存 监控 前端开发
中间件和插件的区别是什么?
中间件和插件的区别是什么?
200 67
|
安全 中间件
学习 | egg.js 中间件和插件
小小又开始学习了,这次学习的是中间件和插件。 这次将会对这两个点,进行学习。
1021 28
|
中间件 数据库
多个koa中间件执行顺序
多个中间件执行顺序 多个中间件会形成一个栈结构(middle stack),以"先进后出"(first-in-last-out)的顺序执行。 最外层的中间件首先执行。
2528 30
|
中间件 Java 应用服务中间件
中间件小姐姐直播“带货”——阿里程序员必知的插件
小姐姐这次给大家讲解的是一款 IDE 插件—— Cloud Toolkit, 能够提高开发、部署应用的效率,还可以通过插件快速创建 Dubbo 工程等等,自去年 12 月上线以来,就超过几万的开发者在使用这款插件。
2209 29
|
中间件 Python 开发者
Django中间件执行顺序
中间件 Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。
1601 28