Node.js 项目中是怎么安装 sqlite3 的?node-gyp, prebuild, prebuild-install 是用来做什么的?
在 Node.js 环境中,当你安装 sqlite3 模块时,它会自动下载并安装最新版本的 sqlite3 二进制文件,这个过程是自动化的,在你不知不觉中完成。
为什么需要动态安装 sqlite3 呢?因为 sqlite3 不是跨平台的,Mac OS, Windows, Linux 中的 sqlite3 是不一样的,所以不适合事先放在包中,那样包体积就太大了。
sqlite3 通过 prebuild-install 和 node-gyp 这两个工具来安装 sqlite3 的二进制文件。
node-gyp 负责将 C 和 C++ 的源代码动态编译成特定平台下的 .node 二进制文件。node-gyp 本身并不需要二进制文件,它是通过执行 Python 的 gyp 代码和调用系统内置的 C 和 C++ 编译器来完成编译任务的。因此,要使用 node-gyp,你的机器上必须安装有 Python 环境,还要有 C 和 C++ 编译器。
如果每次安装都需要全量的编译一次 sqlite3 不仅会降低安装效率,而且要求主机必须环境齐全,这样不但效率低下,还很不健壮。
所以 prebuild 和 prebuild-install 出现了。
prebuild 正如其名,主要用于为 Node.js 模块预编译相应平台的二进制文件,使得模块可以直接使用而无需从头编译。
预编辑二进制文件通常托管在 github 等公网可以访问的地方,接下来,prebuild-install 在模块安装过程中动态地下载预编译的二进制文件。
prebuild 和 prebuild-install 省去了每次安装模块时都需从源代码编译的步骤,极大地提高了安装效率和用户体验。
总结:当你安装 sqlite3 时,在下载完包代码后,NPM 通过 package.json 中声明的 install hook, 自动调用上面提到的工具,最终把适配这台机器的 sqlite3.node 二进制文件放入包中,安装完成。
因为 sqlite3 是动态安装的,所以通常是最新的版本。而不是机器中的老版本。
你可以通过下面的脚本来查看 sqlite 版本
const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database(':memory:');
db.serialize(() => {
db.each("SELECT sqlite_version() AS version", (err, row) => {
console.log(row.version);
});
});
db.close();