본문 바로가기
FE/electron

Electron 의 핵심 Preload

by livemehere 2023. 2. 11.

contextBridge

preload 스크립트 파일은 node, DOM, electron API 세가지의 context 에 접근이 가능하기 때문에 bridge 역할을 할 수 있다.

contextBridge 를 통해서 변수, 함수, 객체를 전달할 수 있다.

 

main.js

function createWindow() {
  const win = new BrowserWindow({
    width: 1920,
    height: 1080,
    webPreferences: {
      preload: path.join(__dirname, "preload.js"),
    },
  });
  win.webContents.openDevTools();
  win.loadURL("http://localhost:5173");
}

 

preload.js

const { contextBridge } = require("electron");

contextBridge.exposeInMainWorld("versions", {
  node: process.versions.node,
  chrome: process.versions.chrome,
  electron: process.versions.electron,
});

 

app.vue ( renderer.js )

<script setup>
console.log(window.versions)
</script>

<template>
  <div>
    <h1>Hello Kong</h1>
  </div>
</template>

<style scoped>

</style>

 

processes 간 통신하기 ipcMain, ipcRenderer

contextBridge 는 값을 전달할 수 있지만 실제로 서로다른 프로세스에 바로 접근하진 못한다.

그래서 ipcMain 과 ipcRenderer 를 통하여 서로간 이벤트를 발생시켜 통신할 수 있다.

 

preload.js

아래 코드처럼 invoke 객체 자체를 혹은 ipcRenderer 자체를 브라우저에 삽입하는 행위는 매우 높은 권한을 브라우저에 노출시키는 것으로 공식문서에서는 권장하지 않습니다.

const { contextBridge, ipcRenderer } = require("electron");

contextBridge.exposeInMainWorld("app", {
  invoke: ipcRenderer.invoke,
});

 

main.js

반드시 win.loadURL or win.loadFile 이전에 이벤트를 선언해야 합니다.

function createWindow() {
  const win = new BrowserWindow({
    width: 1920,
    height: 1080,
    webPreferences: {
      preload: path.join(__dirname, "preload.js"),
    },
  });
  win.webContents.openDevTools();

  ipcMain.handle("ping", () => {
    return fs.readdirSync(__dirname);
  });

  win.loadURL("http://localhost:5173");
}

 

app.vue

<script setup>
import {reactive} from "vue";

const data = reactive({
  dir:[]
})

async function handleClick(){
  const res = await app.invoke('ping')
  data.dir = res;
}

</script>

<template>
  <div>
    <h1>Versions</h1>
    <button @click="handleClick">invoke</button>
    <h2>파일 리스트</h2>
    <ul>
      <li v-for="file in data.dir">
        {{file}}
      </li>
    </ul>
  </div>
</template>

<style scoped>

</style>

반응형

'FE > electron' 카테고리의 다른 글

electron Process Model  (0) 2023.02.12
electron 패키징과 배포 그리고 업데이트  (1) 2023.02.12
Electron 핵심  (0) 2023.02.11