是时候放弃用 cnpm 命令了
发布于 3个月前 作者 qiu8310 774 次浏览 来自 分享

在我们中国,要下载 npm 包非常慢,如果使用 cnpm 下载包就非常快了,感觉很爽,但是 cnpm 也有几个大问题:

  • 1.cnpm 的仓库只是 npm 仓库的一个拷贝,它不承担 publish 工作,所以你cnpm publish 命令会执行失败的

  • 2.不仅是 publish 会执行失败,其它的需要注册用户(npm adduser)、或者修改 package 状态等命令都无法用 cnpm

  • 3.有很多 npm 包都集成了 npm install,比如 yeoman 的所有 generators ,在最后基本都会调用 npm install,( 可以看其源码 )这种情况下使用 cnpm 完全无效,必须中断操作,然后自己手动运行 cnpm install,或者在运行 yo [generator] 时就指定 --skip-install,这体验就很不爽了

  • 4.还有一种情况是,很多和 npm API 相关的 package,都会读取 ~/.npmrc 中的 registry,或者使用默认的 registry —— [https://registry.npmjs.org/][npm-registry],去查询 npm package 相关的信息,比如下面这些:

    • npm-latest: 查询某个 package 的最新版本号
    • npm-name: 查询某个 package name 是否被注册了
    • npm-dependents: 查找某个模块所依赖的其它所有模块

    如果你用的任何一个包或其所依赖的包中用了这些 package,那么在这些包请求网络时也得慢死了!

怎么解决上面的问题呢?

可以来使用我写的 smart-npm 模块,它封装了 npm 和 cnpm 在里面,根据你使用的命令自动切换 npm 或者 cnpm。

更多详情可以去 smart-npm 查看,也欢迎诸位来吐槽

22 回复

我有一个建议,就是把包名取短一点。snpm 之类的。

这个倒不是很必要,因为你安装 smart-npm 后,它会取代你系统的 npm 的,使用的时候并不需要使用 smart-npm 命令,直接用 npm 就行,这就是为什么我叫它 smart-npm。

真的用上cnpm的用户不会只用cnpm的国内镜像功能,都会在内部搭上一个企业私有npm 自豪地采用 CNodeJS ionic

@fengmk2 这我到是没用过,研究下,谢谢了

@fengmk2 我们中国还是有很多个人用户用 npm 或者 cnpm 的,像我就从来没接触过企业私有的 npm;即使是企业私有的,它也不可能完全不用开源的一些 package 吧。

@qiu8310 cnpm的两个用法是: 1、发布和安装私有前缀的包,比如 @company/package-name 2、安装公共的npm包

@leizongmin cnpm 只是对 npm 的一个封装,在忽略网络被强的情况下,cnpm 能做的, npm 也一般都能做

1、你说的第1点,npm 已经禁用了发布带私有前缀的包到官方的 registry 了,你说可以发布我猜测应该是像 @fengmk2 说的搭建了一个私有的 npm 仓库,这和用 npm 或者 cnpm 无关,主要不过就是配置一个 registry 而已

2、安装公共的 npm 包它也就是配置了下 registry,把它指定到了淘宝的 registry,并且加上了其它一下环境变量

你上面说的其实都是 npm 的功能, 和 cnpm 无关,cnpm 只是帮你进一步配置了下;这些你用 smart-npm 都可以做到,你有兴趣可以去了解下 cnpm 及 smart-npm 原理,非常简单,无非是对 npm 进行的一次次封装,其实大家最终用的功能都是 npm 。

@qiu8310 其实是你理解错了。 1、我指的cnpm是自己搭建一个 http://cnpmjs.org/ 这样的私有npm,可以把一些不想公开的包发到这个私有npm上去,这样自己可以使用cnpm命令来安装,而其他人安装不了。对于一些可以公开的包,我们是直接发到npm上。 2、而cnpm命令的一个好处时,你可以cnpm install 安装私有的包,也可以安装公共的包,所以大家往往也把cnpm当作是一个npm镜像。 3、简而言之,你没弄懂cnpm是干嘛的。

我大概是弄懂楼主这个工具的用途了,『使用cnpm命令安装模块很快,但是publish模块时需要切换回npm命令,smart-npm可以省去来回切换的麻烦,它会替换原来的npm命令,使用npm命令安装模块时自动选择cnpm的镜像』 给些建议: 1、安装smart-npm时直接把淘宝的镜像配置好就行了(或写死在程序里面),不需要用户自己再手动配置(因为淘宝的镜像相对稳定,不会过一阵就没了的) 2、介绍里面废话太多,一眼看不出这个东西是干嘛的,只知道是要『干掉cnpm』

@leizongmin 好吧,看来现在流行用私有的仓库了。

我说的只是 cnpm 那个命令 https://github.com/cnpm/cnpm ,和私有仓库没关,所以你也没有理解我说的。

如果你用了 cnpm 的私有仓库,那算了,还是用 cnpm 命令吧;我只是个人用户,用不着私有仓库,我相信有很多像我这样的人。

@leizongmin 抱歉,文笔确实不好。

@leizongmin 感觉你还是没明白 smart-npm 。

@qiu8310 那就再写简明一点的介绍呗,我相信还是有一部分人没看明白的 ^_^

@leizongmin 简而言之,你说的是 cnpm 的服务端,而我说的是 cnpm 的客户端。

@leizongmin 语言表达是我的硬伤,我更新了一下我的 github 上的文档,有兴趣可以去瞧瞧 https://github.com/qiu8310/smart-npm

额,没觉得npm慢

@jinceon 你用了 VPN,或者不在中国 ?

支持楼主。

前排围观呼啦啦~

@qiu8310 哦哦,我是用了代理,我没留意到代理是全局的,还以为仅浏览器。

localhost:~ jinceon$ ping www.youtube.com
PING youtube-ui-china.l.google.com (184.168.134.127): 56 data bytes
64 bytes from 184.168.134.127: icmp_seq=0 ttl=51 time=219.565 ms
64 bytes from 184.168.134.127: icmp_seq=1 ttl=51 time=218.498 ms
64 bytes from 184.168.134.127: icmp_seq=2 ttl=51 time=216.837 ms
64 bytes from 184.168.134.127: icmp_seq=3 ttl=51 time=217.746 ms
^C
--- youtube-ui-china.l.google.com ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 216.837/218.161/219.565/1.001 ms

更新到 1.0.0 了,去掉了内嵌的 cnpm,内嵌 cnpm 很多命令会和 npm 冲突

回到顶部