Open tsy77 opened 6 years ago
最近两天对electron应用一些性能分析,用到了VMtools、visual studio等工具。当然这里不是为了说这些,由于之前没有写过electron,对其实现也不了解,但在测试过程中发现了两个比较有趣的地方。
electron .
electron main.js
一个是/Users/tsy/devspace/electron-quick-start/,另一个则是/Users/tsy/devspace/electron-quick-start/node_modules/electron/dist/Electron.app/Contents/Resources/default_app.asar
/Users/tsy/devspace/electron-quick-start/
/Users/tsy/devspace/electron-quick-start/node_modules/electron/dist/Electron.app/Contents/Resources/default_app.asar
从后向前追溯electron源码,发现appPath在App::SetAppPath中被赋值。
appPath
App::SetAppPath
在electron中有两处调用了App::SetAppPath,一个是在init.js中,一个是在default_app/mian.js中。
init.js
default_app/mian.js
App::SetAppPath第一次调用是在init.js中,init.js是electron初始化的逻辑,在Node中bootstrap_node.js中被加载,init.js中获取appPath的代码如下:
bootstrap_node.js
我们可以看出,其在Resource下分别找app、default_app、default_app.asar,也就是到目前为止,appPath为/Users/tsy/devspace/electron-quick-start/node_modules/electron/dist/Electron.app/Contents/Resources/default_app.asar
app
default_app
default_app.asar
我们在来看App::SetAppPath的第二次调用是在default_app/mian.js中,获取path的代码如下:
这里我们看到,如果执行目录中有package.json,则将当前目录设置成appPath;如果没有,则不会改变原有appPath。
package.json
我们经过上述分析可以看出
main.js/package.json
.asar
在electron中,为了保证加密,将程序员写的应用层代码进行asar打包加密,那么如何加载.asar中的文件呢?
Electron/asar-require可以帮我们做到,加载了此模块后后面可以直接使用require去加载.asar中的文件,他是如何做到的呢?
Electron/asar-require
答案也比较简单,asar-require重写了node require过程中用到的有关fs方法,特别是fs.readFileSync。
asar-require
fs.readFileSync在node require中的作用是读取相应文件路径上的文件内容,下面是asar-require覆写的代码:
最近两天对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源码,发现
appPath
在App::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下分别找
app
、default_app
、default_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
覆写的代码: