专栏导航
前言
参考源码pinia V2.0.14
源码分析仓库:https://github.com/vkcyan/goto-pinia
上一篇文章我们主要介绍了如何搭建一个pinia源码阅读环境;本文主要介绍pinia在vue3初始化阶段相关逻辑,以及如何构建pinia对象。
正文
根据官方文档,我们使用pinia首先需要是将它注册到vue中
1 | const pinia = createPinia(); |
createPinia阶段究竟做了什么,他又是如何被注册到vue中呢?我们要从createPinia中寻找答案。
源码地址
我们通过pinia\src\index.ts找到
1 | export { createPinia } from './createPinia' // `pinia\src\createPinia.ts为源码文件` |
createPinia函数
在函数的最开头,我们就可以看到通过effectScope声明了一个ref,并赋值给了state,这里的effectScope是高级API,未来会单独介绍,有兴趣的同学可以看一下官方文档,我们将其简单理解为声明了一个ref并赋值给state。
1 | export function createPinia(): Pinia { |
pinia通过markRaw进行包装,将其标记为不会转化为响应式,最终pinia对象被createPinia函数返回,执行vue.use(pinia)的时候便会执行pinia对象中的install函数。
1 | export function createPinia(): Pinia { |
返回值的含义以及作用

初始化的逻辑相对比较简单,只需要了解effectScope markRaw便能完全读懂,install阶段组成的pinia对象被setActivePinia保存了下来,而这个对象贯穿pinia整个生命周期,每个字段的作用在后面的源码解读中都会有所体现。
关于Vue2
通过pinia官网,我们可以了解到pinia支持vue2,不过vue2环境需要在使用createPinia之前,预先安装插件PiniaVuePlugin,通过pinia的入口文件了解到PiniaVuePlugin的源码入口为pinia\src\vue2-plugin.ts
PiniaVuePlugin是vue2插件比较主流的实现方式,获取Vue实例,通过mixin实现数据共享。如果了解过vuex的源码,相信对以下代码会十分熟悉。
1 | export const PiniaVuePlugin: Plugin = function (_Vue) { |
关于devTool
在createPinia中存在这样一段代码
1 | if (__DEV__ && IS_CLIENT && !__TEST__) { |
如果是开发环境,并且是浏览器环境,并且不是测试环境,就会向pinia注册devtoolsPlugin,也就是将pinia注册到浏览器插件Vue.js devtools中。

结语
createPinia的源码解读就全部结束了,现在我们已经了解初始化的具体流程,以及生成的pinia对象中存在什么参数,这些参数在运行阶段都会发挥它应用的价值。
下一章我们将要解析创建以及使用pinia的相关源码,defindStore函数实现逻辑,在defindStore中我们将会了解到install阶段每个字段的实际用途,以及pinia的核心响应原理。