사례 연구·Electron

어떻게 Notion 사본
텍스트.

클립보드 호출 추적 Notion사전 로드 및 주요 프로세스를 통해 Electron클립보드 작가입니다.

Notion데스크탑 7.6.1·JavaScript·REA

다리 내부에Notion's 패키지 데스크톱

  1. 01*페이지 대면 clipboard.write(data) 사전 로드는 호출 가능한 메서드를 노출합니다.
  2. 02*예압 래퍼 ipcRenderer.invoke 래퍼는 채널 및 인수를 보냅니다.
  3. 03*메인 프로세스 핸들러 ipcMain.handle 수신자는 어떤 페이지를 보냈는지 확인합니다.
  4. 04*시스템 클립 보드 clipboard.write(data) Electron 제공된 텍스트를 씁니다.

한 채널이 양쪽을 연결합니다: notion:clipboard:write

패키지 코드는 사전 로드 및 기본 프로세스에서 동일한 채널을 사용합니다. 래퍼를 해결하면 Electron 그 이름 뒤에 함수 호출.

복사 작업은 어디로 갑니까?

이 페이지에는 다음과 같은 메서드가 표시됩니다 clipboard.write. 사전 로드에서의 구현은 래퍼입니다. 유용한 질문은 그 래퍼가 무엇을 보내고 어떤 코드가 그것을 받는지입니다.

코딩 에이전트

사용 REA 추적 방법 Notion 시스템 클립보드에 텍스트를 복사합니다. 각 단계에서 코드를 표시합니다.

다음과 같은 예제 프롬프트 Notion코딩 에이전트가 사용할 수있는 로컬 응용 프로그램 패키지입니다.

REA 읽기 시작 위치 찾기

탭 사전 로드 분석 REA 페이지 및 요청을 보내는 호출을 찾습니다. 두 결과 모두 축소 된 번들의 소스 범위와 함께 제공됩니다:

REA 연구 결과→두 가지 장소를 오픈

노출된 페이지
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 에 결과 Notion의 탭 사전 로드, REA 4.1.0. 위치는 원래 번들의 선과 0 기반 열을 사용합니다.

에이전트는 이러한 위치를 열고 어셈블리에서 클립보드 멤버를 찾아 읽습니다 invokerInMain. 그것의 외침 위치 공급 notion:clipboard:write. 그 이름은 에이전트에게 주요 번들에서 찾을 수 있는 정확한 것을 제공합니다. 아래 네 부분 은 그 길 이 연결 되는 길 을 보여 준다.

네 개의 짧은 코드 조각

패키지에서 단순화 JavaScript,읽을 수 있는 변수 이름. 관련 없는 멤버는 생략됩니다.

  1. 페이지에 노출된

    탭 _브라우저 _보기/preload.js ·회원
    const clipboardApi = {
      write: invokerInMain("notion:clipboard:write")
    };
    
    // Included in the API exposed through contextBridge:
    // window.__electronApi.clipboard

    이 멤버는 채널 이름을 제공합니다. 의 구현 invokerInMain 요청이 페이지의 프로세스를 종료하는 방법을 알려줍니다.

  2. 사전 로드의 래퍼 해결

    탭 _브라우저 _보기/preload.js ·아이피 도우미
    function invokerInMain(channel) {
      return (...args) => invokeInMainAndReturnResult(channel, ...args);
    }
    
    function invokeInMainAndReturnResult(channel, ...args) {
      return ipcRenderer.invoke(channel, ...args);
    }

    반환된 함수는 인수를 Electron요청 및 응답 우리는 지금 찾을 수 있습니다 notion:clipboard:write 메인 프로세스 측면에서.

  3. 수신기가 등록되는 방법 확인

    주요/index.js *핸들러 도우미
    const handleRequestFromRenderer = {
      addListener(channel, handler) {
        ipcMain.handle(channel, handler);
      }
    };

    주요 프로세스는 다른 래퍼를 사용합니다. 그것의 addListener 메소드는 ipcMain.handle 해당 채널의 수신기.

  4. 쓰기 및 보낸 사람 확인 찾기

    주요/index.js *클립 보드 수신기
    handleRequestFromRenderer.addListener(
      "notion:clipboard:write",
      (event, data) =>
        isNotionWebContents(event.sender)
          ? clipboard.write(data)
          : undefined
    );

    이 목적지입니다. 보낸 사람을 확인한 후 처리기는 제공된 데이터를 Electron클립보드입니다. 채널과 두 개의 해결된 래퍼는 노출된 메서드를 이 호출에 연결합니다.

복사 된 블록은 어떻게 구조를 유지합니까?

Notion의 웹 편집기는 텍스트를 전송합니다. electronApi.clipboard.write. 그것은 로컬 블록 데이터를 유지하고 그들을 연결하기 위해 복사 한에 아이디를 넣습니다.

저장된 블록 데이터에 대한 링크

시스템 클립보드로 전송됨
text: "Project notes"
html: "<p>Project notes</p>"
    + "<!-- notionvc: <copy-id> -->"
로컬로 저장해Notion
id: <copy-id>
mimeTypes:
  text/_notion-blocks-v3-production
    → structured block data
  1. 읽기
  2. 동일한 로컬 아이디 찾기
  3. 복원Notion블록 데이터
설명 텍스트 및 아이디. 기록 된 모듈 테스트는 식별자가 일치 할 때 블록 데이터를 복원합니다.

붙여넣기, Notion 저장한 사본에 대하여 검사한다. 일치하는 신분증은 블록 데이터를 복원합니다.

2026 년 7 월 13 일에 캐시된 웹 자산에서 기록된 클립보드 형식.

더 많은 예와 출처

또 다른 예:마크 다운 테이블

Notion 마크다운을 블록 데이터로 구문 분석합니다. 이 예제에서는 테이블이 머리글 및 데이터 행이 되는 방법을 보여 줍니다.

테이블을 통해Notion's Markdown parser

마크다운 입력
| A | B |
| - | - |
| 1 | 2 |
구조화된 파서 출력*발췌
table · headerRow: true
  table_row
    cells: ["A"], ["B"]
  table_row
    cells: ["1"], ["2"]
추출 된 마크 다운 파서에서 기록 된 출력. 테이블은 행과 셀이 됩니다.
다른 경로:오프라인 스카이라이트 연결

Notion렌더러 요청 getSqliteMeta 2018 년 11 월 기본 프로세스는 메시지 채널을 생성하고 한 포트를 렌더러에 제공하고 다른 포트를 렌더러 유틸리티 프로세스에 제공합니다. 후속 문 배치 및 결과는 해당 포트를 통해 이동합니다.

이 핸드오프에 따라 데이터베이스 작업이 실행되는 위치와 초기 요청만 추적하면 나중에 대화가 누락되는 이유를 설명합니다.

출처 및 발췌문 읽기 방법

클립보드 브리지는 Notion 데스크톱 7.6.1 의 app.asar:탭 사전로드 및 main/index.js. 발췌는 축소 된 변수 이름을 확장하고 관련이없는 코드를 생략;발신자 검사 도우미는 기본과 함께 표시됩니다 isNotionWebContents 함수 호출.

가상 클립보드 및 마크다운 예는 모듈을 포함하여 2026 년 7 월 13 일에 캐시된 웹 자산에서 가져온 것입니다 747001, 58169, 736810 그리고 422457. 이러한 자산에는 자체 버전이 있습니다. 저장된 프로브는 추출된 모듈과 작은 하네스를 실행했습니다.

그 REA 여기에 표시된 결과는 저장된 탭 사전로드에 대한 집중 분석이며 게시된 탭과 함께 기록됩니다. REA 4.1.0 패키지. 이 작업을 수행하려면 다음을 수행하십시오. 클립보드 멤버와 일치하는 수신기는 패키지에서 래퍼 구현을 읽음으로써 연결됩니다.

마크다운 예제는 파서 모듈을 사용합니다 422457. 저장된 모듈 테스트는 페이지 필터와 채팅 필터 모두 이 테이블을 유지한다는 것을 보여줍니다. 붙여넣기/가져오기,구조화된 마크다운 및 인공지능/채팅 파서는 별도의 진입점과 중간 형식을 가지고 있습니다.

상단