Electron에서 preload.js를 올바르게 사용하는 방법

아미르 A. 샤 바니 :

fsrenderer프로세스에서 다음과 같이 노드 모듈 (이 예에서는 ) 을 사용하려고합니다 .

// main_window.js
const fs = require('fs')

function action() {
    console.log(fs)
}

참고 : action내 버튼을 누르면 함수가 호출됩니다 main_window.

그러나 이것은 오류를 제공합니다 :

Uncaught ReferenceError: require is not defined
    at main_window.js:1

이 허용 된 답변 에서 제안한대로 다음을 main.js초기화 할 때 다음 행을 추가 하여이 문제를 해결할 수 있습니다 main_window.

// main.js
main_window = new BrowserWindow({
    width: 650,
    height: 550,
    webPreferences: {
        nodeIntegration: true
    }
})

그러나 docs에 따르면 이것이 최선의 방법은 아니며 대신 preload.js파일을 만들고이 노드 모듈을로드 한 다음 모든 renderer프로세스 에서 사용해야합니다 . 이처럼 :

main.js:

main_window = new BrowserWindow({
    width: 650,
    height: 550,
    webPreferences: {
        preload: path.join(app.getAppPath(), 'preload.js')
    }
})

preload.js:

const fs = require('fs')

window.test = function() {
    console.log(fs)
}

main_window.js:

function action() {
    window.test()
}

그리고 작동합니다!


이제 내 질문에 내가 내의 대부분의 코드 작성해야한다는, 반 직관적이지 그것입니다 renderer에서 프로세스 preload.js(에서만 때문에 preload.js내가 노드 모듈에 액세스 할 수 있습니다) 다음 단순히 각각의 함수를 호출 renderer.js파일 (여기 예를 들어 main_window.js) ? 내가 여기서 이해하지 못하는 것은 무엇입니까?

잭 :

편집하다

다른 사용자가 물을 때 아래에 내 대답을 설명하겠습니다.

preload.jsElectron에서 사용하는 올바른 방법 은 앱에 필요한 모든 모듈 주위에 화이트리스트 래퍼를 노출시키는 것 require입니다.

보안 측면에서 require, 또는 require전화를 통해 검색 한 내용 을 노출하는 것은 위험 합니다 preload.js(자세한 내용은 여기 내 의견 참조 ). 앱이 원격 콘텐츠를로드하는 경우 특히 그렇습니다.

올바른 작업을 수행하려면 BrowserWindow아래에 자세히 설명 된대로 많은 옵션을 활성화해야 합니다. 이러한 옵션을 설정하면 전자 앱이 IPC (프로세스 간 통신)를 통해 통신하고 두 환경이 서로 분리됩니다. 이와 같이 앱을 설정하면 require백엔드에서 'd 모듈 일 수있는 모든 것을 검증 할 수 있으며 , 클라이언트가 변조하지 않아도됩니다.

아래에는 내가 말한 내용과 앱에서 어떻게 보일 수 있는지에 대한 간단한 예가 나와 있습니다. 새로 시작 secure-electron-template하는 경우 전자 응용 프로그램을 만들 때 얻을 수있는 모든 보안 모범 사례가있는 (저는 저자입니다) 사용 하는 것이 좋습니다 .

이 페이지 에는 preload.js를 사용하여 안전한 앱을 만들 때 필요한 아키텍처에 대한 유용한 정보도 있습니다.


main.js

const {
  app,
  BrowserWindow,
  ipcMain
} = require("electron");
const path = require("path");
const fs = require("fs");

// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let win;

async function createWindow() {

  // Create the browser window.
  win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: false, // is default value after Electron v5
      contextIsolation: true, // protect against prototype pollution
      enableRemoteModule: false, // turn off remote
      preload: path.join(__dirname, "preload.js") // use a preload script
    }
  });

  // Load app
  win.loadFile(path.join(__dirname, "dist/index.html"));

  // rest of code..
}

app.on("ready", createWindow);

ipcMain.on("toMain", (event, args) => {
  fs.readFile("path/to/file", (error, data) => {
    // Do something with file contents

    // Send result back to renderer process
    win.webContents.send("fromMain", responseObj);
  });
});

preload.js

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

// Expose protected methods that allow the renderer process to use
// the ipcRenderer without exposing the entire object
contextBridge.exposeInMainWorld(
    "api", {
        send: (channel, data) => {
            // whitelist channels
            let validChannels = ["toMain"];
            if (validChannels.includes(channel)) {
                ipcRenderer.send(channel, data);
            }
        },
        receive: (channel, func) => {
            let validChannels = ["fromMain"];
            if (validChannels.includes(channel)) {
                // Deliberately strip event as it includes `sender` 
                ipcRenderer.on(channel, (event, ...args) => func(...args));
            }
        }
    }
);

index.html

<!doctype html>
<html lang="en-US">
<head>
    <meta charset="utf-8"/>
    <title>Title</title>
</head>
<body>
    <script>
        window.api.receive("fromMain", (data) => {
            console.log(`Received ${data} from main process`);
        });
        window.api.send("toMain", "some data");
    </script>
</body>
</html>

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

조건에서 AND / OR를 올바르게 사용하는 방법

Java에서 함수를 올바르게 사용하는 방법

Spring에서 @Async를 올바르게 사용하는 방법

ReactJs에서 componentWillUnmount ()를 올바르게 사용하는 방법

Flutter에서 Provider를 올바르게 재사용하는 방법

CSS에서 @media를 올바르게 사용하는 방법

React에서 State()를 올바르게 사용하는 방법

Kotlin에서 setOnLongClickListener ()를 올바르게 사용하는 방법

Python에서 try / except를 올바르게 사용하는 방법

React에서 Ajax를 올바르게 사용하는 방법

IDesignTimeServices에서 IPluralizer를 올바르게 사용하는 방법

vue에서 'includes'를 올바르게 사용하는 방법

Angular 8에서 setValue를 올바르게 사용하는 방법

파이썬에서 'or'& 'and'를 올바르게 사용하는 방법

PHP에서 변수를 올바르게 사용하는 방법

Eclipse에서 Select Max ()를 올바르게 사용하는 방법

Node.js/ReactJS에서 ID로 DELETE를 올바르게 사용하는 방법

gruntfile.js에서 배열 변수를 올바르게 사용하는 방법

Koa (node.js)에서 Redis를 올바르게 사용하는 방법

클래스에서 Electron BrowserWindow를 올바르게 요구하는 방법

NextJS : firebase에 getStaticProps를 올바르게 사용하는 방법

Android에서 스낵바를 올바르게 사용하는 방법

자바에서 키 리스너를 올바르게 사용하는 방법

fwrite를 올바르게 사용하고 PHP에서 기능하는 방법

클래스에서 dispose 메서드를 올바르게 사용하는 방법

Swift 5에서 서브 클래스를 올바르게 사용하는 방법

Rails에서 서비스 객체를 올바르게 사용하는 방법

폴리머에 JS를 올바르게로드하는 방법

PHP 5.4에서 class_exists를 올바르게 사용하는 방법

TOP 리스트

  1. 1

    Matlab의 반복 Sortino 비율

  2. 2

    ImageJ-히스토그램 빈을 변경할 때 최대, 최소 값이 변경되는 이유는 무엇입니까?

  3. 3

    Excel : 합계가 N보다 크거나 같은 상위 값 찾기

  4. 4

    C #에서 'System.DBNull'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

  5. 5

    원-사각형 충돌의 충돌 측면을 찾는 문제

  6. 6

    Oracle VirtualBox-설치를 위해 게스트를 부팅 할 때 호스트 시스템이 충돌 함

  7. 7

    어떻게 아무리 "나쁜", ANY의 SSL 인증서와 HttpClient를 사용하지합니다

  8. 8

    Ubuntu는 GUI에서 암호로 사용자를 만듭니다.

  9. 9

    잘못된 상태 예외를 발생시키는 Apache PoolingHttpClientConnectionManager

  10. 10

    Python 사전을 사용하는 동안 "ValueError : could not convert string to float :"발생

  11. 11

    openCV python을 사용하여 텍스트 문서에서 워터 마크를 제거하는 방법은 무엇입니까?

  12. 12

    Vuetify 다중 선택 구성 요소에서 클릭 한 항목의 값 가져 오기

  13. 13

    C ++ VSCode에서 같은 줄에 중괄호 서식 지정

  14. 14

    Cassandra에서 버전이 지정된 계층의 효율적인 모델링

  15. 15

    JQuery datepicker 기능이 인식되지 않거나 새 프로젝트에서 작동하지 않음

  16. 16

    cuda 11.1에서 Pytorch를 사용할 때 PyTorch가 작동하지 않음: Dataloader

  17. 17

    jfreecharts에서 x 및 y 축 선을 조정하는 방법

  18. 18

    상황에 맞는 메뉴 색상

  19. 19

    마우스 휠 JQuery 이벤트 핸들러에 대한 방향 가져 오기

  20. 20

    매개 변수에서 쿼리 객체를 선언하는 방법은 무엇입니까?

  21. 21

    Maven은 아이 프로젝트 대상 폴더를 청소하지

뜨겁다태그

보관