During hydration, replace update with insert + remove for same-type <list-item /> with different item-key so the Lynx Engine detects changes. (#1598)
Previously this case was hydrated as an update; it is now emitted as insert + remove to ensure SDK detection.
Bump swc_core v47. (#1916)
Pass sourcemap generated by rspack to swc transformer. (#1910)
When engineVersion is greater than or equal to 3.1, use __SetAttribute to set text attribute for text node instead of creating a raw text node. (#1880)
Add profile for list update-list-info. (#1480)
Support testing React Compiler in testing library. Enable React Compiler by setting the experimental_enableReactCompiler option of createVitestConfig to true. (#1269)
Initialize ctxNotFoundEventListener before each test in testing library (#1888)
fix: main thread functions created during the initial render cannot correctly modify MainThreadRefs after hydration (#1884)
runOnBackground() after hydration (#1878)Add event.stopPropagation and event.stopImmediatePropagation in MTS, to help with event propagation control (#1835)
Note, if this feature is used in Lazy Loading Standalone Project, both the Producer and the Consumer should update to latest version of @lynx-js/react to make sure the feature is available.
Fix the "ReferenceError: Node is not defined" error. (#1850)
This error would happen when upgrading to @testing-library/jest-dom v6.9.0.
fix: optimize main thread event error message (#1838)
Partially fix the "cannot read property 'update' of undefined" error. (#1771)
This error happens when rendering a JSX expression in a background-only context.
See lynx-family/lynx-stack#894 for more details.
Reduce extra snapshot when children are pure text (#1562)
feat: Support SelectorQuery animation APIs (#1768)
Fix spread props inside list-item caused redundant snapshot patch (#1760)
fix: ref is not initialized error on template reload (#1757)
fix: Delay execution of runOnMainThread() during initial render (#1667)
When called during the initial render, runOnMainThread() would execute before the main-thread:ref was hydrated, causing it to be incorrectly set to null.
This change delays the function's execution to ensure the ref is available and correctly assigned.
Fix "TypeError: cannot read property '0' of undefined" in deferred list-item scenarios. (#1692)
Deferred componentAtIndex causes nodes that quickly appear/disappear to be enqueued without __elements. Update signMap before __FlushElementTree to resolve the issue.
Keep the same <page/> element when calling rerender in testing library. (#1656)
Bump swc_core to 39.0.3. (#1721)
Support nested list. (#1581)
Should only recycle off-screen list-item in recursive hydration. (#1641)
fix fireEvent type error in testing library (#1596)
fix withInitDataInState got wrong state in 2nd or more times defaultDataProcessor, now it will keep its own state. (#1478)
change __CreateElement('raw-text') to __CreateRawText('') to avoid setNativeProps not working (#1570)
Fix wrong render result when using expression as key. (#1541)
See lynx-family/lynx-stack#1371 for more details.
fix: Cannot read properties of undefined error when using Suspense (#1569)
Add animate API in Main Thread Script(MTS), so you can now control a CSS animation imperatively (#1534)
fix css transform error in testing library (#1500)
fix the type error of wrapper option in testing library's render and renderHook function (#1502)
Introduce recursive hydration for lists to prevent double remove/insert on moves. (#1401)
Handle <frame/> correctly. (#1497)
Supports recyclable attribute in <list-item> to control whether the list item is recyclable. The recyclable attribute depends on Lynx Engine 3.4 or later. (#1388)
feat: Support using a host element as direct child of Suspense (#1455)
Add profile in production build: (#1336)
diff:__COMPONENT_NAME__: how long ReactLynx diff took.render:__COMPONENT_NAME__: how long your render function took.setState: an instant trace event, indicate when your setState was called.NOTE: __COMPONENT_NAME__ may be unreadable when minified, setting displayName may help.
Add onBackgroundSnapshotInstanceUpdateId event on dev for Preact Devtools to keep the correct snapshotInstanceId info. (#1173)
fix: Prevent error when spreading component props onto an element (#1459)
fix: Correctly check for the existence of background functions in MTS (#1416)
Fix crash caused by not removing event listeners during destroy. (#1379)
Fix missing "type" in "update-list-info" in hydrate (#1392)
feat: Force synchronous rendering for background initial renders to support Suspense fallbacks (#1323)
Introduces @lynx-js/react/compat submodule exporting Preact implementations of: (#1316)
startTransitionuseTransitionfix: Ensure useEffect callbacks execute before event handlers from the same render cycle (#1348)
Enable rendering of the Suspense fallback on initial render. (#1285)
fix: Prevent "cannot set property 'current' of undefined" error thrown by MainThreadRef on engine data updates (#1342)
Optimize componentAtIndex by a few hundreds microseconds: avoiding manipulate __pendingListUpdates unless SnapshotInstance tree is changed (#1201)
Support alog of component rendering on production for better error reporting. Enable it by using REACT_ALOG=true rspeedy dev/build or defining __ALOG__ to true in lynx.config.js: (#1164)
Make preact/debug work with @lynx-js/react. (#1222)
Introduce @lynx-js/react/debug which would include debugging warnings and error messages for common mistakes found. (#1250)
Add the import to @lynx-js/react/debug at the first line of the entry:
<list-item/> deferred now accepts an object with unmountRecycled property to control unmounting behavior when the item is recycled. (#1302)
For example, you can use it like this:
Now the component will be unmounted when it is recycled, which can help with performance in certain scenarios.
Avoid some unexpected __SetAttribute in hydrate when undefined is passed as an attribute value to intrinsic elements, for example: (#1318)
renderPage in preact act to ensure that the effects are flushed. (#1170)Allow some <list-item/>s to be deferred and rendered in the background thread. (#204)
Use the following syntax:
You should render your heavyweight components with the defer attribute to avoid blocking the main thread.
Add missing alias of @lynx-js/react and preact in testing library, it will fix the Failed to resolve import "@lynx-js/react/internal" error in node_modules. (#1182)
Allow any types of dataProcessors in lynx.registerDataProcessors. (#1200)
Make loadLazyBundle being able to render the content on the first screen of the background thread. (#1212)
Fixed: An issue where the lynxViewDidUpdate callback did not trigger when data was updated from native. (#1171)
Notice:
updateData(), the lynxViewDidUpdate callback will still be triggered.lynxViewDidUpdate callback will be triggered per render cycle. Consequently, if multiple updateData() calls are made within a single cycle but the data updates are batched, the number of lynxViewDidUpdate callbacks triggered may be less than the number of updateData() calls.Supports act in testing library. (#1182)
<list/>. (#1144)Fixed closure variable capture issue in effect hooks to prevent stale values and ensured proper execution order between refs, effects, and event handlers. (#770)
Breaking Changes:
ref, useEffect() callback, componentDidMount, componentDidUpdate, componentWillUnmount and the callback of setState have been moved forward. These effects will now execute before hydration is complete, rather than waiting for the main thread update to complete.<list />, ref callbacks will now be triggered during background thread rendering, regardless of component visibility. If your code depends on component visibility timing, use main-thread:ref instead of regular ref.Fixed two memory leaks: (#1071)
When JSX is rendered on the main thread and removed, FiberElement can still be referenced by __root.__jsx through props.children;
When the SnapshotInstance tree is removed from the root node, its child nodes form a cycle reference because the __previousSibling and __nextSibling properties point to each other, thus causing a FiberElement leak.
Optimize the error message when snapshots cannot be found in the main thread. (#1083)
Fix a problem causing MainThreadRefs to not be updated correctly during hydration when they are set to main-thread:refs. (#1001)
Add snapshot id report when throwing snapshotPatchApply failed: ctx not found error. (#1107)
Fix a bug in ReactLynx Testing Library that rendered snapshot of inline style was normalized incorrectly (eg. flex:1 was normalized to flex: 1 1 0%; incorrectly). (#1040)
Support for locating errors in the source code directly on the device when exceptions occur when using MTS. (#1019)
This requires Lynx engine v3.4 or later.
Fix the "main-thread.js exception: ReferenceError: __webpack_require__ is not defined" error in HMR. (#985)
This error occurred when setting output.iife: true, which is the default value in @lynx-js/rspeedy v0.9.8.
Support the 'main-thread' directive as an alias for 'main thread'. (#970)
Reduce calls to __AddInlineStyle by pass non-literal object directly to __SetInlineStyles. (#941)
Fix type error when using Suspense with "jsx": "react-jsx". (#854)
Support lazy bundle in ReactLynx testing library. (#869)
Fix a bug in HMR that snapshots are always updated because the same unique ID check is not performed correctly. (#869)
Fix missing types of key on components when using "jsx": "react-jsx". (#872)
Reverts #239: "batch multiple patches for main thread communication" (#649)
This reverts the change that batched updates sent to the main thread in a single render pass.
Add support for batch rendering in <list> with async resolution of sub-tree properties and element trees. (#624)
Use the experimental-batch-render-strategy attribute of <list>:
rename @lynx-js/test-environment to @lynx-js/testing-environment (#704)
Auto import @lynx-js/react/experimental/lazy/import when using import(url) (#667)
Auto import @lynx-js/react/experimental/lazy/import when using <component is={url} /> (#666)
Fixed a race condition when updating states and GlobalProps simultaneously. (#707)
This fix prevents the "Attempt to render more than one <page />" error from occurring during normal application usage.
Fix error like Unterminated string constant when using multi-line JSX StringLiteral. (#654)
OnPipelineStart arg count must == 1 on app load. (#669)Some of the timing keys are renamed to match the naming convention of the Lynx Engine. (#438)
update_set_state_trigger -> updateSetStateTriggerupdate_diff_vdom_start -> updateDiffVdomStartupdate_diff_vdom_end -> updateDiffVdomEnddiff_vdom_start -> diffVdomStartdiff_vdom_end -> diffVdomEndpack_changes_start -> packChangesStartpack_changes_end -> packChangesEndparse_changes_start -> parseChangesStartparse_changes_end -> parseChangesEndpatch_changes_start -> patchChangesStartpatch_changes_end -> patchChangesEndhydrate_parse_snapshot_start -> hydrateParseSnapshotStarthydrate_parse_snapshot_end -> hydrateParseSnapshotEndmts_render_start -> mtsRenderStartmts_render_end -> mtsRenderEndAdd testing library for ReactLynx (#74)
Refactor: Improved naming for list operation related types. Renamed UpdateAction interface to ListOperations. (#592)
Support using "jsx": "react-jsx" along with "jsxImportSource": "@lynx-js/react" in tsconfig.json. (#545)
This configuration enhances TypeScript definitions for standard JSX elements,
providing type errors for unsupported elements like <div> or <button>.
fix: JSX elements with dynamic key={expr} now wrapped in wrapper element to prevent merging. (#547)
Fix lynx.loadLazyBundle is not a function (#568)
fix: flushDelayedLifecycleEvents stack overflow error (#540)
Do some global var initialize in hydrate, which fixes error like cannot read property '-21' of undefined and some style issue. (#461)
fix: ensure ref lifecycle events run after firstScreen in the background thread (#434)
This patch fixes an issue where ref lifecycle events were running before firstScreen events in the background thread async render mode, which could cause refs to be undefined when components try to access them.
fix: prevent multiple firstScreen events when reloading before jsReady (#377)
Optimize the bundle size by eliminating unnecessary code when the lazy bundle is not utilized. (#284)
Improved rendering performance by batching updates sent to the main thread in a single render pass. This optimization reduces redundant layout operations on the main thread, accelerates rendering, and prevents screen flickering. (#239)
BREAKING CHANGE: This commit changes the behavior of Timing API. Previously, timing events were fired for each update individually. With the new batching mechanism, timing events related to the rendering pipeline will now be triggered once per render cycle rather than for each individual update, affecting applications that rely on the previous timing behavior.
Add missing typing for useErrorBoundary. (#263)
You can now use useErrorBoundary it in TypeScript like this:
Modified the format of data sent from background threads to the main thread. (#207)
Support Lynx SSR. (#60)
Support new css properties: offset-path and offset-distance (#152)
Fix 'SystemInfo is not defined' error when using MTS and not importing anything manually from the react package. (#172)
Fix not a function error when using lazy bundle without MTS. (#170)
fix: gesture config not processed correctly (#175)
After this commit, gesture config like minDistance should work as expected.
Support NPM provenance. (#30)
feat: add compiler only version of addComponentElement, it does not support spread props but have no runtime overhead, use it by: (#15)
Fix error createRef is not a function (#16)
Support MIXED target for worklet, it will be used by unit testing frameworks, etc. (#27)
Support return value for runOnBackground() and runOnMainThread(). (#119)
Now you can get the return value from runOnBackground() and runOnMainThread(), which enables more flexible data flow between the main thread and the background thread.
1abf8f0: Support estimated-main-axis-size-px
NOTE: This changes behavior of transformReactLynx so certain features (like lazy bundle) will be BROKEN if version mismatch.
1abf8f0: Support JSXSpread on <list-item/> component.
NOTE: This changes behavior of transformReactLynx so certain features (like lazy bundle) will be BROKEN if version mismatch.
<page/> is not used.9ce9ec0: Fix argument cannot be accessed correctly in default exported MTS functions.
99a4de6: Change TypeScript configuration to improve tree-shaking by setting verbatimModuleSyntax: false.
This change allows the bundler to properly remove unused imports and type-only imports, resulting in smaller bundle sizes. For example:
See TypeScript - verbatimModuleSyntax for details.
createRootcannot find module './snapshot/event.js' error avoid tree-shaking event.js in development.compat in transform to false__MAIN_THREAD__ and __BACKGROUND__ macro as an alternative to __LEPUS__ and __JS__.4e94846: Fix variables being renamed in MTS.
297c6ea: Fix the issue that when runOnBackground()'s parameter is not legal, it will still report an error in the rendering process of the background thread even though it won't actually be called.
763ad4e: Stop reporting ctx id in the ctx not found error.
480611d: Avoid error from changing theme.
3bf5830: Avoid overriding processEvalResult.
useLynxGlobalEventListener to make useInitData addListener as early as possible. This will fix the issue that onDataChanged has been called before the event listener is added.@lynx-js/types.a30c83d: Add compat.removeComponentAttrRegex.
NOTE: This feature is deprecated and will be removed in the future. Use codemod instead.
5f8d492: Deprecate compat.simplifyCtorLikeReactLynx2
ca3a639: Fix cssId collision issue when hash generated @jsxCSSId for jsx snapshot hit the range of auto increased cssId of @file.
8fbea78: Fix 'main thread' and 'background only' directives not working in export default declarations.
ff18049: Bump swc_core v0.109.2.
This would add /*#__PURE__*/ to the output of TypeScript enum. See swc-project/swc#9558 for details.
background.js.6730c58: Change the snapshot transform result by adding cssId and entryName.
| Remove Scoped CSS(Default) | Scoped CSS |
|---|---|
|
|
|
This requires @lynx-js/react-rsbuild-plugin v0.5.1 to work.
efbb7d4: Support Gesture.
Gesture Handler is a set of gesture handling capabilities built on top of the Main Thread Script. It currently supports drag, inertial scrolling, long press, and tap gestures for <view>, <scroll-view>, <list>, and <text>. In the future, it will also support multi-finger zoom, multi-finger rotation, and other gesture capabilities.
b2032eb: Better DCE.
Now DCE can remove dead branch:
45edafa: Support using import() with variables.
@lynx-js/react v0.100.0ReloadTemplate.