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依赖包。