深入浅出Electron:原理、工程与实践
上QQ阅读APP看书,第一时间看更新

1.2 npm钩子

要想了解npm为项目安装Electron依赖包的执行细节,开发者可以给npm install指令增加两个参数来观察npm安装过程都做了什么,指令如下所示:

> npm install electron --save-dev  --timing=true --loglevel=verbose

这两个参数会把安装过程的日志打印到用户的控制台上,由于输出信息过多,本书不再摘录,只讲解安装的主要过程。

npm通过http fetch的形式获取到一个json文件,json文件的内容详见https://registry.npmjs.org/electron

这个json文件包含Electron的所有历史版本。如果用户在安装Electron时没有指定Electron的版本号,npm会从这个json文件中获取最新的版本并为用户安装。

当npm工具把Electron的包文件从服务器上下载下来并保存到项目的node_modules目录后(Electron依赖的其他包也会被放置在这个目录下),npm工具会检查node_modules\electron\package.json文件,看看这个文件内有没有配置postinstall脚本,如果有则执行post-install配置的脚本指令,以下代码是Electron依赖包在package.json文件中配置的post-install脚本:

"scripts": {
  "postinstall": "node install.js"
},

postinstall脚本是依赖包的开发者为npm工具定义的一个钩子,任何一个npm包都可以为自己指定这样的钩子,这个钩子会在依赖包安装完成后被npm执行。

除了postinstall钩子外,开发者还可以定义如下这些钩子。

  • preinstall:包安装之前执行;
  • postuninstall:包被卸载之后执行;
  • preuninstall:包被卸载之前执行;
  • poststart:当npm start执行后触发;
  • poststop:当npm stop执行后触发;
  • posttest:当npm test执行后触发。

如果你将来打算开发一个供其他人使用的npm包,那么应该了解这些钩子的具体含义和应用场景,更详细的文档请参阅https://docs.npmjs.com/misc/scripts

也就是说,在安装完Electron依赖包后,npm的任务还没有完成,还要继续执行install.js文件。install.js脚本负责下载Electron可执行文件及其二进制资源,我们前面看到的异常信息也是由它引发的(当下载失败时,就输出了那段错误信息)。

下面就来看一下install.js脚本是如何下载Electron可执行文件及其二进制资源的,以及如何利用install.js脚本提供的镜像策略顺利地安装Electron依赖包。