Changelog History
Page 1
-
v11.1.8 Changes
May 08, 2026 -
v11.1.7 Changes
May 06, 2026 -
v11.1.6 Changes
May 04, 2026 -
v11.1.5 Changes
May 04, 2026 -
v11.1.4 Changes
February 10, 2026 -
v11.1.3 Changes
December 29, 2025 -
v11.1.2 Changes
December 29, 2025 -
v11.1.0 Changes
December 23, 202511.1.0 (2025-12-20)
๐ This feature release adds a new optional "array method overrides" plugin that significantly speeds up array methods when accessing drafts.
๐ Changelog
๐ Performance Improvements
๐ As part of the recent performance optimization work, our benchmarks showed that all Proxy-based immutable update libraries were drastically slower than vanilla JS when calling both mutating and non-mutating array methods. After investigation, it turns out that an array method like
arr.filter()causes the Proxy'sgettrap to trigger for every single item in the array. This in turn forces creation of a new Proxy and internal Immer metadata for every item, even though this was just a read operation and no items were being updated.This release adds a new
enableArrayMethodsplugin that will override draft array methods to bypass the draft and directly operate on the underlying wrapped array instance. This significantly speeds up array operations.๐ When enabled, the plugin overrides these array methods:
- Mutating:
push,pop,shift,unshift,splice,reverse,sort - Non-mutating:
filter,slice,concat,flat,find,findIndex,findLast,findLastIndex,some,every,indexOf,lastIndexOf,includes,join,toString,toLocaleString
Our benchmarks show that the overridden methods (plus the other perf changes in Immer 10.2 and 11.0) are 50-80% faster than the baseline behavior of Immer 10.1.
๐ The plugin adds about 1.5-2K minified to Immer's bundle size.
๐ It's important to note that the plugin does change the "safe to mutate a draft" semantics of Immer. Any of these methods that receives an array item as a callback argument will not automatically wrap that item in a Proxy!. That means that if you try to mutate an argument in a method such as
filter, it will actually mutate the real underlying object, which will cause bugs in your app. This is an intentional design tradeoff. Semantically, all of these methods imply read-only access to array values, so if your code tries to mutate an array item in a callback, that is a bug in your code.Note that this does not override
map,flatMap,forEach, orreduce/reduceRight. Those methods do imply either side effects and potential mutations, or returning arbitrary values. Given that, we determined it was both safest and simplest to keep their behavior as-is.๐ See the Array Methods Plugin docs page for further details on the behavior of the overridden methods.
What's Changed
- โก๏ธ Override array methods to avoid proxy creation while iterating and updating by @markerikson in #1184
- Mutating:
-
v11.0.1 Changes
November 28, 2025 -
v11.0.0 Changes
November 23, 202511.0.0 (2025-11-23)
๐ Performance Improvements
๐ฅ BREAKING CHANGES
0๏ธโฃ enable loose iteration by default
Simplify some iteration checks
๐ Allow passing type to get/set utils to skip archetype lookup
Convert assigned_ to Map
Enable loose iteration
Replace recursive tree finalization with targeted callbacks
Ported Mutative's "finalization callback" approach as a more targeted and performant implementation for finalization compared to the existing recursive tree traversal approach:
- โ Added cleanup callbacks for each draft that's created
- โ Added callbacks to handle root drafts, assigned values, and recursing
inside of plain values - โก๏ธ Updated state creation to return [draft, state] to avoid a lookup
Rewrote patch generation system to work with callbacks instead of
during tree traversalโก๏ธ Update self-reference test with new behavior
Apply code review suggestions
๐ Byte-shave scopes and patch plugin usage
Inline finalizeAssigned
๐ Move fixPotentialSetContents to plugin
Byte-shave typeof utils
Byte-shave Object references
Byte-shave field names and arrow functions