{"id":78092,"date":"2024-09-26T15:30:10","date_gmt":"2024-09-26T12:00:10","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/implement-react-v18-from-scratch-using-wasm-and-rust-27-implement-usetransition-10gb\/"},"modified":"2024-09-26T15:30:10","modified_gmt":"2024-09-26T12:00:10","slug":"implement-react-v18-from-scratch-using-wasm-and-rust-27-implement-usetransition-10gb","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/implement-react-v18-from-scratch-using-wasm-and-rust-27-implement-usetransition-10gb\/","title":{"rendered":"\u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc React v18 \u0627\u0632 \u0627\u0628\u062a\u062f\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 WASM \u0648 Rust &#8211; [27] \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc useTransition"},"content":{"rendered":"<blockquote>\n<p>\u0628\u0631 \u0627\u0633\u0627\u0633 big-react\u060c \u0645\u0646 \u0642\u0635\u062f \u062f\u0627\u0631\u0645 \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u0647\u0633\u062a\u0647 React v18 \u0631\u0627 \u0627\u0632 \u0627\u0628\u062a\u062f\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 WASM \u0648 Rust \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u0645.<\/p>\n<p>\u0645\u062e\u0632\u0646 \u06a9\u062f\uff1ahttps:\/\/github.com\/ParadeTo\/big-react-wasm<\/p>\n<p>\u0628\u0631\u0686\u0633\u0628 \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647\uff1av27<\/p>\n<\/blockquote>\n<p><code>useTransition<\/code>  \u06cc\u06a9 \u0647\u0648\u06a9 \u062c\u062f\u06cc\u062f \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 React \u0645\u0639\u0631\u0641\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0628\u062f\u0648\u0646 \u0645\u0633\u062f\u0648\u062f \u06a9\u0631\u062f\u0646 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc\u060c \u0648\u0636\u0639\u06cc\u062a \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f. \u0648\u0628 \u0633\u0627\u06cc\u062a \u0631\u0633\u0645\u06cc React \u0645\u062b\u0627\u0644\u06cc \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u062a\u0641\u0627\u0648\u062a \u0642\u0628\u0644 \u0648 \u0628\u0639\u062f \u0627\u0632 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f <code>useTransition<\/code>. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0627\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u0627\u0635\u0648\u0644 \u0627\u0633\u0627\u0633\u06cc \u0631\u0627 \u062a\u062d\u0644\u06cc\u0644 \u0645\u06cc \u06a9\u0646\u062f. \u062d\u0627\u0644\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0622\u0646 \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u0645. \u062c\u0632\u0626\u06cc\u0627\u062a \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0631 \u0627\u06cc\u0646 \u0644\u06cc\u0646\u06a9 \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0645\u0631\u0627\u062d\u0644 \u0627\u0641\u0632\u0648\u062f\u0646 \u0647\u0648\u06a9 \u062c\u062f\u06cc\u062f \u0631\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0631\u062f\u0647 \u0648 \u06a9\u062f \u0645\u0631\u0628\u0648\u0637\u0647 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u0645\u0627 \u0628\u0647 \u0622\u0646 \u062e\u0648\u0627\u0647\u06cc\u0645 \u0631\u0633\u06cc\u062f <code>fiber_hooks.rs<\/code>:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"k\">fn<\/span> <span class=\"nf\">mount_transition<\/span><span class=\"p\">()<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Vec<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">JsValue<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">let<\/span> <span class=\"n\">result<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">mount_state<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"nn\">JsValue<\/span><span class=\"p\">::<\/span><span class=\"nf\">from<\/span><span class=\"p\">(<\/span><span class=\"k\">false<\/span><span class=\"p\">))<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\n    <span class=\"k\">let<\/span> <span class=\"n\">is_pending<\/span> <span class=\"o\">=<\/span> <span class=\"n\">result<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span><span class=\"nf\">.as_bool<\/span><span class=\"p\">()<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\n    <span class=\"k\">let<\/span> <span class=\"n\">set_pending<\/span> <span class=\"o\">=<\/span> <span class=\"n\">result<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span><span class=\"nf\">.clone<\/span><span class=\"p\">()<\/span><span class=\"py\">.dyn_into<\/span><span class=\"p\">::<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Function<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">()<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\n    <span class=\"k\">let<\/span> <span class=\"n\">hook<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">mount_work_in_progress_hook<\/span><span class=\"p\">();<\/span>\n    <span class=\"k\">let<\/span> <span class=\"n\">set_pending_cloned<\/span> <span class=\"o\">=<\/span> <span class=\"n\">set_pending<\/span><span class=\"nf\">.clone<\/span><span class=\"p\">();<\/span>\n    <span class=\"k\">let<\/span> <span class=\"n\">closure<\/span> <span class=\"o\">=<\/span> <span class=\"nn\">Closure<\/span><span class=\"p\">::<\/span><span class=\"nf\">wrap<\/span><span class=\"p\">(<\/span><span class=\"nn\">Box<\/span><span class=\"p\">::<\/span><span class=\"nf\">new<\/span><span class=\"p\">(<\/span><span class=\"k\">move<\/span> <span class=\"p\">|<\/span><span class=\"n\">callback<\/span><span class=\"p\">:<\/span> <span class=\"n\">Function<\/span><span class=\"p\">|<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nf\">start_transition<\/span><span class=\"p\">(<\/span><span class=\"n\">set_pending_cloned<\/span><span class=\"nf\">.clone<\/span><span class=\"p\">(),<\/span> <span class=\"n\">callback<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">})<\/span> <span class=\"k\">as<\/span> <span class=\"nb\">Box<\/span><span class=\"o\">&lt;<\/span><span class=\"k\">dyn<\/span> <span class=\"nf\">Fn<\/span><span class=\"p\">(<\/span><span class=\"n\">Function<\/span><span class=\"p\">)<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">let<\/span> <span class=\"n\">start<\/span><span class=\"p\">:<\/span> <span class=\"n\">Function<\/span> <span class=\"o\">=<\/span> <span class=\"n\">closure<\/span><span class=\"nf\">.as_ref<\/span><span class=\"p\">()<\/span><span class=\"py\">.unchecked_ref<\/span><span class=\"p\">::<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Function<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">()<\/span><span class=\"nf\">.clone<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">closure<\/span><span class=\"nf\">.forget<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">hook<\/span><span class=\"nf\">.as_ref<\/span><span class=\"p\">()<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">()<\/span><span class=\"nf\">.clone<\/span><span class=\"p\">()<\/span><span class=\"nf\">.borrow_mut<\/span><span class=\"p\">()<\/span><span class=\"py\">.memoized_state<\/span> <span class=\"o\">=<\/span>\n        <span class=\"nf\">Some<\/span><span class=\"p\">(<\/span><span class=\"nn\">MemoizedState<\/span><span class=\"p\">::<\/span><span class=\"nf\">MemoizedJsValue<\/span><span class=\"p\">(<\/span><span class=\"n\">start<\/span><span class=\"nf\">.clone<\/span><span class=\"p\">()<\/span><span class=\"nf\">.into<\/span><span class=\"p\">()));<\/span>\n    <span class=\"nd\">vec!<\/span><span class=\"p\">[<\/span><span class=\"nn\">JsValue<\/span><span class=\"p\">::<\/span><span class=\"nf\">from_bool<\/span><span class=\"p\">(<\/span><span class=\"n\">is_pending<\/span><span class=\"p\">),<\/span> <span class=\"n\">start<\/span><span class=\"nf\">.into<\/span><span class=\"p\">()]<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u062f\u0631 \u0637\u0648\u0644 <code>mount_transition<\/code> \u0641\u0631\u0622\u06cc\u0646\u062f\u060c \u0633\u0627\u062e\u062a\u0627\u0631 \u062f\u0627\u062f\u0647 \u0632\u06cc\u0631 \u062a\u0634\u06a9\u06cc\u0644 \u0645\u06cc \u0634\u0648\u062f:<\/p>\n<p><\/p>\n<p>\u067e\u0633 \u06a9\u06cc <code>update_transition<\/code> \u0646\u0627\u0645\u06cc\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0645\u0642\u0627\u062f\u06cc\u0631 \u0631\u0627 \u0627\u0632 \u0647\u0648\u06a9 \u0647\u0627 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0646\u06cc\u0645:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"k\">fn<\/span> <span class=\"nf\">update_transition<\/span><span class=\"p\">()<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Vec<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">JsValue<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">let<\/span> <span class=\"n\">result<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">update_state<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"nn\">JsValue<\/span><span class=\"p\">::<\/span><span class=\"nf\">undefined<\/span><span class=\"p\">())<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\n    <span class=\"k\">let<\/span> <span class=\"n\">is_pending<\/span> <span class=\"o\">=<\/span> <span class=\"n\">result<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span><span class=\"nf\">.as_bool<\/span><span class=\"p\">()<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\n    <span class=\"k\">let<\/span> <span class=\"n\">hook<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">update_work_in_progress_hook<\/span><span class=\"p\">();<\/span>\n    <span class=\"k\">if<\/span> <span class=\"k\">let<\/span> <span class=\"nn\">MemoizedState<\/span><span class=\"p\">::<\/span><span class=\"nf\">MemoizedJsValue<\/span><span class=\"p\">(<\/span><span class=\"n\">start<\/span><span class=\"p\">)<\/span> <span class=\"o\">=<\/span> <span class=\"n\">hook<\/span>\n        <span class=\"nf\">.as_ref<\/span><span class=\"p\">()<\/span>\n        <span class=\"nf\">.unwrap<\/span><span class=\"p\">()<\/span>\n        <span class=\"nf\">.clone<\/span><span class=\"p\">()<\/span>\n        <span class=\"nf\">.borrow<\/span><span class=\"p\">()<\/span>\n        <span class=\"py\">.memoized_state<\/span>\n        <span class=\"nf\">.as_ref<\/span><span class=\"p\">()<\/span>\n        <span class=\"nf\">.unwrap<\/span><span class=\"p\">()<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nd\">vec!<\/span><span class=\"p\">[<\/span><span class=\"nn\">JsValue<\/span><span class=\"p\">::<\/span><span class=\"nf\">from_bool<\/span><span class=\"p\">(<\/span><span class=\"n\">is_pending<\/span><span class=\"p\">),<\/span> <span class=\"n\">start<\/span><span class=\"nf\">.into<\/span><span class=\"p\">()];<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"nd\">panic!<\/span><span class=\"p\">(<\/span><span class=\"s\">\"update_transition\"<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u06a9\u0644\u06cc\u062f \u062f\u0631 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0646\u0647\u0641\u062a\u0647 \u0627\u0633\u062a <code>start_transition<\/code>:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"k\">fn<\/span> <span class=\"nf\">start_transition<\/span><span class=\"p\">(<\/span><span class=\"n\">set_pending<\/span><span class=\"p\">:<\/span> <span class=\"n\">Function<\/span><span class=\"p\">,<\/span> <span class=\"n\">callback<\/span><span class=\"p\">:<\/span> <span class=\"n\">Function<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">set_pending<\/span><span class=\"nf\">.call1<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"nn\">JsValue<\/span><span class=\"p\">::<\/span><span class=\"nf\">null<\/span><span class=\"p\">(),<\/span> <span class=\"o\">&amp;<\/span><span class=\"nn\">JsValue<\/span><span class=\"p\">::<\/span><span class=\"nf\">from_bool<\/span><span class=\"p\">(<\/span><span class=\"k\">true<\/span><span class=\"p\">));<\/span>\n    <span class=\"k\">let<\/span> <span class=\"n\">prev_transition<\/span> <span class=\"o\">=<\/span> <span class=\"k\">unsafe<\/span> <span class=\"p\">{<\/span> <span class=\"n\">REACT_CURRENT_BATCH_CONFIG<\/span><span class=\"py\">.transition<\/span> <span class=\"p\">};<\/span>\n\n    <span class=\"c1\">\/\/ low priority<\/span>\n    <span class=\"k\">unsafe<\/span> <span class=\"p\">{<\/span> <span class=\"n\">REACT_CURRENT_BATCH_CONFIG<\/span><span class=\"py\">.transition<\/span> <span class=\"o\">=<\/span> <span class=\"nn\">Lane<\/span><span class=\"p\">::<\/span><span class=\"n\">TransitionLane<\/span><span class=\"nf\">.bits<\/span><span class=\"p\">()<\/span> <span class=\"p\">};<\/span>\n    <span class=\"n\">callback<\/span><span class=\"nf\">.call0<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"nn\">JsValue<\/span><span class=\"p\">::<\/span><span class=\"nf\">null<\/span><span class=\"p\">());<\/span>\n    <span class=\"n\">set_pending<\/span><span class=\"nf\">.call1<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"nn\">JsValue<\/span><span class=\"p\">::<\/span><span class=\"nf\">null<\/span><span class=\"p\">(),<\/span> <span class=\"o\">&amp;<\/span><span class=\"nn\">JsValue<\/span><span class=\"p\">::<\/span><span class=\"nf\">from_bool<\/span><span class=\"p\">(<\/span><span class=\"k\">false<\/span><span class=\"p\">));<\/span>\n\n    <span class=\"k\">unsafe<\/span> <span class=\"p\">{<\/span> <span class=\"n\">REACT_CURRENT_BATCH_CONFIG<\/span><span class=\"py\">.transition<\/span> <span class=\"o\">=<\/span> <span class=\"n\">prev_transition<\/span> <span class=\"p\">};<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0628\u0627 \u062a\u0648\u062c\u0647 \u0628\u0647 \u062a\u062c\u0632\u06cc\u0647 \u0648 \u062a\u062d\u0644\u06cc\u0644 \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647\u060c \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0627\u0628\u062a\u062f\u0627 \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc \u0645\u06cc \u0634\u0648\u062f <code>isPending<\/code> \u0628\u0647 <code>true<\/code> \u0628\u0627 \u0627\u0648\u0644\u0648\u06cc\u062a \u0641\u0639\u0644\u06cc \u0633\u067e\u0633 \u0627\u0648\u0644\u0648\u06cc\u062a \u0631\u0627 \u06a9\u0627\u0647\u0634 \u0645\u06cc \u062f\u0647\u062f\u060c \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u062f <code>callback<\/code>\u060c \u0648 \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc \u0647\u0627 <code>isPending<\/code> \u0628\u0647 <code>false<\/code>. \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u0627\u0648\u0644\u0648\u06cc\u062a \u0642\u0628\u0644\u06cc \u0631\u0627 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0641\u0631\u0622\u06cc\u0646\u062f \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0628\u0627 \u0627\u0648\u0644\u0648\u06cc\u062a \u06a9\u0645\u062a\u0631 \u0627\u0632 \u062d\u0627\u0644\u062a \u0647\u0645\u0632\u0645\u0627\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0628\u0647 \u0647\u0645\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u0627\u0633\u062a \u06a9\u0647 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0631\u0627 \u0645\u0633\u062f\u0648\u062f \u0646\u0645\u06cc\u200c\u06a9\u0646\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"k\">if<\/span> <span class=\"n\">cur_priority<\/span> <span class=\"o\">==<\/span> <span class=\"nn\">Lane<\/span><span class=\"p\">::<\/span><span class=\"n\">SyncLane<\/span> <span class=\"p\">{<\/span>\n  <span class=\"o\">...<\/span>\n<span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">if<\/span> <span class=\"nf\">is_dev<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">log<\/span><span class=\"o\">!<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Schedule in macrotask, priority {:?}\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">update_lanes<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"k\">let<\/span> <span class=\"n\">scheduler_priority<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lanes_to_scheduler_priority<\/span><span class=\"p\">(<\/span><span class=\"n\">cur_priority<\/span><span class=\"nf\">.clone<\/span><span class=\"p\">());<\/span>\n    <span class=\"k\">let<\/span> <span class=\"n\">closure<\/span> <span class=\"o\">=<\/span> <span class=\"nn\">Closure<\/span><span class=\"p\">::<\/span><span class=\"nf\">wrap<\/span><span class=\"p\">(<\/span><span class=\"nn\">Box<\/span><span class=\"p\">::<\/span><span class=\"nf\">new<\/span><span class=\"p\">(<\/span><span class=\"k\">move<\/span> <span class=\"p\">|<\/span><span class=\"n\">did_timeout_js_value<\/span><span class=\"p\">:<\/span> <span class=\"n\">JsValue<\/span><span class=\"p\">|<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">did_timeout<\/span> <span class=\"o\">=<\/span> <span class=\"n\">did_timeout_js_value<\/span><span class=\"nf\">.as_bool<\/span><span class=\"p\">()<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\n        <span class=\"nf\">perform_concurrent_work_on_root<\/span><span class=\"p\">(<\/span><span class=\"n\">root_cloned<\/span><span class=\"nf\">.clone<\/span><span class=\"p\">(),<\/span> <span class=\"n\">did_timeout<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">})<\/span> <span class=\"k\">as<\/span> <span class=\"nb\">Box<\/span><span class=\"o\">&lt;<\/span><span class=\"k\">dyn<\/span> <span class=\"nf\">Fn<\/span><span class=\"p\">(<\/span><span class=\"n\">JsValue<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"n\">JsValue<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">let<\/span> <span class=\"n\">function<\/span> <span class=\"o\">=<\/span> <span class=\"n\">closure<\/span><span class=\"nf\">.as_ref<\/span><span class=\"p\">()<\/span><span class=\"py\">.unchecked_ref<\/span><span class=\"p\">::<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Function<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">()<\/span><span class=\"nf\">.clone<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">closure<\/span><span class=\"nf\">.forget<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">new_callback_node<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">Some<\/span><span class=\"p\">(<\/span><span class=\"nf\">unstable_schedule_callback_no_delay<\/span><span class=\"p\">(<\/span>\n        <span class=\"n\">scheduler_priority<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">function<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">))<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0628\u0627 \u0627\u06cc\u0646 \u06a9\u0627\u0631\u060c \u0627\u062c\u0631\u0627\u06cc <code>useTransition<\/code> \u0627\u06a9\u062b\u0631\u0627 \u06a9\u0627\u0645\u0644 \u0627\u0633\u062a \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u062f\u0631 \u0637\u0648\u0644 \u0641\u0631\u0622\u06cc\u0646\u062f \u0628\u0627 \u0686\u0646\u062f \u0627\u0634\u06a9\u0627\u0644 \u0645\u0648\u0627\u062c\u0647 \u0634\u062f:<\/p>\n<p>\u0627\u0648\u0644\u06cc\u0646 \u0628\u0627\u06af \u0648\u0627\u0631\u062f \u0634\u062f\u0647 \u0627\u0633\u062a <code>begin_work.rs<\/code>:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"n\">work_in_progress<\/span><span class=\"nf\">.borrow_mut<\/span><span class=\"p\">()<\/span><span class=\"py\">.lanes<\/span> <span class=\"o\">=<\/span> <span class=\"nn\">Lane<\/span><span class=\"p\">::<\/span><span class=\"n\">NoLane<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u06cc\u06a9 FiberNode \u0686\u0646\u062f\u06cc\u0646 Lane \u062f\u0627\u0631\u062f\u060c \u0627\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0628\u0627\u0639\u062b \u0627\u06cc\u062c\u0627\u062f \u0645\u0634\u06a9\u0644\u0627\u062a\u06cc \u0645\u06cc \u0634\u0648\u062f. \u0628\u0627\u06cc\u062f \u0628\u0647 :\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"n\">work_in_progress<\/span><span class=\"nf\">.borrow_mut<\/span><span class=\"p\">()<\/span><span class=\"py\">.lanes<\/span> <span class=\"o\">-=<\/span> <span class=\"n\">render_lane<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0628\u0647 \u0637\u0648\u0631\u06cc \u06a9\u0647 \u0647\u0631 \u0628\u0627\u0631 \u0641\u0642\u0637 Lane \u0631\u0646\u062f\u0631 \u0634\u062f\u0647 \u0641\u0639\u0644\u06cc \u062d\u0630\u0641 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<p>\u0628\u0627\u06af \u062f\u0648\u0645 \u0648\u0627\u0631\u062f \u0634\u062f\u0647 \u0627\u0633\u062a <code>work_loop.rs<\/code>:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"k\">log<\/span><span class=\"o\">!<\/span><span class=\"p\">(<\/span><span class=\"s\">\"render over {:?}\"<\/span><span class=\"p\">,<\/span> <span class=\"o\">*<\/span><span class=\"n\">root<\/span><span class=\"nf\">.clone<\/span><span class=\"p\">()<\/span><span class=\"nf\">.borrow<\/span><span class=\"p\">());<\/span>\n<span class=\"n\">WORK_IN_PROGRESS_ROOT_RENDER_LANE<\/span> <span class=\"o\">=<\/span> <span class=\"nn\">Lane<\/span><span class=\"p\">::<\/span><span class=\"n\">NoLane<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u062f\u0631 \u0627\u0635\u0644\u060c \u0627\u06cc\u0646 \u062e\u0637 \u062f\u0631 \u0628\u0648\u062f <code>render_root<\/code> \u062a\u0627\u0628\u0639\u060c \u062a\u0646\u0638\u06cc\u0645 \u0645\u062c\u062f\u062f \u0645\u062a\u063a\u06cc\u0631 \u067e\u0633 \u0627\u0632 \u062a\u06a9\u0645\u06cc\u0644 \u0641\u0627\u0632 Render. \u0627\u0645\u0627 \u062f\u0631 \u062d\u0627\u0644\u062a \u0647\u0645\u0632\u0645\u0627\u0646\u060c \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0641\u0631\u0622\u06cc\u0646\u062f Render \u0642\u0637\u0639 \u0645\u06cc \u0634\u0648\u062f\u060c \u0627\u06cc\u0646 \u0645\u062a\u063a\u06cc\u0631 \u0646\u0628\u0627\u06cc\u062f \u0631\u06cc\u0633\u062a \u0634\u0648\u062f. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u0627\u06cc\u0646 \u062e\u0637 \u0628\u0647 <code>perform_concurrent_work_on_root<\/code>:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"k\">if<\/span> <span class=\"n\">exit_status<\/span> <span class=\"o\">==<\/span> <span class=\"n\">ROOT_COMPLETED<\/span> <span class=\"p\">{<\/span>\n    <span class=\"o\">...<\/span>\n    <span class=\"k\">unsafe<\/span> <span class=\"p\">{<\/span> <span class=\"n\">WORK_IN_PROGRESS_ROOT_RENDER_LANE<\/span> <span class=\"o\">=<\/span> <span class=\"nn\">Lane<\/span><span class=\"p\">::<\/span><span class=\"n\">NoLane<\/span> <span class=\"p\">};<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0628\u0647 \u0637\u0648\u0631\u06cc \u06a9\u0647 \u0645\u062a\u063a\u06cc\u0631 \u062a\u0646\u0647\u0627 \u0632\u0645\u0627\u0646\u06cc \u0631\u06cc\u0633\u062a \u0645\u06cc \u0634\u0648\u062f \u06a9\u0647 \u0641\u0631\u0622\u06cc\u0646\u062f Render \u06a9\u0627\u0645\u0644 \u0634\u0648\u062f.<\/p>\n<p>\u0628\u0627\u06af \u0633\u0648\u0645 \u0648\u0627\u0631\u062f \u0634\u062f\u0647 \u0627\u0633\u062a <code>update_queue.rs<\/code>\u060c \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 \u062a\u0635\u0648\u06cc\u0631 \u0632\u06cc\u0631 \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb70hqrvbb4rjekea7rph.jpg\" alt=\"\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062a\u0635\u0648\u06cc\u0631\" width=\"800\" height=\"181\" title=\"\"><\/p>\n<p>\u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c Scheduler \u0628\u0627\u0632\u0633\u0627\u0632\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a. \u0642\u0628\u0644\u0627\u064b min-heap \u0628\u0647 \u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u0634\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"k\">static<\/span> <span class=\"k\">mut<\/span> <span class=\"n\">TASK_QUEUE<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Vec<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Task<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"nd\">vec!<\/span><span class=\"p\">[];<\/span>\n<span class=\"k\">static<\/span> <span class=\"k\">mut<\/span> <span class=\"n\">TIMER_QUEUE<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Vec<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Task<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"nd\">vec!<\/span><span class=\"p\">[];<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0627\u06cc\u0646 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u062c\u062f\u0627\u06af\u0627\u0646\u0647 \u062f\u0627\u0631\u062f <code>peek_mut<\/code> \u0639\u0645\u0644\u06a9\u0631\u062f \u0647\u0646\u06af\u0627\u0645 \u0627\u0635\u0644\u0627\u062d \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc <code>Task<\/code> \u062f\u0631 \u067e\u0634\u062a\u0647:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"k\">let<\/span> <span class=\"k\">mut<\/span> <span class=\"n\">task<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">peek_mut<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">mut<\/span> <span class=\"n\">TASK_QUEUE<\/span><span class=\"p\">);<\/span>\n<span class=\"n\">task<\/span><span class=\"py\">.callback<\/span> <span class=\"o\">=<\/span> <span class=\"nn\">JsValue<\/span><span class=\"p\">::<\/span><span class=\"nf\">null<\/span><span class=\"p\">();<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0628\u0647 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0631\u062f\u0647 \u0627\u0633\u062a:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"k\">static<\/span> <span class=\"k\">mut<\/span> <span class=\"n\">TASK_QUEUE<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Vec<\/span><span class=\"o\">&lt;<\/span><span class=\"nb\">Rc<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">RefCell<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Task<\/span><span class=\"o\">&gt;&gt;&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"nd\">vec!<\/span><span class=\"p\">[];<\/span>\n<span class=\"k\">static<\/span> <span class=\"k\">mut<\/span> <span class=\"n\">TIMER_QUEUE<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Vec<\/span><span class=\"o\">&lt;<\/span><span class=\"nb\">Rc<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">RefCell<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Task<\/span><span class=\"o\">&gt;&gt;&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"nd\">vec!<\/span><span class=\"p\">[];<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0648 <code>peek<\/code> \u062a\u0627\u0628\u0639 \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0628\u0647 \u0637\u0648\u0631 \u06cc\u06a9\u0646\u0648\u0627\u062e\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"k\">let<\/span> <span class=\"n\">task<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">peek<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"n\">TASK_QUEUE<\/span><span class=\"p\">);<\/span>\n<span class=\"n\">task<\/span><span class=\"nf\">.borrow_mut<\/span><span class=\"p\">()<\/span><span class=\"py\">.callback<\/span> <span class=\"o\">=<\/span> <span class=\"nn\">JsValue<\/span><span class=\"p\">::<\/span><span class=\"nf\">null<\/span><span class=\"p\">();<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0644\u0637\u0641\u0627 \u0628\u0647 \u0645\u0646 \u06cc\u06a9 \u0633\u062a\u0627\u0631\u0647 \u0628\u062f\u0647\u06cc\u062f!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0628\u0631 \u0627\u0633\u0627\u0633 big-react\u060c \u0645\u0646 \u0642\u0635\u062f \u062f\u0627\u0631\u0645 \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u0647\u0633\u062a\u0647 React v18 \u0631\u0627 \u0627\u0632 \u0627\u0628\u062a\u062f\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 WASM \u0648 Rust \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u0645. \u0645\u062e\u0632\u0646 \u06a9\u062f\uff1ahttps:\/\/github.com\/ParadeTo\/big-react-wasm \u0628\u0631\u0686\u0633\u0628 \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647\uff1av27 useTransition \u06cc\u06a9 \u0647\u0648\u06a9 \u062c\u062f\u06cc\u062f \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 React \u0645\u0639\u0631\u0641\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0628\u062f\u0648\u0646 \u0645\u0633\u062f\u0648\u062f \u06a9\u0631\u062f\u0646 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc\u060c \u0648\u0636\u0639\u06cc\u062a \u0631\u0627 \u0628\u0647 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":78093,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-78092","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/78092","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=78092"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/78092\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/78093"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=78092"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=78092"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=78092"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}