Total Pageviews

Tuesday, 12 November 2019

NPM 安装第三方模块常见问题


断网的机器,没法直接 npm install xxx 怎么办?

在部署 Node.js 写的应用时,我们都会在应用的根目录下执行 npm install 来安装所有 的依赖模块,安装第三方模块也一样,你只要找到这个模块的源码,执行 npm install 即可。
假如我们要安装一个叫 xss 的模块,因为不能直接用 npm install xss 来安装, 首先我们得想办法获取到这个这个模块的源码。
先在浏览器中打开模块的主页: https://npmjs.org/package/xss (如果不明白这个网址是怎么来的, 请阅读 《寻找第三方模块》
这时候我们可以知道 xss 这个模块的源码托管在 github 上,我们可以通过 git 命令 把源码拉下来: git clone git://github.com/leizongmin/js-xss.git
为了能让应用访问到这个模块,我们需要把源码放在应用的 node_modules 目录里面, 比如这个模块叫 xss ,那么它的源码就应该在 node_modules/xss 目录里面。
然后进入 node_modules/xss 目录,打开这个模块的 package.json 文件,看看 dependencies 这一项中是否有指定依赖模块,如果有的话,按照相同的方法把其依赖 模块也安装到这个模块的 node_modules 目录里。
(如果不明白为什么要放到 node_modules 目录, 请阅读 《Node.js API - Modules》

模块源码没有托管到 github

假如某个模块没有将源码托管到 github 这样的开源平台上,我们照样有办法获取到它的 源码:把 https://registry.npmjs.org/模块名/-/模块名-版本号.tgz 这个压缩包下载 下来即可。
比如要下载 xss 模块 0.0.6 版本的源码,其对应的网址就是 https://registry.npmjs.org/xss/-/xss-0.0.6.tgz 。把压缩包下载下来后,先解压, 其里面的 package 目录即是这个模块的源码,这时候就可以按照上面说的那样安装了。

不需要 C++ 编译的模块还有更简便的安装方法

大多数的第三方模块都是纯 JavaScript 写的,不需要进行 C++ 编译,我们只要在一台 能使用 npm install xxx 安装模块的机器上把模块安装好,直接复制到应用的 node_modules 目录即可。

如何使用私有的模块

1、搭建私有 NPM 库

一般一些大的公司,有自己内部的 Node.js 模块库时,会尝试这种搭建私有的 NPM 库, 搭建好之后,直接使用 npm install xxxx 来安装模块,但是操作难度较大,有兴趣的 可以参考 The couchdb setup for registry.npmjs.org and search.npmjs.org

2、通过一个 js 文件来链接

假如有一个私有模块 abc ,其源码放在 /npm/abc 目录,我们可以直接在当前应用的 node_modules 目录下创建一个文件 abc.js,其内容如下:
module.exports = require('/npm/abc');
然后就可以直接通过 require('abc') 来载入这个私有模块了。
当同时在开发几个模块,而这几个模块存在依赖关系时,使用这种方法也能方便调试。

npm install 时出错

域名解析出错

有时候网络不稳定会导致安装不成功,比如显示如下出错信息:
npm http GET http://registry.npmjs.org/supervisor
npm ERR! Error: getaddrinfo EADDRINFO
npm ERR! at errnoException (dns.js:37:11)
npm ERR! at Object.onanswer [as oncomplete] (dns.js:124:16)
npm ERR! If you need help, you may report this log at:
npm ERR! http://github.com/isaacs/npm/issues
npm ERR! or email it to:
npm ERR! npm-@googlegroups.com

npm ERR! System Linux 3.2.0-23-generic-pae
npm ERR! command "/usr/bin/node" "/usr/bin/npm" "install" "-g" "supervisor"
npm ERR! cwd /home/lwj
npm ERR! node -v v0.10.18
npm ERR! npm -v 1.3.8
npm ERR! syscall getaddrinfo
npm ERR! code EADDRINFO
npm ERR! errno EADDRINFO
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /home/lwj/npm-debug.log
npm ERR! not ok code 0
从中可以找到 syscall getaddrinfocode EADDRINFO 这两行,EADDRINFO 表示 在尝试解析域名的时候出错了,没法从 registry.npmjs.org 上下载模块的源码, 这时候我们只需要重新执行一遍命令即可。如果问题还没有解决,应该检查一下本地机器 域名解析服务是否正常,某些地区 registry.npmjs.org 这个域名会被屏蔽。如果实在 无法通过命令直接安装模块,可参考本文开头提到的方法来手动安装。