基于Proxy的小程序状态管理

微信小程序的市场在进一步的扩大,而背后的技术社区仍在摸索着最好的实践方案。我在帮助Nike,沃尔玛以及一些创业公司开发小程序后,依旧认为使用小程序原生框架是一个更高效,稳定的选择,而使用原生框架唯独缺少一个好的状态管理库,如果不引入状态管理则会让我们在模块化,项目结构以及单元测试上都有些捉襟见肘。

目前相对比较稳健的做法是针对redux或者mobx做一个adaptor应用到小程序中,但这样需要自己想办法打包引入外部库,还要想怎么去写这个adaptor,总显得有些麻烦。于是我迸发出一个想法去写一个专用于小程序的状态管理库,它使用起来足够简单并且可以通过小程序自己的npm机制安装。

目前我已经用这个开源库开发了两个电商小程序,在提高我开发效率的同时亦保证了程序的性能,所以接下来我想谈谈这背后的理念以启发更多开发者尝试新的解决方案。

基于Proxy的状态管理实现

Proxy在小程序中已经得到了足够好的支持,目前并没有发现在任何iPhone或者Android上不能使用Proxy的情况。而基于Proxy的状态管理其实也就是订阅监听的模式,一方面监听数据的变化,另一方面将这些变化传达给订阅的小程序页面。

举一个比较常见的例子,当一个用户从自己的主页进入用户编辑页面,然后更改了自己的用户名点击保存后,用户主页和用户编辑页上的用户名这时候都应该被更新。这背后的程序逻辑则是:更新这个行为将触发Proxy去通知状态管理库,然后状态管理库负责检查此时还在页面栈中的所有页面,更新订阅了用户名这个数据的页面,如下图:

Part1: 监听数据变化

监听数据变化其实就是监听各个Store的属性变化,实现上就是在各个Store前面加了一层Proxy,用更直观的图片来表示就是这样:

当一个Store被观察以后,它的属性就都变成了Proxy实例,当这个属性值是Object或者Array的时候,它内部的值也会被包装成Proxy实例,这样无论多深层的数据变动都能被监听到。 而在Proxy的后面,Store的属性其实是被另一套数据(紫色部分)所维护,这套数据不负责监听,它就是纯数据,针对属性的任何变动最后都会应用到这套数据上来,它的作用是维护和返回最新的数据。

实现细节: github.com/wwayne/mini…

Part2: 页面数据绑定

因为小程序每个页面的js都是向Page中传递一个对象,这就让我们有机会包装这个对象,从而实现: 1. 进入页面后,将页面保存在页面栈中 2. 将来自状态管理库的数据映射到这个页面的data上来 3. 页面退出时,将页面从页面栈中移除

实现细节: github.com/wwayne/mini…

Part3: 页面订阅更新

当数据被监听到变化后,我们需要依次做两件事,先是找到所有存储在页面栈里的页面,然后根据各个页面订阅的数据来检查变化,如果有变化就通知这些页面,从而让它们去触发setData更新页面。

实现细节:github.com/wwayne/mini…

使用状态管理的例子

有了状态管理库,现在我们就来实现一开始举例的更新用户信息的操作,我们的文件路径如下:

stores/
  user.js
pages/
  userEdit/
     index.js
     index.wxml
复制代码
  1. 首先我们创建一个Store保存用户的信息,并且监听它的变化:
// stores/user.js
import { observe } from 'minii'

Class UserStore {
  constructor () {
     this.name = 'bob'
  }

  changeName (name) {
     this.name = name
  }
}

export default observe(new UserStore(), 'user')
复制代码
  1. 接着在我们的小程序页面订阅Store的信息
// pages/userEdit/index.js
import { mapToData } from 'minii'
import userStore from '../../stores/user'

const connect = mapToData(state => (({
  myName: state.user.name
}))
Page(connect({
  updateNameToJames () {
    userStore. changeName('james')
  }
}))
复制代码
  1. 完成,现在可以在页面中使用和更新数据了
// pages/userEdit/index.wxml
<text>{{ myName }}</text>
<button bindtap="updateNameToJames">update name to James</button>
复制代码

最后

小程序因为有体积的限制,所以我希望在代码量上也尽量做到轻量和便捷,所以目前这个状态管理库并没有太多很复杂的功能,在小程序打包后所占用的体积也不到1kb,颇有点够用就好的意思。

我也已经用它开发了两款小程序,在经历了一段时间的用户使用后,我也更有信心说这个方案在小程序中是可行的。如果你有任何想法和建议,都欢迎告诉我。

项目Github: github.com/wwayne/mini…


关于我

Hi, 我是wwayne,是一名居住在上海的独立软件工程师,我正在开发我的新产品 talk-to.kim, 你可以在Github 或者专栏 一个人写代码找到我

转载于:https://juejin.im/post/5d02f6565188255e780b673b

### 回答1: 基于Kubernetes(简称k8s)的平台技术架构主要由以下几个关键组件组成: 1. Master:负责整个平台的控制和管理,包括监控、调度、扩展等功能。Master节点通常由三个组件组成:API服务器、调度器和控制器管理器。 2. Node:也称为工作节点,负责运行应用程序的容器。节点上的Kubelet服务负责与Master节点通信并监控节点的状态。每个节点上通常还运行着一个容器运行时,如Docker,用于创建和管理容器。 3. Pod:是k8s中的最小调度单位,可以包含一个或多个容器。Pod中的容器共享网络和存储资源,可以相互之间进行通信和共享数据。 4. 控制器:负责处理平台的自愈和自动伸缩能力。比如,ReplicationController可确保指定数量的Pod副本在任何时候都处于运行状态,而Deployment则可以进行滚动升级和回滚。 5. 服务发现和负载均衡:k8s可以自动为Pod提供稳定的网络访问地址,这些地址被封装到服务(Service)对象中。服务可以通过标签(Label)选择器将请求转发到一个或多个后端Pod实例,从而提供负载均衡的功能。 6. 存储管理:k8s提供了多种存储管理方式,如主机路径挂载、共享存储(NFS)、云存储(AWS EBS、Azure Disk等)等,以满足应用程序对持久性存储的需求。 7. 网络管理:k8s可以创建和管理虚拟网络(Virtual Network),使得不同节点上的Pod可以互相通信。此外,还可以通过网络插件(如Calico、Flannel等)实现跨主机的容器网络互联。 基于k8s的平台技术架构通过将应用程序容器化,并提供了一系列功能和工具,使得应用程序的部署、扩展和管理变得更加简单和高效。不仅如此,k8s的开源生态系统还允许第三方开发者开发丰富的插件和扩展,以满足不同场景和需求的应用程序部署和管理需求。 ### 回答2: 基于Kubernetes(简称K8s)的平台技术架构是一种用于管理容器化应用程序的开源容器编排平台。K8s的技术架构主要包括控制节点、工作节点、存储和网络等组件。 在K8s技术架构中,控制节点是整个系统的核心,负责管理和协调整个集群。它包含了多个核心组件,如API Server、Controller Manager、Scheduler等。API Server提供了与外部用户和其他组件交互的接口,Controller Manager负责监控系统状态并做出相应的调整,Scheduler用于调度应用程序到工作节点上。 工作节点是集群中的工作单元,负责运行容器化应用程序。每个工作节点上运行着一个容器运行时(如Docker),同时还有Kubelet进程和Kube-proxy进程。Kubelet是一个代理程序,与控制节点进行通信,负责管理容器的生命周期、资源分配和监控等任务。Kube-proxy负责处理集群内部的网络通信,实现服务的负载均衡和容器的访问控制等功能。 存储是K8s中另一个重要的组件,用于持久化存储应用程序的数据。K8s提供了多种存储解决方案,如本地存储、网络存储和云存储等。用户可以根据应用程序的需要选择适合的存储卷,并通过K8s的存储管理器进行管理。 网络是K8s中连接各个组件的重要环节,负责实现容器之间的通信和服务的访问。K8s提供了多种网络插件,如Flannel、Calico和Weave等,用于实现集群内部的网络互通和外部的网络访问。 总结来说,基于K8s的平台技术架构包括控制节点、工作节点、存储和网络等组件。通过这些组件的协作与配合,K8s能够有效地管理和运行容器化应用程序,实现自动化的部署、扩缩容、负载均衡和故障恢复等功能。 ### 回答3: k8s是一种容器编排平台,为开发者提供了一种简单、高效、可扩展的方式来管理和部署容器化应用程序。基于k8s的平台技术架构主要包括以下几个关键组件: 1. 控制平面(Control Plane):控制平面由一组核心组件组成,负责管理整个kubernetes集群的状态和配置信息。这些核心组件包括API服务器、调度器、控制器管理器和etcd等。API服务器是k8s系统的后端服务,用于管理和接收来自用户和其他组件的请求。调度器负责根据资源需求和约束条件选择将容器调度到集群中的节点。控制器管理器负责监视集群状态变化,并执行相应的操作。而etcd是一个分布式键值存储系统,用于存储集群的配置信息。 2. 节点(Node):节点是实际运行工作负载的主机或虚拟机。每个节点上运行着一个kubelet进程,它是节点上与控制平面通信的代理。kubelet负责管理和监控节点上的容器,并与API服务器通信以接收指令。另外,节点上还运行着kube-proxy,用于实现k8s服务的负载均衡和网络代理。 3. 容器化应用程序:k8s是为容器化应用程序设计的,它提供了一种统一的部署、扩展和管理的方式。开发者可以通过定义一个或多个容器镜像,并将其封装到一个Pod中来描述应用程序的组件。Pod是最小的部署单元,可以包含一个或多个容器。k8s通过创建和管理Pod,保证应用程序的运行和可伸缩性。 4. 网络和存储:k8s提供了可插拔的网络和存储插件,以适应不同的环境和需求。网络插件负责为Pod提供网络连接,使得它们可以互相通信。存储插件则为Pod提供持久化存储,以便应用程序可以存储和访问数据。 基于k8s的平台技术架构能够帮助开发者轻松地构建、部署和管理容器化应用程序,提高开发效率和系统可用性。通过使用k8s的自动化管理和弹性伸缩功能,可以实现高可用性、可扩展性和容错性,从而满足不断变化的业务需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值