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.
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_key: "__electronApi"
api_status: "dynamic"
source: preload.js:1:22764–22828
operation: "invoke"
channel_expression: "e"
source: preload.js:1:6486–6522
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.
-
Inizia dall'API esposta alla pagina
tab_browser_view/preload.js * Membro APIconst clipboardApi = { write: invokerInMain("notion:clipboard:write") }; // Included in the API exposed through contextBridge: // window.__electronApi.clipboardQuesto membro fornisce il nome del canale. L'attuazione di
invokerInMainci dice come la richiesta lascia il processo della pagina. -
Risolvere il wrapper del precarico
tab_browser_view/preload.js * IPC helperfunction 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:writedal lato del processo principale. -
Controlla come è registrato il ricevitore
principale/index.js * handler helperconst handleRequestFromRenderer = { addListener(channel, handler) { ipcMain.handle(channel, handler); } };Il processo principale utilizza un altro wrapper. Sua
addListenermetodo registra unipcMain.handlericevitore per quel canale. -
Trova la scrittura e il suo controllo mittente
principale/index.js * ricevitore appuntihandleRequestFromRenderer.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
text: "Project notes"
html: "<p>Project notes</p>"
+ "<!-- notionvc: <copy-id> -->"
id: <copy-id>
mimeTypes:
text/_notion-blocks-v3-production
→ structured block data
- Leggi l'ID HTML
- Trova lo stesso ID locale
- Ripristinare i dati del blocco Notion
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
| A | B |
| - | - |
| 1 | 2 |
table · headerRow: true
table_row
cells: ["A"], ["B"]
table_row
cells: ["1"], ["2"]
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.
- Guida all'applicazione JavaScriptSeguire la funzione di esportazione di una piccola applicazione Electron.
- DX-Ball ricostruzioneSeguire le istruzioni native per una funzione C selezionata.