NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

年度最具影响力开源 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:003056
用户头像

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

关注

评论 1 条评论

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

针对GPU单指令多数据流的编译优化算法

GPU

gpu 编译器 程序语言 if-conversion

架构师训练营学习总结

John

极客大学架构师训练营

[1.3万字] 玩转前端二进制

阿宝哥

Java 大前端 base64 Blob

面试官:为什么需要happens-before规则和什么是指令重排序

无予且行

Java 编程 程序员 面试 happens-before

公司一直用Mybatis的原因原来在这!不得不竖起我的大拇指

小闫

Java mybatis mybatis-config.xml mybatis缓存

架构师训练营 第5课学习总结

Glowry

极客大学架构师训练营

小白也有大厂梦,如何从零开始掌握高薪Java工程师必备技能?

无予且行

Java 架构 面试 后端 大厂

Java程序员的必修课之Spring理解透彻了吗?不会还咋去面试?

犬来八荒

Java spring 面试 后端 框架

三十张图助你看清红黑树的前世今生

淡蓝色

Java 程序员 数据结构 算法

视读——沟通的艺术,看入人里,看出人外(开篇)

废材姑娘

读书笔记 视觉笔记

架构训练营第五周 - 作业

无心水

极客大学架构师训练营

重学 Java 设计模式:实战策略模式「模拟多种营销类型优惠券,折扣金额计算策略场景」

小傅哥

Java 设计模式 小傅哥 重构 代码优化

谈谈Spring xml配置文件中的命名空间,以及一些例外情况

xiaoxi666

spring 命名空间

GeekPwn 2020少年黑客马拉松大赛即将开启 谁将CARRY全场?

Geek_116789

Java线程池最细的解释,看完后彻底征服面试官

小新

Java 架构 面试 线程 线程池

它们为什么这么快:从多进程到多线程再到I/O复用

Ya

多线程 进程 并发

【Python】 any() 和 or 区别你真的知道吗?

Leetao

Python 数据结构 Python基础知识

碎片化学习行不行

封不羁

JVM中的双亲委派机制你还没懂吗?

阿文

Java JVMTI JVM 深入理解JVM JVM原理

Raft探索历程--Part2

老胡爱分享

分布式系统 raft

从Servlet到Spring Boot

废材姑娘

Java Spring Boot

架构训练营第五周 - 总结

无心水

极客大学架构师训练营

现在面试这么难,背下题就能过的时代一去不复返了

小谈

Java 面试 JVM springboot SpringCloud

一致性哈希 -- java 实现

lei Shi

道路千万条,安全只三条

石君

安全评估 安全设计

刚去面试现场聊了一个多小时的Redis ,悄悄分享给大家!

Java小咖秀

nosql redis 面试

区块链系列教程之:比特币的问题

程序那些事

比特币 区块链 智能合约 以太坊

Git 的远端操作及解析(含思维导图)

多选参数

git GitHub gitlab

有了多线程,为什么还要有协程?

八两

线程 进程 协程 GMP 进程线程区别

如果张东升是个程序员

程序员生活志

程序员 张东升

依赖倒置原则

John

极客大学架构师训练营

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