电子如何调用局部模块的方法
电子结合Chromium、Node.js和API调用操作系统的本地函数(如打开文件窗口、通知、图标等。).基于电子的开发就像开发网页一样,可以无缝使用Node。或者:就像搭建一个Node应用,通过HTML和CSS搭建一个界面。
那么如何在页面中调用Node API呢?
遇到一些坑.
从页面加载模式出发,在electronic中加载页面有两种方式:一种是直接加载本地文件,另一种是通过http网络请求页面。
//方法1本地路径win . load URL(URL . format({ path name : path . join(_ dirname ',/dist/index.html '),protocol:' file: ',slash 3360 true });//方法2网络路径win . load URL(' http://localhost :3000 ');现在我想引用js文件中的一个本地npm包,它包含Node API,所以不能在浏览器中使用。
var local=window . noderequest(' local ');这时,就出现了一个问题。使用方法1正常工作,但使用方法2时,会报告错误。但是,如果使用方法1,则需要在每次修改代码时打包一次,然后用Electron启动,这样既费时又费力。继续寻找解决方案。
找不到模块xxx
调试发现,当使用网络文件时,当调用模块时。_load函数在module.js中,参数的父项是
关注以下两个变量。从Http加载页面时,因为路径是网络地址,所以Electron将文件名设置为init.js .
filename : ' c : \ Users \ ASUS \ AppData \ Roaming \ NPM \ node _ modules \ electronic \ dist \ resources \ electronic . asar \ renderer \ init . js ' path s : Array[0]
使用本地index.html时,路径名指向正确的路径,并且这些路径还包含多个node_modules路径。初始化时,模块将采用当前路径和前一级、前一级…直至根目录的node_modules作为搜索路径。
filename : ' e : \ webstorokspace \ electron _ require \ index . html '
从下面的module.js源代码可以看出,在解析文件名时,会正式使用这个路径中的路径。找不到所需的模块,因为路径中的为空。
事实上,电子是从安全的角度出发的。当从Http请求加载网页时,直接调用一些本地模块是危险的。
模块。_ resolveFilename=function(request,parent,isMain){ if(nativemodule . noninternetalexists(request)){ return request;} var resolvedModule=Module。_ resolveLookupPaths(请求,父级);var id=resolved module[0];var path=resolved module[1];//首先查找文件名,因为那是缓存键。调试('在%j,id,路径中查找% j);变量文件名=模块。_findPath(请求、路径、IsMain);if(!文件名){ var err=新错误('找不到模块''请求' ');err.code=' MODULE _ NOT _ FOUND抛出错误;}返回文件名;};这时自然会想到,需要的模块的路径可以添加到路径中,但这实际上是不可行的。电子包括一个主过程和一个渲染过程。主要的进程是这里命名为main.js的文件,这是每个Electron应用程序的入口。它控制应用程序的生命周期(从打开到关闭)。它可以调用本机元素并创建新的呈现过程,并且整个节点应用编程接口都内置于其中。
渲染过程只是一个浏览器窗口。现在我们的js运行在渲染过程中,所以不能在主进程中直接修改渲染过程的数据。
Electron为主进程和渲染进程之间的通信提供了IPC接口。它提供同步和异步方法。同步方法直接设置event.returnValue,异步方法使用event.sender.send(…)。
//在主进程中。const { ipcMain }=require(' electron ')ipcMain。在('上异步-message ',(event,arg)={ console.log(arg) //打印ping' event.sender.send('异步-reply ',' pong')})ipcMain.on('同步-message ',(event,arg)={ console.log(arg) //打印平事件。返回值=' pong ' })//在渲染过程中(网页)。const { ipcRenderer }=需要('电子')控制台。日志(ipcRenderer。sendsync(“”同步-消息、“ping”)//打印pong'ipcRenderer.on('异步-回复,(事件,参数)={ console.log(参数)//打印pong'})ipcRenderer.send('异步-消息、“平”)但其实有更简单的方法,使用遥远的模块来直接调用:
const remote=窗口。节点要求(电子).远程;var本地=远程。需要(' local ');这样子就可以直接使用外部模块了,这里为什么能引用电子模块,而其他的不可以呢?
继续看源码电子重写了模块_resolveFilename .函数,在需要('电子)时,就直接返回路径,所以就可以找到啦。
//补丁模块_resolveFilename .在//需要('电子')完成时总是需要电子应用编程接口const ElePath=路径。join(_ _ dirname,'.'、process.type、‘API’、‘exports’、electronic。js’)const originalResolveFilename=Module ._resolveFilenameModule ._ resolveFilename=function(request,parent,IsMain){ if(request==' electron '){ return ElePath } else { return originalResolvefilename(request,parent,IsMain)} } } } .调用(this,exports,require,module,__filename,_ _ dirname);});以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
版权声明:电子如何调用局部模块的方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。