第一天安装开发环境就出了问题,还是师姐出手帮忙搞定的。
前端组使用了一个自己开发的库叫 excel-tobe-json2,用于多语言环境的。在安装环境的时候,因为 Node 的稳定版是10,所以就下了 Node 10,然后安装 excel-tobe-json2 一直报错。提示找不到 libxml 包一个 0.18.8 版本的压缩包。但是师姐表示在她的机子上可以安装成功。
根据那个压缩包的下载地址可以知道是 Libxmljs 这个包出了问题,师姐一番谷歌找到它的 issue,发现有人提出在 Node10 和 Node9 会出问题,于是尝试把 Node10 卸载了安装 Node8,最后真的成功了。
把解决方案发到群里后,群里一个之前踩过坑的时候是因为 Node10 的模块版本是64,Node8的模块版本是57。而依赖库的0.18.8版本没有提供64的window安装包。其实作者在0.19版本修复了这个问题,但是因为 excel-tobe-json2 用的是 0.18.8,所以只能采用降 Node 版本的方式处理。
什么是 Node 模块版本(NODE_MODULES_VERSION)
这次失败的原因是 Node8 和 Node10 的 NODE_MODULES_VERSION 的版本不同,打开 Node 官网下载之前版本,会发现在版本列表里列出了各个版本的 NODE_MODULES_VERSION 是多少。在页面的底部给出了 NODE_MODULES_VERSION 的解释:
NODE_MODULES_VERSION 是指 Node 的 ABI(application binary interface, 应用程序二进制接口)的版本号,用于确定哪些 C++二进制文件可以被直接加载而无需编译。在早期,版本号曾用十六进制表示,现在用整数表示。
可以想到 NODE_MODULES_VERSION 不同,可能 Node 的 ABI 会有改变。有的 Node 库为了实现更高的性能或者直接操作系统 API,会编写“原生 Node 模块(Native Node Modules)”。Navtive Node Modules 往往需要调用到 Node 底层下 libuv 或者 v8 的 API,所以对 NODE_MODULES_VERSION 的版本会有依赖。
如果下载某个包时因为 NODE_MODULES_VERSION 导致下载失败,很可能这个包依赖了某个 Native Node Modules.
回到上面遇到的问题,如果进入 libxml 的 github 仓库,会发现 libxml 就是一个完全用 C++ 写的一个库。所以 libxml 就是一个 Native Node Modules.
参考资料:
Writing Native Node.js Modules | @RisingStack
Dealing with NODE_MODULE_VERSION in electron · Issue #69 · onmyway133/blog