p5js로 데스크톱 프로그램 만들기 (Electronv15)
개시하다
예전에 "p5js로 데스크톱 프로그램 만들기 (구)1"라는 글을 썼는데 오랜만에 해 보니 아무리 해도 움직이지 않는다는 것을 알게 됐다.미안합니다.
이전 기사를 쓰는 단계에서는 일렉트론 버전에 전혀 신경 쓰지 않고 최신 버전을 사용하겠다는 의식이 있었는데, 지금 확인하면 당시에는 일렉트론 v11로 제작됐다.이후 v12에 큰 변화가 생겼습니다. 안전은 안전해졌지만 이전의 문법은 움직이지 않았습니다.
그럼 v11로 고정 제작하면 되지 않을까요? 현재 Elecron Fiddle은 v12에서만 선택할 수 있기 때문에 2021년 11월 1일까지 최신 Electron v15입니다.3.0으로 동작의 내용을 확인하고 다시 썼다.
변경점
Electron Fiddle v11은 "main.js""render.js""index.html"파일 3개를 처리했습니다.그리고 Electron Fiddlev12부터'main.js','renderer.js','index.html','preload.js'를 추가하여 4개의 파일을 처리하기 시작했다.
대략적으로 말하면 이전의 v11 이전에는'render.js'에서 다양한 일을 할 수 있었기 때문에 프로그램을 간단하게 진행할 수 있었지만 다른 한편으로는 안전성이 매우 느슨하다고 할 수 있다.따라서 새로운 v12는'render.js'와'preload.js'로 나뉘는데 안전에 영향을 미치는 처리는'proeload.js'에 쓰이고 안전에 미치는 영향은 비교적 적은 처리는'render.js'에 쓴다.
단순히 띄어쓰기만 한다고 생각했지만 큰 변경으로 노드.js에서 각종 기능 모듈을 읽는 Require는'render.js'부터 사용할 수 없고'preload.js'부터 사용할 수 있습니다.
v11까지는'render.js'에 p5js를 사용하기 위해 쓴 리퀘어('p5')가 적혀 있었지만, v12 이후에는 안 된다.다음 화면은 실제 오류입니다.
해결의 예
아직 해결 방법이 매끄럽지는 않지만, 나는 세 가지 큰 방법을 발견했다.더 좋은 방법이 있을 것 같아서 아는 사람이 있으면 알려주세요.먼저 너에게 두 가지 간단한 방법을 주고, 세 번째는 너 자신에게 채택한 방법을 준다.네 번째 방법은 시도는 했지만 순조롭지 못했다는 것이다.
예1: nodeIntefration 을 진실로 설정하고contextIsolation 을 거짓으로 설정합니다.
첫 번째 방법은 Electronv12 이후에도 v11 이전처럼 동작을 쓸 수 있다는 것이다.일렉트론의 보안 설정이 약해졌기 때문에 추천하지 않습니다.
v12에서'nodeIntegration'까지의 설정은 기본적으로'가짜', 마찬가지로'contextIsolation'의 설정은 기본적으로'진짜'입니다.이것들은main입니다.js의'webPreference'에서 설정할 수 있습니다.
Electron Fiddle v11은 "main.js""render.js""index.html"파일 3개를 처리했습니다.그리고 Electron Fiddlev12부터'main.js','renderer.js','index.html','preload.js'를 추가하여 4개의 파일을 처리하기 시작했다.
대략적으로 말하면 이전의 v11 이전에는'render.js'에서 다양한 일을 할 수 있었기 때문에 프로그램을 간단하게 진행할 수 있었지만 다른 한편으로는 안전성이 매우 느슨하다고 할 수 있다.따라서 새로운 v12는'render.js'와'preload.js'로 나뉘는데 안전에 영향을 미치는 처리는'proeload.js'에 쓰이고 안전에 미치는 영향은 비교적 적은 처리는'render.js'에 쓴다.
단순히 띄어쓰기만 한다고 생각했지만 큰 변경으로 노드.js에서 각종 기능 모듈을 읽는 Require는'render.js'부터 사용할 수 없고'preload.js'부터 사용할 수 있습니다.
v11까지는'render.js'에 p5js를 사용하기 위해 쓴 리퀘어('p5')가 적혀 있었지만, v12 이후에는 안 된다.다음 화면은 실제 오류입니다.
해결의 예
아직 해결 방법이 매끄럽지는 않지만, 나는 세 가지 큰 방법을 발견했다.더 좋은 방법이 있을 것 같아서 아는 사람이 있으면 알려주세요.먼저 너에게 두 가지 간단한 방법을 주고, 세 번째는 너 자신에게 채택한 방법을 준다.네 번째 방법은 시도는 했지만 순조롭지 못했다는 것이다.
예1: nodeIntefration 을 진실로 설정하고contextIsolation 을 거짓으로 설정합니다.
첫 번째 방법은 Electronv12 이후에도 v11 이전처럼 동작을 쓸 수 있다는 것이다.일렉트론의 보안 설정이 약해졌기 때문에 추천하지 않습니다.
v12에서'nodeIntegration'까지의 설정은 기본적으로'가짜', 마찬가지로'contextIsolation'의 설정은 기본적으로'진짜'입니다.이것들은main입니다.js의'webPreference'에서 설정할 수 있습니다.
빠르게 컴파일하고 싶거나 자신의 로컬 환경에서 스스로 사용을 책임졌으면 좋겠다.
main.js
function createWindow () {
// Create the browser window.
const mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
nodeIntegration: true, // nodeIntegrationをtrueにして、
contextIsolation: false // contextIsolationをfalseにする
}
})
// and load the index.html of the app.
mainWindow.loadFile('index.html')
// Open the DevTools.
// mainWindow.webContents.openDevTools()
}
예2:preload.모두 js에 쓰기
두 번째 방법은 프로그램의 파일을'preload.js'가 아니라'render.js'에 쓰는 것이다."preload.js"라면 Require('p5')를 사용할 수 있기 때문에 여기에 모두 쓰면 기본적으로 조작할 수 있습니다.하지만 안전성이 어떻게 될지는 잘 이해가 안 돼서 모르겠지만 어렵게 준비한'render.js'의 뜻이 없어져서 추천하지 않습니다.
preload.js
const p5 = require('p5');
const s = (p) => {
p.setup = () => {
p.createCanvas(p.windowWidth, p.windowHeight);
};
p.draw = () => {
p.background(100,10);
p.ellipse(p.mouseX, p.mouseY, 20, 20);
};
}
const myp5 = new p5(s);
예3:require('p5'사용하지 않음) (이것을 사용합니다)
세 번째 방법은 Require('p5')를 사용하지 않고 HTML에서'p5js'의 주체인'p5.js'와'p5.min.js'파일을 읽는 것이다.이것은 표준 p5js의 사용 방법입니다. Electron의 안전 설정도 하지 않고 "render.js"에 쓸 수 있기 때문에 지금 이게 좋다고 생각합니다.다만, 저장하거나 컴파일하기 위해 p5js 호스트를 읽어야 하기 때문에 처리가 좀 느립니다.
p5.min.js를 다운로드하여 같은 폴더에 넣습니다.그리고 index.'render.js'를 읽기 전에'p5.min.js'를 읽습니다.
index.html
<script src="./p5.min.js"></script>
<script src="./renderer.js"></script>
renderer.jsconst s = (p) => {
p.setup = () => {
p.createCanvas(p.windowWidth, p.windowHeight);
};
p.draw = () => {
p.background(100,10);
p.ellipse(p.mouseX, p.mouseY, 20, 20);
};
}
const myp5 = new p5(s);
동작 이미지
예1, 예2, 예3 모두 이런 느낌으로 화면이 나왔다.
예4: 잘 안 되는 샘플
나도 해봤지만 잘 안되는 거 적어놓을게.이게 잘 풀리면 시원할 것 같아.
여기에'preload를 통해 Require를 전달할 수 있습니다'이라고 쓰여 있다.
그렇구나.'render.js'와'preload.js'에는 변수와 대상이 왕래할 수 있는 contextBridge 방법이 준비되어 있습니다.이것은 내가 그곳에서 시도해 본 방안이다.
preload.js
const { contextBridge, ipcRenderer } = require('electron')
contextBridge.exposeInMainWorld(
"api", {
p5: require('p5')
}
)
renderer.jsconst p5 = window.api.p5;
const s = (p) => {
p.setup = () => {
p.createCanvas(p.windowWidth, p.windowHeight);
};
p.draw = () => {
p.background(100,10);
p.ellipse(p.mouseX, p.mouseY, 20, 20);
};
}
const myp5 = new p5(s);
renderer.js의 "const myp5 = newp5 (s);"의 한 행에'언카우트 에러:Cannot call a class asa function'같은 오류가 발생해 여기서부터 포기할 수 없게 됐다.
사이트 축소판 그림
원래 제목에는 (구) 가 없지만 추가되었습니다. ↩
Reference
이 문제에 관하여(p5js로 데스크톱 프로그램 만들기 (Electronv15)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mathrax-s/items/af6e3e4cdb4fe9622783
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(p5js로 데스크톱 프로그램 만들기 (Electronv15)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mathrax-s/items/af6e3e4cdb4fe9622783텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)