JavaScript获奖软件库Immer的主要贡献者Alec Larson在几天前发布了该软件的第四次主迭代版本,针对一些边缘情况打了补丁。作为JavaScript软件库,Immer通过一种称为“写入时复制(copy-on-write)”的机制,支持开发人员在像操作可变状态一样便利地操作不可变状态。今年,Immer荣获了多项殊荣,包括响应式开源奖( React open source award)中的“年度最具突破者”(Breakthrough of the year),以及JavaScript开源奖(JavaScript open source award)中的“最具影响贡献者”(Most impactful contribution)。
Immer(德语,表示“一以贯之”)软件库支持JavaScript开发人员像操作可变状态那样,简洁便利地操作不可变状态。为实现该功能,Immer结合JavaScript的Proxy技术,使用了一种称为“结构化共享(structural sharing)”的“写入时复制”机制。
具体而言,作为当前状态currentState的代理,开发人员会维护一个临时的draftState可变状态。进而根据临时状态的可变情况,生成一个nextState状态,并将状态的未更改部分共享给currentState状态。由此,开发人员像以往那样改变数据,同时保有不可变数据的收益。
下面给出一段示例代码:
import produce from "immer"
const baseState = [
{
todo: "Learn typescript",
done: true
},
{
todo: "Try immer",
done: false
}
]
const nextState = produce(baseState, draftState => {
draftState.push({todo: "Tweet about it"})
draftState[1].done = true
})
示例代码展示了如何在不影响baseState的情况下操作可变状态draftState。而nextState是一个不可变状态树,维护了对draftState的所有更改操作,并实现对状态中所有未更改之处的结构化共享。