Front-end_dev

Electron troubleshooting 본문

ES6/Electron(native)

Electron troubleshooting

Eat2go 2018. 12. 20. 02:17

native javascript로 작성된 module(ex. NPM을통해 다운로드받은)들은 크게상관이없는데, Node.js addon 기술을 통해 C++기반의 코드로작성된 module을 node.js module로 binding했을떄 그 module을 못찾는 문제가 있음.


브라우저는 기본적으로 보안이슈떄문에 운영체제가 제공하는 함수들을 쓰지못함(즉 system call 불가능) 그래서 addon을통해 C++에서 system call할수있게 하는 module을 만들어 javascript로 binding하는경우가 많음.



해결법은 크게 3가지가있는듯함


1. module.paths에 module path를 추가해줌. (그냥 밑의코드 복붙하면됨 mainWindow만 본인 앱의 window변수로바꾸고)


mainWindow.webContents.executeJavaScript(`
var path = require('path');
module.paths.push(path.resolve('node_modules'));
module.paths.push(path.resolve('../node_modules'));
module.paths.push(path.resolve(__dirname, '..', '..', 'electron', 'node_modules'));
module.paths.push(path.resolve(__dirname, '..', '..', 'electron.asar', 'node_modules'));
module.paths.push(path.resolve(__dirname, '..', '..', 'app', 'node_modules'));
module.paths.push(path.resolve(__dirname, '..', '..', 'app.asar', 'node_modules'));
path = undefined;



2. 해당 module을 npm rebuild 명령어를 통해 다시 rebuild한다. (제일 형편없는방법)


3. 그냥 target os에서 다시컴파일해서 만드는게 가장깔끔하다.... 이게정신건강에 이로움.


예를들어 맥환경에서 A프로그램을 만들었는데 A를 윈도우,리눅스에 배포하고싶으면 그냥 윈도우,리눅스 환경에서 프로젝트 clone하고 필요한 dependency들을 다 설치해주고 다시 컴파일하는게 가장깔끔...