智能的 npm
,让你在中国使用 npm
时,下载速度更快,使用更方便!
用
npm
时,默认它会访问国外资源,所以会非常卡,有时甚至会被墙。现在市面上一般有三种解决方案:
在
.npmrc
上配置一个国内的 registry 镜像使用
cnpm
使用 VPN
-
第1个方案很粗暴,可以解决很多下载慢的问题,但是当你用
npm publish
时就会失败 -
第2个方案不错,但这样你就又会遇到问题,到底哪些命令需要用
cnpm
,哪些命令需要用npm
呢? -
VPN 方案有时也不能百分百解决问题,有时有些 VPN 也不稳定,但有个 VPN 很保险就是
其实
cnpm
的意图并不是简单给我们用来去下载npm
资源的,它是为 cnpm 服务端(也可以理解成 npm 的私有仓库)服务的。所以你如果简单的把cnpm
当作npm
来用会有出现很多问题(见下)。
所以,我们就需要一个更智能的 npm
了,可以在我们使用 npm install
时自动从国内的镜像下载,而在我们使用 npm publish
又能发布到官方的 registry 上!
npm install --global smart-npm --registry=https://registry.npm.taobao.org/
安装成功后默认会在你的 npm
用户配置文件 ~/.npmrc
中添加淘宝的 registry。
- Linux 用户可以在
~/.bashrc
文件中加一行
alias npm=smart-npm
- Mac 用户可以在
~/.bash_profile
文件中加一行
alias npm=smart-npm
- Window 用户需要先定位到
npm.cmd
和smart-npm.cmd
两个文件,然后用smart-npm.cmd
替换npm.cmd
(注意备份原来的 npm.cmd),同时注意修改下smart-npm.cmd
文件里的路径,否则运行 npm 会报找不到文件错误(如果不明白,建议不要替换,直接使用 snpm 或 smart-npm)
可以使用命令 where smart-npm
来定位到 smart-npm.cmd
文件所在的位置。如:在我的系统上执行 where smart-npm
的结果是:
C:\Users\Mora>where smart-npm
C:\Program Files\nodejs\smart-npm
C:\Program Files\nodejs\smart-npm.cmd
同理可以定位到 npm.cmd
的位置
smart-npm 使用的是内部的 npm,和系统的 npm 没有任何关系
snpm install-npm # 安装最新版的 npm
snpm install-npm 4 # 安装 4.x.x 版本的 npm
npm uninstall --global smart-npm
安装后,你可以使用命令 snpm
或 smart-npm
,如果你按上面的方法替换了原生的 npm
,那么你也可以直接使用 npm
-
新的
snpm
会自动根据你使用的命令切换 registry:当你使用publish
,config
,adduser
,star
等(click here to see more) 命令时,会强制使用官方的 registryhttps://registry.npmjs.org
;当你使用其它命令时,都会使用淘宝的镜像https://registry.npm.taobao.org/
。-
如果要强制使用某个 registry 时,只要在命令后面添加 registry 参数即可,比如,
snpm install jquery --registry=https://r.cnpmjs.org
就会使用你指定的 registry 去拉取jquery
-
如果要强制使用官方的 registry, 只要在命令后面加上
--npm
即可, 比如,snpm install jquery --npm
就会使用官方的 registry 去拉取jquery
,(当镜像没有及时更新时,用此会选项很有效) -
如果你想修改默认的淘宝镜像或者官方的 registry,可以在你的环境变量中添加这两个参数:
NPM_OFFICIAL_REGISTRY
,NPM_MIRROR_REGISTRY
,以此来修改默认的官方 registry 和 淘宝镜像 registry。 更多环境变量的配置请点击这里
-
-
snpm check
: 由 npm-check 提供,和npm outdated
类似,但提示更人性化,同时它也支持自动更新依赖 -
snpm stats {package}
: 打开一个网页,可以看到 package 的统计数据,包括被下载的次数、最近更新时间、被依赖的次数及排名等数据 -
snpm user {package}
: 打开一个网页,跳到用户的npm
上的个人主页,如果加了参数-t
,则是跳到淘宝镜像的个人主页
-
npm repo {package}
: 用浏览器打开 package 的 github 地址(前提是此 package 的 package.json 文件中有设置repository
) -
npm home {package}
: 用浏览器打开 package 的首页(前提是此 package 的 package.json 文件中有设置homepage
) -
npm user {package}
:cnpm
的功能,用浏览器打开用户在淘宝镜像的主页,如https://npm.taobao.org/~{user_name}
-
npm view {package} versions
:查看 package 的所有版本号(只会显示版本号,不显示其它信息) -
npm outdated
:检查当前项目所依赖的 packages 是否有最新的版本可以更新
-
publish
,adduser
,login
(Click here to see more) 等命令无法通过cnpm
来执行,即运行cnpm publish
来发布一个版本会失败的 -
某些命令在
cnpm
和npm
上表现完全不一样,比如:
cnpm version
:显示当前cnpm 版本号
; 而npm version
:是可以修改当前 package 的版本号的cnpm -g root
:会报错; 而npm -g root
会显示 global 安装的目录
-
有很多
npm
包都集成了npm install
,比如 yeoman 的所有generators
,在最后基本都会 调用npm install
,(可以看其源码) 这种情况下使用cnpm
完全无效,必须中断操作,然后自己手动运行cnpm install
,或者在运行yo [generator]
时就指定--skip-install
, 这体验就很不爽了 -
还有一种情况是,很多和
npm
API 相关的 package,都会读取~/.npmrc
中的 registry,或者使用默认的 registry —— https://registry.npmjs.org/, 去查询 npm package 相关的信息,比如下面这些:- npm-latest: 查询某个 package 的最新版本号
- npm-name: 查询某个 package name 是否被注册了
- npm-dependents: 查找某个模块所依赖的其它所有模块
- ...
如果你用的任何一个包或其所依赖的包中用了这些 package,那么在这些包请求网络时也得慢死了!
--loglevel
- silent: completely silent. Zero logging output.
- win: Just the “npm ok” or “npm not ok” message at the end.
- error: When something unexpected and bad happens.
- warn: When something odd or potentially dangerous is happening.
- info: Helpful information so you can track what’s happening.
- verbose: Even more. Perhaps just a wee bit obnoxious, even.
- silly: Completely fuckin crazy, man. Dump everything. Whole objects, you name it, whatever.
特定 loglevel 的缩写信息
- s : ["--loglevel", "silent"]
- d : ["--loglevel", "info"]
- dd : ["--loglevel", "verbose"]
- ddd : ["--loglevel", "silly"]
- silent : ["--loglevel", "silent"]
- verbose : ["--loglevel", "verbose"]
- quiet: ["--loglevel", "warn"]
- q: ["--loglevel", "warn"]
- 本地安装也会替代了全局的
npm
- 添加更多有用的组件
- 修改
stats
命令,把数据显示在命令行上
Copyright (c) 2015 Zhonglei Qiu. Licensed under the MIT license.