blog icon indicating copy to clipboard operation
blog copied to clipboard

初识Electron

Open tsy77 opened this issue 7 years ago • 0 comments

最近两天对electron应用一些性能分析,用到了VMtools、visual studio等工具。当然这里不是为了说这些,由于之前没有写过electron,对其实现也不了解,但在测试过程中发现了两个比较有趣的地方。

electron .electron main.js启动时,appPath竟然不同

表象如下:

一个是/Users/tsy/devspace/electron-quick-start/,另一个则是/Users/tsy/devspace/electron-quick-start/node_modules/electron/dist/Electron.app/Contents/Resources/default_app.asar

分析过程:

从后向前追溯electron源码,发现appPathApp::SetAppPath中被赋值。

在electron中有两处调用了App::SetAppPath,一个是在init.js中,一个是在default_app/mian.js中。

App::SetAppPath第一次调用是在init.js中,init.js是electron初始化的逻辑,在Node中bootstrap_node.js中被加载,init.js中获取appPath的代码如下:

我们可以看出,其在Resource下分别找appdefault_appdefault_app.asar,也就是到目前为止,appPath/Users/tsy/devspace/electron-quick-start/node_modules/electron/dist/Electron.app/Contents/Resources/default_app.asar

我们在来看App::SetAppPath的第二次调用是在default_app/mian.js中,获取path的代码如下:

这里我们看到,如果执行目录中有package.json,则将当前目录设置成appPath;如果没有,则不会改变原有appPath

结论:

我们经过上述分析可以看出

  • 当我们调用electron .时,表示当前目录,其中有package.json,所以当前目录被设置成appPath
  • 当我们调用electron main.js时,main.js/package.json不存在,则appPath保持/Users/tsy/devspace/electron-quick-start/node_modules/electron/dist/Electron.app/Contents/Resources/default_app.asar

如何加载.asar中的文件

在electron中,为了保证加密,将程序员写的应用层代码进行asar打包加密,那么如何加载.asar中的文件呢?

Electron/asar-require可以帮我们做到,加载了此模块后后面可以直接使用require去加载.asar中的文件,他是如何做到的呢?

答案也比较简单,asar-require重写了node require过程中用到的有关fs方法,特别是fs.readFileSync。

fs.readFileSync在node require中的作用是读取相应文件路径上的文件内容,下面是asar-require覆写的代码:

tsy77 avatar Sep 18 '18 08:09 tsy77