tsy77 / blog

78 stars 2 forks source link

初识Electron #15

Open tsy77 opened 6 years ago

tsy77 commented 6 years ago

最近两天对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

结论:

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

如何加载.asar中的文件

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

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

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

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