Caso di studio * Electron

Come copie Notion
testo e HTML.

Traccia una chiamata negli appunti dall'API della pagina di Notion, attraverso il precarico e il processo principale, allo scrittore degli appunti di Electron.

Notion Desktop 7.6.1 · JavaScript · REA

Il ponte all'interno del pacchetto desktop Notion

  1. 01 * API rivolta verso la pagina clipboard.write(data) Il precarico espone un metodo richiamabile.
  2. 02 * Precarico involucro ipcRenderer.invoke Il wrapper invia il canale e gli argomenti.
  3. 03 * Gestore del processo principale ipcMain.handle Il destinatario controlla quale pagina l'ha inviata.
  4. 04 * Appunti di sistema clipboard.write(data) Electron scrive il testo e l'HTML forniti.

Un canale unisce i due lati: notion:clipboard:write

Il codice pacchettizzato utilizza lo stesso canale nel processo di precarico e principale. La risoluzione dei wrapper rivela le chiamate Electron dietro quei nomi.

Dove va l'operazione di copia?

La pagina vede un metodo chiamato clipboard.write. La sua implementazione nel precarico è un wrapper. La domanda utile è cosa invia quel wrapper e quale codice lo riceve.

Il tuo agente di codifica

Utilizzare REA per tracciare come Notion copia testo e HTML negli appunti di sistema. Mostra il codice ad ogni passaggio.

Un prompt di esempio con il pacchetto di applicazioni locali di Notion disponibile per l'agente di codifica.

REA trova dove iniziare a leggere

Analizzando il precarico scheda con REA individua l'API esposta alla pagina e la chiamata che invia una richiesta IPC. Entrambi i risultati sono dotati di intervalli di origine nel pacchetto minificato:

REA risultati → due posti da aprire

API pagina esposta
api_key: "__electronApi"
api_status: "dynamic"
source: preload.js:1:22764–22828
Renderer Chiamata IPC
operation: "invoke"
channel_expression: "e"
source: preload.js:1:6486–6522
Campi selezionati da un fresco analyze_javascript_application risultato sul precarico scheda di Notion, registrato con REA 4.1.0. Le posizioni utilizzano la linea e la colonna zero del bundle originale.

L'agente apre tali posizioni, trova il membro degli appunti nell'API assemblata e legge invokerInMain. Il suo sito di chiamata fornisce notion:clipboard:write. Quel nome dà all'agente qualcosa di preciso da cercare nel pacchetto principale. I quattro estratti qui sotto mostrano il percorso che collega.

Quattro brevi pezzi di codice

Semplificato dal pacchetto JavaScript, con nomi di variabili leggibili. I membri non correlati sono omessi.

  1. Inizia dall'API esposta alla pagina

    tab_browser_view/preload.js * Membro API
    const clipboardApi = {
      write: invokerInMain("notion:clipboard:write")
    };
    
    // Included in the API exposed through contextBridge:
    // window.__electronApi.clipboard

    Questo membro fornisce il nome del canale. L'attuazione di invokerInMain ci dice come la richiesta lascia il processo della pagina.

  2. Risolvere il wrapper del precarico

    tab_browser_view/preload.js * IPC helper
    function invokerInMain(channel) {
      return (...args) => invokeInMainAndReturnResult(channel, ...args);
    }
    
    function invokeInMainAndReturnResult(channel, ...args) {
      return ipcRenderer.invoke(channel, ...args);
    }

    La funzione restituita inoltra gli argomenti tramite IPC di richiesta e risposta di Electron. Ora possiamo cercare notion:clipboard:write dal lato del processo principale.

  3. Controlla come è registrato il ricevitore

    principale/index.js * handler helper
    const handleRequestFromRenderer = {
      addListener(channel, handler) {
        ipcMain.handle(channel, handler);
      }
    };

    Il processo principale utilizza un altro wrapper. Sua addListener metodo registra un ipcMain.handle ricevitore per quel canale.

  4. Trova la scrittura e il suo controllo mittente

    principale/index.js * ricevitore appunti
    handleRequestFromRenderer.addListener(
      "notion:clipboard:write",
      (event, data) =>
        isNotionWebContents(event.sender)
          ? clipboard.write(data)
          : undefined
    );

    Questa è la destinazione. Dopo aver controllato il mittente, il gestore passa i dati forniti all'API degli appunti di Electron. Il canale e i due wrapper risolti collegano il metodo esposto a questa chiamata.

In che modo un blocco copiato mantiene la sua struttura?

L'editor web di Notion invia testo e HTML attraverso electronApi.clipboard.write. Mantiene i dati del blocco localmente e inserisce un ID nell'HTML copiato per collegarli.

Collegamenti HTML ai dati di blocco salvati

Inviato agli appunti di sistema
text: "Project notes"
html: "<p>Project notes</p>"
    + "<!-- notionvc: <copy-id> -->"
Salvato localmente da Notion
id: <copy-id>
mimeTypes:
  text/_notion-blocks-v3-production
    → structured block data
  1. Leggi l'ID HTML
  2. Trova lo stesso ID locale
  3. Ripristinare i dati del blocco Notion
Testo illustrativo e ID. Il test del modulo registrato ripristina i dati del blocco quando gli ID corrispondono; una voce obsoleta restituisce solo testo e HTML.

In incolla, Notion cerca l'ID HTML e lo controlla rispetto alla copia salvata. Gli ID corrispondenti ripristinano i dati del blocco.

Formato appunti registrato da risorse Web memorizzate nella cache il 13 luglio 2026.

Altri esempi e fonti

Un altro esempio: tabelle Markdown

Notion analizza Markdown in dati di blocco. Questo esempio mostra come una tabella diventa intestazione e righe di dati.

Una tabella attraverso il parser Markdown di Notion

Ingresso markdown
| A | B |
| - | - |
| 1 | 2 |
Uscita parser strutturata * estratto
table · headerRow: true
  table_row
    cells: ["A"], ["B"]
  table_row
    cells: ["1"], ["2"]
Uscita registrata da un parser Markdown estratto. La tabella diventa righe e celle.
Un altro percorso: la connessione SQLite offline

Richieste di rendering di Notion getSqliteMeta attraverso IPC. Il processo principale crea un canale di messaggi e fornisce una porta al renderer e l'altra a un processo di utilità SQLite. I successivi lotti di istruzione e i risultati viaggiano su quella porta.

In seguito a questo handoff spiega dove viene eseguito il lavoro del database e perché tracciare solo la richiesta IPC iniziale manca la conversazione successiva.

Fonti e come leggere gli estratti

Il ponte degli appunti proviene da Notion Desktop 7.6.1 app.asar: la scheda precarico e main/index.js. Gli estratti espandono i nomi delle variabili minificate e omettono codice non correlato; l'helper sender-check viene mostrato con il suo sottostante isNotionWebContents chiamare.

Gli esempi di Appunti virtuali e Markdown provengono da risorse Web memorizzate nella cache il 13 luglio 2026, inclusi i moduli 747001, 58169, 736810 e 422457. Tali risorse hanno una loro versione. Le sonde salvate hanno eseguito moduli estratti e piccoli cablaggi; i loro output descrivono quelle sonde piuttosto che una sessione di interfaccia utente desktop catturata.

Il risultato REA mostrato qui è un'analisi mirata del precarico scheda salvato, registrato con il pacchetto REA 4.1.0 pubblicato. Individua l'API e richiama l'operazione. Il membro degli appunti e il ricevitore corrispondente sono collegati leggendo le loro implementazioni wrapper nel pacchetto.

L'esempio di Markdown utilizza il modulo parser 422457. I test dei moduli salvati mostrano che entrambi i filtri di pagina e chat conservano questa tabella. I parser paste/import, structured Markdown e AI/chat hanno punti di ingresso separati e formati intermedi.

Cima