跳到主要内容

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 导入无需粘贴)
1
2import * as limu from 'limu';
3// ---------------- 以下代码可复制到console运行(window全局已绑定limu对象)----------------
4
5const { 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});
18
19console.log(nextState === baseState); // false
20console.log(nextState.a === baseState.a); // false
21console.log(nextState.b === baseState.b); // false
22console.log(nextState.c === baseState.c); // true
23
24// Currying call
25const producer = produce((draft)=>{
26 draft.a = 2;
27 draft.b['2'] = 100;
28});
29const nextState = producer(baseState);
30
for index cache expried at 2023-05-31