电子如何调用本地模块的方法

  

电子结合了铬、节点。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。发送(“异步消息”,“平”)

电子如何调用本地模块的方法