1

​ 如果你写js, 或者使用hexo一类的博客工具, 那么应该不会对npm感到陌生.

npmNode.js的包管理工具(package manager), 它的背后是Node.js的社区生态在支持. 我们今天聊聊npm的玩儿法, 包括了常用的命令和参数以及在具体场景下的用法.

前言

我们今天只谈npm, 相关的辅助工具各位可以留言评论.

用好help

几乎所有的命令行工具/程序(Command Line Tool)都会有help这个命令或者--help这个参数, 没有的要么是程序本身就是只供第三方调用api的, 要么就是开发者不够专业. 再好的程序开发出来如果目标受众无从得知它的用法, 那么它就等同于不存在.

npm的帮助功能十分优秀, 直接运行npm help或者npm --help将会得到如下结果

图片描述

可以看到, 所有的命令都已经罗列在这里了, 如果你想知道具体某个命令的用法, 可以直接在help后面跟上命令名称, 或者直接执行命令, 并在后面加上--help参数

npm help init
# or
npm init --help

区别在于, help命令会展示详情的文档, 也就是会调用浏览器打开本地的html页面. 取决于你的npm版本, 可能需要加上-lor --long参数

--help参数则会显示一份简短的说明.可以看到init是有两个别名的, 分别是createinnit, 并且带有四个参数,分别是--force -f, --yes -y --scope,这里要注意的是-f-y分别是--force--yes的简写, 对应的结果是一样的.

事实上这是CLI(Command Line Interface)设计的一个通用规范. 你可以在别的命令行程序上发现类似的用法.

图片描述

npm help最厉害的地方在于, 如果你不知道具体的命令名称, 或者只是想要知道某个知识点, 那么它也可以做模糊搜索, 命令的用法跟上面的相同, 比如

npm help scri

将会得到

图片描述

npm将会列举出所有它认为可能的条目供你查阅.

如果有兴趣, 你可以通过npm -l发现更多详细的用法.

从项目的创建到发布

我们来以这个流程走一遍在开发当中会跟npm打交道的地方.

  • 初始化项目

也就是要创建一个package.json文件了,

npm init # 选择性的使用-y|--yes参数可以快速跳过问答, 直接创建一份默认配置

正常情况下你就可以开始安装相应的依赖了.但是在有些情况下, 你可能会有切换registry以及设置代理的烦恼. 甚至于不同的项目可能有不同的私有包位于不同的私有npm仓库上. 因此设置registryproxy也是比较常用的命令

  • 设置registry

我们还是先跑一下帮助, 看看能得到什么信息

npm config --help

图片描述

See! 相应的CURD操作一目了然, 所以我们可以这样子设置代理和npm

npm config set registry https://registry.npm.taobao.org
npm config set proxy http://127.0.0.1:1080

是的, help就是这么强大且方便, 读到这里, 如果你动手能力比较强, 可以直接去实践了(当然最好可以读完啦).

这里需要说明的地方是, 设置了proxy之后, 类似node-sasselectron一类需要执行postinstall脚本的package, 下载时也将会应用这个代理设置.

  • 创建适用于工程的配置文件

你可以直接在项目的根目录下创建.npmrc文件, 以键值对的形式写上对应的配置项, 保存之后就会在项目范围内生效了.

registry=https://registry.npmjs.org
sass_binary_site=https://npm.taobao.org/mirrors/node-sass/

同样, 全局范围内生效的.npmrc在你的用户目录下, 二者都存在时, 将优先应用项目下的配置.

  • 安装依赖

话不多说, 先跑一下help

图片描述

install带有的功能及参数就比较多了, 我们一一过一遍.

首先不带参数的时候, 就会安装package.json内的所有依赖, 正常情况下会将dependencies devDependencies optionalDependencies 三种种依赖类型全部安装.(如果你想知道全部四种依赖(还有个peerDependencies)的详细信息, 可以通过npm help package.json查阅).

install的路径, 可以是包名, 本地文档或者git地址

install带有几个参数, 前三个分别意味着将安装的依赖划分到指定的依赖类型当中. --save-exactnpm执行的升级策略有关, 这里不做具体阐述. 最后一个你应该也猜到了它的作用, 就是只安装, 但是不保存依赖信息到package,json当中.

事实上, install及其他命令所能附加的参数远不止这里罗列的这些, 你也可以通过--registry参数指定这一次安装所使用的npm源, 或者使用--no-proxy指定这一次暂时不用代理, 使用--save-exact指定按照package.json里的版本号安装依赖来避免恼人的自动向上更新策略等等, 这些参数是可以累加的, 具体的用法及可用的参数可以参考npm help install给出的文档, 这里只做简单提示.

  • 开发过程常见问题

很多时候, 很多问题都是在关键的时候出现的. 比如你想安装一个包的时候, 死活安装不上来, 各种错误都有...这里我们简单列举几个平时比较有可能遇到的.

  1. unexpected toekn|json|html

导致这个问题的原因一般有两种, 要么, 你开了代理, 但是使用的npm源是代理服务器无法访问的; 要么, 你上一次的CTRL+C导致了npm的缓存出现了问题, 你需要npm cache clean这个命令, 记得加上--force. 如同运行之后给出的提示, 我们只建议你在走投无路的时候尝试, 因为node_modules机制下, 缓存是比较珍贵的?.

  1. EPERM

基本上, 出现这个错误的时候错误信息已经告诉你是权限问题了, Unix系统下需要sudo执行, Windows NT下需要管理员身份的command prompt.

  1. 同一个项目, Jack新增的项目依赖在Lucy那里install之后就error不断

你可能是中了semver版本策略的招, 具体的可以通过npm help update查看详细的升级策略, 具体的解法是, 你可以让其他人在执行install命令的时候加上--save-exact参数.

  • 发布

发布的话, 除了publish, 有一个比较使用的命令, 就是whoami. 它可以查看当前registry下登录的用户, 未登录或者登录的registry不对就会给出error.

Conclusion

事实上, 这里的绝大多数内容在npm的doc上都有. 我只列举了一部分常用的以及一些使用技巧. help命令的使用方式在大多数CLI应用上是差不多的, 你可以举一反三地都自己试试. 如果有更好地建议或者错误需要指出, 敬请留言评论啦. That's All.


豆豌
11 声望1 粉丝