自从有了vuex开始,就有大批的程序员盲目的跟随,将vuex使用在项目中。如果你是追求快速开发,并不在意代码质量以及后期维护,那么大可使用诸如vuex和pinia之类的第三方类库。但是本文主要讨论为什么不要用这些东西及其原因。
(1) Vuex和Pinia的本质:
Vuex和Pinia的本质就是全局变量。一旦定义了这种变量,就几乎可以在任何文件中访问它们,这把全局变量的缺点全部一股脑带入你的工程。这里不再展开这些缺点。为什么Vuex等宣称自己不是全局变量呢?因为他们经过层层包装,设计本不需要的数据结构和函数让你认为它说的对,设计的好。其实完全不对,这些东西无论包裹多少层,也改变不了它是全局变量的本质。任何地方都可以随便修改。
(2) Vuex和Pinia还会引起性能问题:
在渲染大量使用Vuex和Pinia的组件的时候,由于getter的机制,每个组件都对自己的getter进行计算,会拖慢整个页面的渲染。正确的做法是使用prop将变量传入组件。当然这本质上还是设计问题,跟Vuex什么的关系不大,但是Vuex这些东西给了程序员写烂代码的机会!
(3)带有Vuex和Pinia的代码难以维护:
其实这一条基本也是由于其全局变量引起的。带有Vuex和Pinia的组件自带一种暗示:即任何其它地方都可能修改这个变量。这极大增加了代码的耦合程度,让后期维护非常困难。
(4)不用Vuex和Pinia我不会写代码了怎么办?我应该用什么库?
你什么库也不需要。你需要重新学习组件间传值的方法,以及如何设计组件。另外,记住一句话,如果你需要用Vuex或者Pinia,说明你的组件设计出了问题,需要重新设计。
(5)Vuex和Pinia明明是Vue团队推出的并且推荐使用的呀?你是不是在胡扯?
并没有。设计者并不等于使用者,当局者迷。这东西写一些demo可以,真正用到工程上,那是真的不行,会降低整个工程的代码质量。
(6)用了Vuex的代码难以写测试。
有很多造成大麻烦的地方(这麻烦不是能解决的那种)。比如,你有一个getter,然后测试中你要求这个getter进行变化后继续测试,但是你的测试无法真正做到这一点。有些方法企图直接在测试内出发mutation进行测试,但是这根本就是违背测试的意图,仅仅写出来一个假装的测试。
总之使用Vuex和Pinia就好比,有一个人想放屁,但是他觉得放屁不好,把自己裹在棉被里面,然后再放。虽然闻不到了,但是还是放屁。层层包装改变不了这些类库隐藏创建全局变量的根本意图,强烈建议大家谨慎思考,有自己的想法,不要盲从。所以,你认为我说的不对,大可继续使用这些类库。但是,我是坚决反对使用Vuex和Pinia这些东西的。
祝大家写出好代码。Happy coding😁