mobx@7.0.3
6f002b8e543ca39d3ee23681e28848d7f1724fae#4696 Thanks @gesposito! - perf: add anodeexport condition that routes Node and Bun to the existingdist/index.jsentry, which picks the prebaked development or production CJS build once at require time.importing mobx in Node no longer executes the env-agnosticdist/mobx.mjswith per-callNODE_ENVchecks, and mixingimportandrequirein one Node app now yields a single mobx instance.
mobx-react@10.0.2
-
6f002b8e543ca39d3ee23681e28848d7f1724fae#4696 Thanks @gesposito! - perf: add anodeexport condition that routes Node and Bun to the existingdist/index.jsentry, which picks the prebaked development or production CJS build once at require time.importing mobx in Node no longer executes the env-agnosticdist/mobx.mjswith per-callNODE_ENVchecks, and mixingimportandrequirein one Node app now yields a single mobx instance. -
Updated dependencies [
6f002b8e543ca39d3ee23681e28848d7f1724fae]:- mobx-react-lite@5.0.3
mobx-react-lite@5.0.3
6f002b8e543ca39d3ee23681e28848d7f1724fae#4696 Thanks @gesposito! - perf: add anodeexport condition that routes Node and Bun to the existingdist/index.jsentry, which picks the prebaked development or production CJS build once at require time.importing mobx in Node no longer executes the env-agnosticdist/mobx.mjswith per-callNODE_ENVchecks, and mixingimportandrequirein one Node app now yields a single mobx instance.
mobx@7.0.2
-
ec1b708026c1578e1c1f6c7bd90be18b26f7ce85#4695 Thanks @gesposito! - perf: evaluateNODE_ENVonce at module scope in the env-agnostic esm bundles (dist/<pkg>.esm.jsanddist/<pkg>.mjs) instead of at every__DEV__call site.process.envis an exotic object in Node, so each check performed a real environment lookup on hot paths; consumers that execute these files as-is (Node ESM, vitest, SSR) see roughly 10x faster observable writes in dev mode. All env-set artifacts and bundler output are unchanged. -
6d8b5fa6c7596d7e5b16e55e3121d81c0c5bb21a#4672 Thanks @chatman-media! - FixObservableSet.replaceemitting spuriousdelete/addevents (and triggering reactions) for values that are unchanged. It now only firesdeletefor removed values andaddfor newly added ones, mirroringObservableMap.replace.Note: because
replaceno longer clears and re-adds every value, the iteration order afterreplacechanges in a (subtle but observable) way. Surviving values now keep their original relative position and newly added values are appended, instead of the whole set being reordered to match the argument. For example,set(["a", "b", "c"]).replace(["d", "b", "a"])previously iterated asd, b, a, and now iterates asa, b, d. This is arguably the more correct behavior (unchanged values are genuinely unchanged), but if you relied onreplacereordering the set to match its argument, you may need to adjust.
mobx-react@10.0.1
-
ec1b708026c1578e1c1f6c7bd90be18b26f7ce85#4695 Thanks @gesposito! - perf: evaluateNODE_ENVonce at module scope in the env-agnostic esm bundles (dist/<pkg>.esm.jsanddist/<pkg>.mjs) instead of at every__DEV__call site.process.envis an exotic object in Node, so each check performed a real environment lookup on hot paths; consumers that execute these files as-is (Node ESM, vitest, SSR) see roughly 10x faster observable writes in dev mode. All env-set artifacts and bundler output are unchanged. -
Updated dependencies [
ec1b708026c1578e1c1f6c7bd90be18b26f7ce85]:- mobx-react-lite@5.0.2
mobx-react-lite@5.0.2
ec1b708026c1578e1c1f6c7bd90be18b26f7ce85#4695 Thanks @gesposito! - perf: evaluateNODE_ENVonce at module scope in the env-agnostic esm bundles (dist/<pkg>.esm.jsanddist/<pkg>.mjs) instead of at every__DEV__call site.process.envis an exotic object in Node, so each check performed a real environment lookup on hot paths; consumers that execute these files as-is (Node ESM, vitest, SSR) see roughly 10x faster observable writes in dev mode. All env-set artifacts and bundler output are unchanged.
mobx@7.0.1
-
9444c624b957b489875e1c6b45deb290034ce4e9#4694 Thanks @mrpmohiburrahman! - fix:onBecomeObservedis now called for the dependencies of a computed that becomes observed while serving a cached value. Previously, observation only cascaded when the newly observed computed also happened to recompute, so an observable with a live observer chain up to a running reaction could still report itself as unobserved and never fire its hook. -
53bb83fdf455a4e606bb721ea10040ded7c57796#4683 Thanks @gesposito! - perf: fast-path primitives indeepEnhancer. Writing a primitive into a deep observable no longer runs the observable/array/plain-object/Map/Set/function type checks; primitives can never be made observable, so they are returned immediately. Creating an observable array of primitives is ~4x faster, and observable Set/Map writes are ~20-25% faster in the perf suite. -
030498d6b2bfe4cc27340fed8c706177cb3b28e1#4684 Thanks @a-y-ibrahim! - Fix a stack overflow ("Maximum call stack size exceeded") that could occur when anonBecomeUnobservedhandler disposes aReaction. Disposing aReactionre-entersendBatch(), which used to recurse into the samependingUnobservationsdrain loop instead of letting the already-running outer loop pick up the newly queued items, causing unbounded stack depth for long enough chains. -
a9086076b9ead1a9c933215bffaa9b57d44f6829#4681 Thanks @spokodev! - Fix ObservableSet union, intersection and symmetricDifference to return results in receiver order, matching native Set, when the argument is a plain Set. -
c65a4e14cf48b42cb792dc4c64edbcf56234b32d#4682 Thanks @gesposito! - perf: lazily allocate the internalobservers_Set. Atoms and computed values no longer allocate an emptySetupfront; it is created on first observer instead. Most atoms in large stores are never observed, so this saves roughly 160 bytes per unobserved atom (e.g. ~35% lower heap usage when hydrating 50k instances with 10 observable fields each).
mobx-react-lite@5.0.1
043850ed96266f8bea42bf643a65e62245a98b3c#4689 Thanks @gesposito! - fix:useObserverno longer retains the element tree returned by a component's first render for the component's whole mounted life.subscribe/getSnapshotwere created insideuseObserver's first invocation and therefore shared that invocation's closure context with thereaction.trackcallback's captures (render,renderResult); since React'suseSyncExternalStoreholdssubscribewhile the component is mounted, the first render result (and every fiber and DOM node reachable from it) could never be garbage collected. The administration object is now created by a module-level factory whose scope contains nothing render-related.
mobx-react-lite@5.0.0
-
1926c69f53168619d688f348aa587e8f3ae579ae#4671 Thanks @kubk! - Release MobX 7, mobx-react-lite 5, and mobx-react 10.Bundle sizes are down: ESM prod 17.02 KiB gzip -> 13.96 KiB gzip; a minimal tree-shaken example is 10.32 KiB gzip now.
It removes long-deprecated compatibility paths and keeps the React bindings split between
mobx-react-litefor function components andmobx-reactfor class-component support.MobX 7 is a cleanup release focused on the modern runtime and decorator model.
- MobX now always uses Proxy-backed observable objects and arrays. The ES5/non-proxy fallback has been removed.
configure({ useProxies: ... })is no longer supported.{ proxy: false }options forobservable,observable.object, andobservable.arrayare no longer supported.- Legacy decorators are no longer supported.
- Namespaced annotation and comparer properties now use named exports to reduce bundle size:
Removed API Replacement observable.refobservableRefobservable.shallowobservableShallowobservable.deepobservableDeepobservable.structobservableStructcomputed.structcomputedStructaction.boundactionBoundflow.boundflowBoundcomparer.identitycompareIdentitycomparer.defaultcompareDefaultcomparer.structuralcompareStructuralcomparer.shallowcompareShallow- The public
traceAPI and its related runtime support have been removed. UsetoJS,getDependencyTree,getObserverTree,spyormobx-logpackage for debugging.
mobx-react-lite 5 and mobx-react 10 require MobX 7 and React 18 or later.
mobx-react-literemains the function-component package.mobx-reactremains a thin wrapper aroundmobx-react-litethat adds class component and Stage 3@observerclass decorator support.- Keep function-component imports on
mobx-react-liteif you do not need class component support. - Use
mobx-reactwhen you need class components or@observerclass decorators. mobx-react-litesupports function components andforwardRef;mobx-reactdelegates function components tomobx-react-liteand handles classes itself.- Remove React batching imports, including the stale React Native batching deep import. React 18+ renderers handle batching.
The recommended public React binding surface for both packages is:
observerObserveruseLocalObservableenableStaticRenderingisUsingStaticRendering
The following APIs have been removed from the React binding packages:
Provider,inject, andMobXProviderContext; useReact.createContextdirectly.disposeOnUnmount; dispose reactions incomponentWillUnmountor return cleanup functions fromuseEffect.PropTypes; use TypeScript or the regularprop-typespackage.useObserver; wrap components withobserveror use<Observer>.useLocalStore; useuseLocalObservable.useAsObservableSource; synchronize values from props into local observable state explicitly.useStaticRendering; useenableStaticRendering.observerBatching,isObserverBatched,batchingForReactDom,batchingOptOut, andbatchingForReactNative; remove these imports because React 18+ renderers handle batching.- Deprecated
observer(fn, { forwardRef: true }); pass an already-createdReact.forwardRef(...)component toobserverinstead. - Legacy function-component
contextTypeshandling.
mobx-react@10.0.0
-
1926c69f53168619d688f348aa587e8f3ae579ae#4671 Thanks @kubk! - Release MobX 7, mobx-react-lite 5, and mobx-react 10.Bundle sizes are down: ESM prod 17.02 KiB gzip -> 13.96 KiB gzip; a minimal tree-shaken example is 10.32 KiB gzip now.
It removes long-deprecated compatibility paths and keeps the React bindings split between
mobx-react-litefor function components andmobx-reactfor class-component support.MobX 7 is a cleanup release focused on the modern runtime and decorator model.
- MobX now always uses Proxy-backed observable objects and arrays. The ES5/non-proxy fallback has been removed.
configure({ useProxies: ... })is no longer supported.{ proxy: false }options forobservable,observable.object, andobservable.arrayare no longer supported.- Legacy decorators are no longer supported.
- Namespaced annotation and comparer properties now use named exports to reduce bundle size:
Removed API Replacement observable.refobservableRefobservable.shallowobservableShallowobservable.deepobservableDeepobservable.structobservableStructcomputed.structcomputedStructaction.boundactionBoundflow.boundflowBoundcomparer.identitycompareIdentitycomparer.defaultcompareDefaultcomparer.structuralcompareStructuralcomparer.shallowcompareShallow- The public
traceAPI and its related runtime support have been removed. UsetoJS,getDependencyTree,getObserverTree,spyormobx-logpackage for debugging.
mobx-react-lite 5 and mobx-react 10 require MobX 7 and React 18 or later.
mobx-react-literemains the function-component package.mobx-reactremains a thin wrapper aroundmobx-react-litethat adds class component and Stage 3@observerclass decorator support.- Keep function-component imports on
mobx-react-liteif you do not need class component support. - Use
mobx-reactwhen you need class components or@observerclass decorators. mobx-react-litesupports function components andforwardRef;mobx-reactdelegates function components tomobx-react-liteand handles classes itself.- Remove React batching imports, including the stale React Native batching deep import. React 18+ renderers handle batching.
The recommended public React binding surface for both packages is:
observerObserveruseLocalObservableenableStaticRenderingisUsingStaticRendering
The following APIs have been removed from the React binding packages:
Provider,inject, andMobXProviderContext; useReact.createContextdirectly.disposeOnUnmount; dispose reactions incomponentWillUnmountor return cleanup functions fromuseEffect.PropTypes; use TypeScript or the regularprop-typespackage.useObserver; wrap components withobserveror use<Observer>.useLocalStore; useuseLocalObservable.useAsObservableSource; synchronize values from props into local observable state explicitly.useStaticRendering; useenableStaticRendering.observerBatching,isObserverBatched,batchingForReactDom,batchingOptOut, andbatchingForReactNative; remove these imports because React 18+ renderers handle batching.- Deprecated
observer(fn, { forwardRef: true }); pass an already-createdReact.forwardRef(...)component toobserverinstead. - Legacy function-component
contextTypeshandling.
- Updated dependencies [
1926c69f53168619d688f348aa587e8f3ae579ae]:- mobx-react-lite@5.0.0