limu
更快更好用的不可变数据js库
默认不冻结,大多数场景下都要比immer快3到5倍或更多
immer的冻结行为造成了大量性能损耗,且此配置关闭后性能提升有限,limu采用读时浅复制写时标记修改的策略压榨出了更强劲的性能(无论冻结与否)
更强的隐藏式代理机制,让用户像查看原生数据一样查看草稿数据任意节点
因层层代理导致调试模式下查看immer的草稿数据像进入黑盒世界,还需借助昂贵的current接口导出草稿的副本才能查看草稿数据全貌
默认支持Map、Set,兼容immer大部分接口,gzip后4.3kb
limu设计为面向现代浏览器的不可变数据js库,只运行于支持proxy特性的js环境,相比immer 6.3kb大小容量接近减少1/3
全局已绑定limu对象(包含方法)和immer对象,可右键打开浏览器控制台并粘贴以下代码体验差异(顶部的 import 导入无需粘贴)
12import * as limu from 'limu';3// ---------------- 以下代码可复制到console运行(window全局已绑定limu对象)----------------45const { produce } = limu;6const baseState = {7 a: 1,8 b: [ 1, 2, 3 ],9 c: {10 c1: { n: 1 },11 c2: { m: 2 },12 }13};14const nextState = produce(baseState, (draft)=>{15 draft.a = 2;16 draft.b['2'] = 100;17});1819console.log(nextState === baseState); // false20console.log(nextState.a === baseState.a); // false21console.log(nextState.b === baseState.b); // false22console.log(nextState.c === baseState.c); // true2324// Currying call25const producer = produce((draft)=>{26 draft.a = 2;27 draft.b['2'] = 100;28});29const nextState = producer(baseState);30