智能的 npm
,让你在中国使用 npm
时,下载速度更快,使用更方便!
通知:新发布的 1.0.0 版本去掉了 cnpm
模块,详情查看 Changelog
用
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 上!
windows 用户安装后,体验没有原生的好,因为每次运行都会创建一个子程序,所以请慎装!
# 先将系统的 npm 备份到 npm-original
ln -s $(npm root -g)/npm/bin/npm-cli.js $(dirname $(which npm))/npm-original
npm install --global smart-npm --registry=https://registry.npm.taobao.org/
npm install --global smart-npm --registry=https://registry.npm.taobao.org/
安装成功后默认会在你的 npm
用户配置文件 ~/.npmrc
中添加淘宝的 registry。
# 备份系统默认的 npm 到 npm-original
alias npm_backup='ln -s -i $(npm root -g)/npm/bin/npm-cli.js $(dirname $(which npm))/npm-original'
# 恢复系统默认的 npm
alias npm_recover='ln -s -f $(npm root -g)/npm/bin/npm-cli.js $(dirname $(which npm))/npm'
# 重新启用 smart-npm
alias npm_smart='ln -s -f $(npm root -g)/smart-npm/bin/smart-npm.js $(dirname $(which npm))/npm'
# 更新 smart-npm 中的 npm 版本
alias npm_update='cd $(npm root -g)/smart-npm/ && npm update npm && cd -'
-
安装后系统的
npm
会被替换了,如果你要使用原生的npm
命令,可以用npm-original
代替。 -
新的
npm
会自动根据你使用的命令切换 registry:当你使用publish
,config
,adduser
,star
等(click here to see more) 命令时,会强制使用官方的 registryhttps://registry.npmjs.org
;当你使用其它命令时,都会使用淘宝的镜像https://registry.npm.taobao.org/
。-
如果要强制使用某个 registry 时,只要在命令后面添加 registry 参数即可,比如,
npm install jquery --registry=https://r.cnpmjs.org
就会使用你指定的 registry 去拉取jquery
-
如果要强制使用官方的 registry, 只要在命令后面加上
--npm
即可, 比如,npm install jquery --npm
就会使用官方的 registry 去拉取jquery
,(当镜像没有及时更新时,用此会选项很有效) -
如果你想修改默认的淘宝镜像或者官方的 registry,可以在你的环境变量中添加这两个参数:
NPM_OFFICIAL_REGISTRY
,NPM_MIRROR_REGISTRY
,以此来修改默认的官方 registry 和 淘宝镜像 registry。 更多环境变量的配置请点击这里
-
-
npm check
: 由 npm-check 提供,和npm outdated
类似,但提示更人性化,同时它也支持自动更新依赖 -
npm stats {package}
: 打开一个网页,可以看到 package 的统计数据,包括被下载的次数、最近更新时间、被依赖的次数及排名等数据 -
npm 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 是否有最新的版本可以更新
npm uninstall --global smart-npm
mv $(which npm-original) $(dirname $(which npm-original))/npm
-
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.