」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > React原始碼中MessageChannel的使用

React原始碼中MessageChannel的使用

發佈於2024-11-08
瀏覽:523

這篇文章我們分析React原始碼中MessageChannel的用法。

MessageChannel usage in React source code

我們先來了解什麼是MessageChannel。

訊息頻道

Channel Messaging API 的 MessageChannel 介面允許我們建立一個新的訊息通道並透過它的兩個 MessagePort 屬性發送資料。

例子

以下範例摘自 MDN 文檔,您可以看到使用 MessageChannel() 建構子建立了一個新通道。

載入 IFrame 後,我們為 MessageChannel.port1 註冊一個 onmessage 處理程序,並使用 window.postMessage 方法將 MessageChannel.port2 與訊息一起傳送到 IFrame。

當從 IFrame 接收回訊息時,onMessage 函數將訊息輸出到段落。


const channel = new MessageChannel();
const output = document.querySelector(".output");
const iframe = document.querySelector("iframe");
// Wait for the iframe to load
iframe.addEventListener("load", onLoad);
function onLoad() {
  // Listen for messages on port1
  channel.port1.onmessage = onMessage;
  // Transfer port2 to the iframe
  iframe.contentWindow.postMessage("Hello from the main page!", "*", [
   channel.port2,
  ]);
}
// Handle messages received on port1
function onMessage(e) {
 output.innerHTML = e.data;
}


好了,現在我們了解了MessageChannel的基礎知識,接下來我們來學習它在React原始碼中的用法。

React原始碼中MessageChannel的用法:


const channel = new MessageChannel();
channel.port1.onmessage = callback;
channel.port2.postMessage(undefined);


React 如何使用它:

  • 建立一個新的 MessageChannel 實例:React 建立一個具有兩個通訊連接埠的新 MessageChannel。

  • 使用 postMessage 安排任務:React 使用 port2.postMessage(undefined) 非同步觸發任務,不會出現 setTimeout 或 setImmediate 可能出現的延遲或乾擾。

  • 觸發onmessage時執行任務:當port1.onmessage收到發布的訊息時執行任務(即傳遞給enqueueTask的回呼)。

為什麼不使用setTimeout或setImmediate? React 程式碼暗示他們希望避免在瀏覽器環境中使用 setTimeout 或 setImmediate,因為它們並不總是精確的,並且可能受到限制、測試環境或其他最佳化(例如測試環境中的偽造計時器)的影響。 React 希望對調度進行精細控制,尤其是在非同步渲染和更新方面。

MessageChannel usage in React source code

關於我們:

在 Think Throo,我們的使命是教授開源專案中使用的高階程式碼庫架構概念。

透過在 Next.js/React 中練習高階架構概念,提升您的程式設計技能,學習最佳實踐並建立生產級專案。

我們是開源的 — https://github.com/thinkthroo/thinkthroo (請給我們一顆星!)

透過我們基於程式碼庫架構的高階課程來提升您的團隊技能。請透過 [email protected] 與我們聯絡以了解更多資訊!

參考:

  • https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel

  • https://github.com/facebook/react/blob/5d19e1c8d1a6c0b5cd7532d43b707191eaf105b7/packages/shared/enqueueTask.js#L42

  • ]
版本聲明 本文轉載於:https://dev.to/thinkthroo/messagechannel-usage-in-react-source-code-3771?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 有效 JSON 有哪些不同的定義?
    有效 JSON 有哪些不同的定義?
    理解最小有效 JSONJSON 的概念已在各種 RFC 和規範中廣泛討論。 RFC4627 最初將 JSON 定義為序列化物件或陣列。根據此定義,僅 {}(空物件) 和 [](空數組) 符合有效、完整的 JSON 字串的條件。 但是,ECMA-404引入了一項修正案,擴大了有效 JSON 字串的範圍...
    程式設計 發佈於2024-11-08
  • 使用 MapStruct 來映射繼承層次結構
    使用 MapStruct 來映射繼承層次結構
    Intro MapStruct provides a rich set of features for mapping Java types. The technical documentation describes extensively the classes and ann...
    程式設計 發佈於2024-11-08
  • SQLite 參數替換是否會導致 Python 中的綁定錯誤?
    SQLite 參數替換是否會導致 Python 中的綁定錯誤?
    SQLite 參數替換問題在Python 2.5 中使用SQLite3 時,嘗試迭代列表並從中檢索資料時會出現一個常見問題一個資料時會出現一個常見問題一個資料庫.使用建議的「?」作為 SQL 注入預防措施的參數通常會導致有關綁定數量的錯誤。 經過調查,很明顯該錯誤源自於資料庫表的初始建立。建立語句,...
    程式設計 發佈於2024-11-08
  • 可以處理變數的 ID 以存取 Python 中的物件嗎?
    可以處理變數的 ID 以存取 Python 中的物件嗎?
    變數的 ID 可以取消引用嗎? 在 Python 中,id() 函數傳回物件的唯一識別碼。這個標識符可以儲存在變數中,但是這個變數的ID可以解引用嗎? 從學術角度來看,答案是肯定的。 _ctypes 模組提供了一個函數 PyObj_FromPtr(),可以將指標轉換為 Python 物件。使用此函數...
    程式設計 發佈於2024-11-08
  • 為什麼 imagecreatefrompng() 產生黑色背景而不是透明區域?
    為什麼 imagecreatefrompng() 產生黑色背景而不是透明區域?
    imagecreatefrompng() 產生黑色背景而不是透明區域? 在 PHP 中,imagecreatefrompng() 函數通常用於處理 PNG映像。然而,據觀察,使用此函數時,PNG 透明度可能會轉換為純黑色。 要解決此問題,可以在使用imagecreatetruecolor() 建立新...
    程式設計 發佈於2024-11-08
  • Go反射中reflect.Type和reflect.Value的主要差異是什麼?
    Go反射中reflect.Type和reflect.Value的主要差異是什麼?
    Go 中的反射類型和值Go 中的反射允許開發人員在運行時檢查和操作類型和值。了解它們的差異對於有效使用反射至關重要。 反射中的類型與值在反射中,reflect.TypeOf(i) 返回一個reflect.Type 對象,而reflect.ValueOf(i)返回一個reflect.Value obj...
    程式設計 發佈於2024-11-08
  • 如何在 AngularJS 中安全地設定變數的 iframe src 屬性?
    如何在 AngularJS 中安全地設定變數的 iframe src 屬性?
    在AngularJS 中從變數設定iframe src 屬性在AngularJS 中,嘗試從下列位置設定iframe 的src 屬性時可能會遭遇到問題一個變數。為了解決這個問題,這裡有一個逐步指南:1。注入 $sce 服務將 $sce(嚴格上下文轉義)服務注入控制器以處理清理。 function A...
    程式設計 發佈於2024-11-08
  • 為什麼我的 KeyListener 無法在 JPanel 中運作?
    為什麼我的 KeyListener 無法在 JPanel 中運作?
    JPanel 中KeyListeners 無回應:常見問題當使用KeyListeners 偵測JPanel 中的按鍵時,開發人員經常遇到這樣的問題:偵聽器無法觸發所需的操作。此問題可能由多個因素引起。 焦點元件約束KeyListener 依賴將自身附加到焦點元件才能正常運作。預設情況下,焦點不會自動...
    程式設計 發佈於2024-11-08
  • 從 React 到 React Native 的旅程
    從 React 到 React Native 的旅程
    作为一名 React / JS 开发人员,您可能有这样的想法 “我应该学习 React Native 吗?” 这是一个公平的问题,也是我几年前问自己的问题。事实证明,学习 React Native 绝对是正确的决定。这让我成为了亚马逊的高级开发倡导者,我现在使用 React Native 跨 And...
    程式設計 發佈於2024-11-08
  • 使用 Filament 和 Laravel 建立強大的管理面板:逐步指南
    使用 Filament 和 Laravel 建立強大的管理面板:逐步指南
    Laravel 是一个强大的 PHP 框架,为开发 Web 应用程序提供了坚实的基础。 Filament 是一个开源、优雅的 Laravel 管理面板和表单构建器,可简化管理界面的创建。本指南将引导您使用最新版本的 Filament 和 Laravel 构建强大的管理面板。 Laravel SaaS...
    程式設計 發佈於2024-11-08
  • 如何從 Pandas DataFrame 提取列標題?
    如何從 Pandas DataFrame 提取列標題?
    從 Pandas DataFrame 擷取列標題從 Pandas DataFrame 擷取列標題Pandas DataFrame 是通用的資料結構,可實現高效率的資料操作與分析。一項常見任務涉及提取列標題,這對於獲取 DataFrame 結構的概述或進一步處理非常有用。 假設您有一個從使用者輸入匯入...
    程式設計 發佈於2024-11-08
  • 透過範例解釋 Web 儲存 API
    透過範例解釋 Web 儲存 API
    Web Storage API: বিস্তারিত আলোচনা Web Storage API হলো জাভাস্ক্রিপ্টের একটি শক্তিশালী API যা ব্রাউজারে ব্যবহারকারীর ডেটা স্টোর করার জন্য ব্যবহ...
    程式設計 發佈於2024-11-08
  • 使用 Web 工具進行 Android 開發:使用 Ionic React 進行生產的最快方式
    使用 Web 工具進行 Android 開發:使用 Ionic React 進行生產的最快方式
    Investing in Android development can yield a huge device market share, expanded market reach, and high return on investment. With over 6.8 billion sma...
    程式設計 發佈於2024-11-08
  • 在Python中如何檢查字串是否以“hello”開頭?
    在Python中如何檢查字串是否以“hello”開頭?
    在Python中驗證以「hello」開頭的字串在Python中,判斷字串是否以「hello」開頭類似於Bash的常規表達方式。實作方法如下:aString = "hello world" aString.startswith("hello")startswit...
    程式設計 發佈於2024-11-08
  • 使用 Flama JWT 身份驗證保護 ML API
    使用 Flama JWT 身份驗證保護 ML API
    You've probably heard about the recent release of Flama 1.7 already, which brought some exciting new features to help you with the development and pro...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3