为什么我们决定不使用GraphQL进行本地状态管理

前言和动机

在OkCupid188bet金宝搏官网,我们非常喜欢使用GraphQL.当涉及到在任何客户机平台上获取数据时,查询语言提供的抽象为我们提供了在每种情况下精确获取所需数据的灵活性。

它是如何工作的

答案是什么都没有。如果将状态存储在应用程序中的某个地方,理论上可以使用状态数据解析GraphQL查询。实现从阿波罗(在我们看来,实际上是gql的所有东西的提供者),我们尝试使用一个GraphQL指令来表示给定查询的哪些部分应该以这种方式解析:@client

query getAllMessages($userId: ID!) {
用户(id: $ userId) {
的名字
profilePic
消息{
id
记者{
的名字
profilePic

isOpen @client


类型ResolverFn = (
父:任何,
参数:任何,
{cache: ApolloCache}
) = >;
const defaultResolver = {
查询:{
用户:{
消息:{
isOpen: (parent, args, {cache}) => {
//引用缓存来获取你的数据
cache.readQuery ({
查询:MESSAGE_IS_OPEN_QUERY,
变量:{
消息id: parent.id,
},
});
},
},
},
},
};
//定义初始的客户端状态
const defaultState = {
用户:{
消息:{
isOpen:假的,


const client = new ApolloClient({
//其他阿波罗配置,例如link
//和缓存定义
解析器:defaultResolver,
});
//使用初始状态初始化缓存
client.writeData ({
查询:MESSAGE_IS_OPEN_QUERY,
data: {defaultState,},
});

我们遇到的问题

那么,为什么我们决定不执行这个呢?这个决定背后的理由肯定是特定于我们的设想的,也许对其他人来说不那么重要,但确实包含了一些见解,我认为这是任何踏上阿波罗之路的人都必须考虑的因素。

开发开销和学习曲线

尽管这可以作为一个阶段管理解决方案,但它也带来了一些新的开销。现在,我们必须为客户端状态编写解析器,尽管情况正是如此任何国家管理选项,它不像看起来那么简单。

新东西,借来的东西?

好吧,我们已经在OkC使用Redux了,在一些旧代码的例子中,甚至使用了Reflux。在我们的应用程序中添加一个新的状态管理选项将会导致一团混乱,这对于刚加入我们团队的人来说无疑是非常复杂的。就我个人而言,我认为开发人员经验和可维护性应该是任何架构或框架决策的决定性因素。

其他选项

我们也一直在试验React的上下文API,并且在未来可能也会考虑一些其他的选择。然而,考虑我们选择的内容对捆绑包大小的影响也非常重要。Context/Apollo能够完全消除对状态管理依赖的需求吗?对于一些更简单的应用程序,我认为已经有一些例子证明Context已经足够了。同样,也有一些阿波罗解决方案的例子!还有Facebook的新开源产品MobX反冲,甚至使用状态机来建模客户端状态XState

我们在哪里上网?

很难不承认阿波罗所做的令人难以置信的工作。Apollo和GraphQL在清理api和客户端的通用网络层方面做得很好。然而,将其作为状态管理的一种选择,对我们的代码库有重大的影响,而且考虑到Apollo的客户端状态管理的成熟度和我们当前的客户端状态设置,我们只是觉得这个争论不够有说服力。在我看来,在拥有大量现有架构的代码库中实现一些新内容的投资回报率需要相对较高。我只是不确定阿波罗的投资回报是否足够高。

188bet金宝搏官网OkCupid科技博客

阅读来自OkCupid工程团队的故事,每天连188bet金宝搏官网接着数百万人

尼克·布兰德

写的

软件工程师·NYC·https://nickbrandt.dev

188bet金宝搏官网OkCupid科技博客

188bet金宝搏官网OkCupid的工程团队负责每天为数百万人配对。在OkCupid科技博客上阅读他们的故事188bet金宝搏官网

尼克·布兰德

写的

软件工程师·NYC·https://nickbrandt.dev

188bet金宝搏官网OkCupid科技博客

188bet金宝搏官网OkCupid的工程团队负责每天为数百万人配对。在OkCupid科技博客上阅读他们的故事188bet金宝搏官网