电子结合了铬、节点。js和用于调用操作系统本地功能的API(如打开文件窗口,通知,图标等,基于电子的开发,就好像开发一个网页一样,而且能够无缝地使用节点。或者说:就好像构建一个节点应用程序,并通过HTML和CSS构建界面。
那么如何在页面中调用节点API呢?
碰到了一些坑…
先从页面加载方式说起,电子中加载页面的方式有两种:
一种是直接加载本地文件,另一种是通过http网络请求页面。
//方法1本地路径 win.loadURL (url.format ({ 路径名:路径。加入(__dirname/dist/index . html), 协议:“文件:”, 斜杠:真 }));
//方法2网络路径 win.loadURL (http://localhost: 3000);
现在我想要在某个js文件中引用一个本地的npm包,其中包含节点API,所以在浏览器中无法使用。
当地var=window.nodeRequire(当地的);
此时出现一个问题,使用方法1运行正常,但使用方法2时报错,但是如果使用方法,每次修改完代码都需要先打包一遍,再使用电子启动,耗时耗力啊。继续寻找解决方法。
找不到模块xxx
引用>调试发现在使用网络文件时,在调用模块。js中的模块。_load函数时参入的参数父母为
重点在下面两个变量,从Http加载页面时,由于路径是网络地址,所以电子将文件名设置为电子安装目录下的init.js。
文件名:“C: \ \华硕\ AppData \漫游用户\ npm \ node_modules \电子\ dist \ \ electron.asar \渲染器\ init的资源。js "
引用>
道路:数组[0]而在使用本地索引。html时,路径名指向正确的路径,而且路径中也包含了多个node_modules路径,模块在初始化时会将当前路径以及上一级,上上一级…直到根目录的node_modules作为搜索路径。
文件名:“E: \ WebStormWorkspace \ electron_require \ index . html”
引用>从下面模块。js源码可以看的到,文件名解析的时候正式利用了这个路径中的路径。因为路径中的空的,所以找不到所需要的模块。
其实电子是从安全的角度考虑,在从Http请求中加载网页时,如果能直接调用本地的一些模块,会比较危险。
模块。_resolveFilename=函数(请求、父母isMain) { 如果(NativeModule.nonInternalExists(请求)){ 返回请求; } var resolvedModule=模块。_resolveLookupPaths(请求、家长); var id=resolvedModule [0]; var路径=resolvedModule [1];//首先查找文件名,因为缓存键。 调试(寻找% j在%,id,路径); var文件名=模块。_findPath(请求、路径isMain); 如果文件名(!){ var呃=新的错误(“找不到模块请求“+ +””); 犯错。代码=癕ODULE_NOT_FOUND”; 把犯错; } 返回文件名;};此时很自然地想到可以把所需要模块的路径加入到路径中去,但这其实是不可行的,电子包含主进程和渲染进程,主进程就是这里命名主。js的文件,该文件是每个电子应用的入口。它控制了应用的生命周期(从打开到关闭)。它能调用原生元素和创建新的(多个)渲染进程,而且整个节点API是内置其中的。
渲染进程就是一个浏览器窗口,现在我们的js跑在渲染进程里面,所以我们并不能直接在主进程里面修改渲染进程的数据。
电子提供了IPC接口专门用于主进程和渲染进程之间的通信,他提供了同步和异步两种方法,同步方法直接设置事件。returnValue,异步方法使用event.sender.send (…)。
//主要过程。 const {ipcMain}=要求(“电子”) ipcMain。(异步消息,(事件,arg)=比;{ console.log (arg)//打印“萍” event.sender。发送(“异步回复”,“乓”) }) ipcMain。(同步消息,(事件,arg)=比;{ console.log (arg)//打印“萍” 事件。returnValue=' https://www.yisu.com/zixun/pong ' })//渲染器过程中(网页)。 const {ipcRenderer}=要求(“电子”) console.log (ipcRenderer。sendSync(“同步消息”,“平”))//打印“乒乓球” ipcRenderer。(异步回复,(事件,arg)=比;{ console.log (arg)//打印“乒乓球” }) ipcRenderer。发送(“异步消息”,“平”)电子如何调用本地模块的方法