写点什么

年度最具影响力开源 JavaScript 软件库 Immer 发布第四版

  • 2019-10-02
  • 本文字数:1751 字

    阅读完需:约 6 分钟

年度最具影响力开源JavaScript软件库Immer发布第四版

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 的所有更改操作,并实现对状态中所有未更改之处的结构化共享。


Immer 第四版中修补了一个重要的边缘情况,避免了一些常见性问题


在修复前,Immer 不支持对变化点之外的状态赋予不变性。这意味着,如果通过 API 生成的 nextState 对象并未做任何修改,那么该对象将维持可变状态。该错误行为可通过如下代码示例阐明:


const d: D = {a: {b: 2}, z: {y: 3}};const immutable = produce(d, draft => {    draft.a.b = 1;});// 不可修改a.bexpect(() => immutable.a.b = 5).to.throw("");// 但是可以修改z.y!!immutable.z.y = 4;expect(immutable.z.y).eql(4);
复制代码


Immer 第四版修复了上述错误行为。它返回一个深度冻结(deeply frozen)的对象树,使得 immutable.z.y 不再支持修改操作。


不可变数据结构是 JavaScript 开发人员经常使用的数据结构,它直接支持性能优化、撤销/重做特性,并对更新提供了更好的可追踪能力。在 React/Redux 环境中,不可变数据结构是非常重要的,因为应用状态表示为“冻结的对象快照”,状态的更改只能通过一类称为 reducer 的纯函数实现。基于此,在Redux-ecosystem-links网页上列出了约 70 多个实现在 Redux 中操作不可变数据结构的软件包。


从标准 JavaScript 的语法、互操作性、性能等特性上看,Immer 相对于其它类型软件包而言是使用最广的。对于Immer在React编程中的异军突起,React 团队成员及ReduxCreate React App项目的共同创始人Dan Abramov给出了如下解释:


Immer 成功的秘诀在于:提供易于调试的软件库,减少编写程序的烦恼。感谢 @mweststrate 提供了 Immer!


但也应注意,Immer 是基于 ES6 Proxy 的。而 ES6 Proxy 是一种必须在旧版浏览器上使用的 Polyfill,这可能对性能产生影响。此外,开发人员应该了解官方文档中给出的由于使用Proxy而导致的一些缺陷


2019 年,Immer 荣获了两个奖项,即JavaScript开源奖(JavaScript open source award)中“最具影响贡献者”(Most impactful contribution),以及React开源奖( React open source award)中的“年度最具突破者”(Breakthrough of the year)。这两个奖项是分别授予对 JavaScript 生态做出突出贡献的项目,以及“为进一步开发增添了新的维度和可能性、首次出色实现并未来具有巨大潜力的新概念和想法”。


Immer 的创始人Michel Weststrate,也是状态管理软件库mobx的创始人。


Immer 使用 MIT 许可开源提供,欢迎通过Immer的GitHub项目Open Collective对项目做出贡献。


原文链接:


Immer, “Most Impactful Contribution” JavaScript Open Source Award Winner, Releases V4


2019-10-02 08:003453
用户头像

发布了 391 篇内容, 共 158.1 次阅读, 收获喜欢 257 次。

关注

评论 1 条评论

发布
暂无评论
发现更多内容

黑河市三级等保公司选择与整改方案要点解析

等保测评

网络安全 信息安全 数据安全 黑龙江等保测评 哈尔滨等保测评

战略是如何在"传话筒"游戏中消失的?用AI重构组织对齐的颗粒度

HuiZhuDev

OKR 技术管理 AI指令 战略对齐 工程思维

WSUS服务未认证远程代码执行漏洞深度剖析

qife122

网络安全 WSUS

火山引擎 MongoDB 进化史:从扛住抖音流量洪峰到 AI 数据底座

火山引擎开发者社区

配电 低压电工经验总结(20)

万里无云万里天

工业 工厂运维

GPT5.1 告诉你如何与电脑对话控制一切软件:复现 Caddy(YC F25)的愿景丨社区来稿

RTE开发者社区

厚积薄发 共襄新局:「AI共创 三生万物」司马阅2025企业AI落地应用峰会深圳站成功举办

司马阅

企业即时通讯平台:BeeWorks私有化部署解决方案

BeeWorks

即时通讯 IM 私有化部署

KWDB 核心贡献挑战赛决赛获奖名单重磅揭晓!

KaiwuDB

数据库 开放原子大赛 KWDB开源数据库

迈格网络:以“AI+”为引擎,驱动新质生产力腾飞

迈格网络

人工智能 网络安全

当前的“LLM 智能”,是来自模型突破,还是工程堆砌?

Baihai IDP

人工智能 程序员 AI 推理模型 LLM

2025年,这五款AI Wiki软件正在重新定义团队知识管理

百川云开发者

AI软件开发 知识库工具

curl/libcurl SMTP CRLF注入漏洞深度分析

qife122

网络安全 curl SMTP 漏洞挖掘 CRLF注入

利用竞态条件绕过业务逻辑:一个价值500美元的漏洞挖掘

qife122

网络安全 竞态条件

伊春市二级等保测评核心关注内容解析

等保测评

网络安全 信息安全 数据安全 黑龙江等保测评 哈尔滨等保测评

MyEMS:开源力量驱动能源管理,让节能降本触手可及

开源能源管理系统

开源 开源能源管理系统

Cisco 收购实时语音翻译初创 EzDubs;voize 融资 5000 万美元,语音技术革新医疗护理流程丨日报

RTE开发者社区

面向多模态 VLM 的 SFT 训练加速方案,百度百舸实测提速 5~6 倍

Baidu AICLOUD

多模态模型 Pai-Megatron-Patch SFT #VLM 离线packing

盘点:2025 年最值得关注的 18 家 AI Voice Agent 创业公司丨Voice Agent 学习笔记

RTE开发者社区

源网荷储:构建新型电力系统的核心引擎

西格电力

能源 绿色低碳发展 低碳经济 源网荷储

小间距LED显示屏维护方便吗?实际情况没你想得复杂

Dylan

LED LED display LED显示屏 LED屏幕

2025年远程控制软件怎么选?这10款值得你关注

科技经济

“团队敏捷教练进阶课程” 12月6-7日 ·在线A-CSM认证

ShineScrum

A-CSM

Gemini3做小红书封面生成器,效率暴增1000% ,实现爆款封面自由!

阿星AI工作室

产品 AI 工具 自媒体

Rust 1.91.0 发布:新增平台支持与安全增强

qife122

rust 系统构建

大数据-159 Apache Kylin Cube 实战:Hive 装载与预计算加速(含 Cuboid/实时 OLAP,Kylin 4.x)

武子康

Java 大数据 kylin 分布式 Apache Kylin

🚀 3 分钟上手 SightAI:在你熟悉的工具里直接调用顶级大模型

SightAI

AI 谷歌Gemini3 Openrouter

京东商品评论API助力电商数据分析

Datafox(数据狐)

京东API 京东商品评论API 京东评论API

ManageEngine卓豪-cmdb软件

ServiceDesk_Plus

CMDB ManageEngine卓豪

黑河市二级等保一站式等保安全产品选型指南

等保测评

网络安全 信息安全 数据安全 黑龙江等保测评 哈尔滨等保测评

Vega表达式滥用toString调用导致跨站脚本(XSS)漏洞分析

qife122

JavaScript 网络安全

年度最具影响力开源JavaScript软件库Immer发布第四版_语言 & 开发_Bruno Couriol_InfoQ精选文章