如果你写js, 或者使用hexo
一类的博客工具, 那么应该不会对npm
感到陌生.
npm
是Node.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版本, 可能需要加上-l
or --long
参数
而--help
参数则会显示一份简短的说明.可以看到init
是有两个别名
的, 分别是create
和innit
, 并且带有四个参数,分别是--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
仓库上. 因此设置registry
跟proxy
也是比较常用的命令
- 设置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-sass
及electron
一类需要执行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-exact
跟npm
执行的升级策略有关, 这里不做具体阐述. 最后一个你应该也猜到了它的作用, 就是只安装, 但是不保存依赖信息到package,json
当中.
事实上, install
及其他命令所能附加的参数远不止这里罗列的这些, 你也可以通过--registry
参数指定这一次安装所使用的npm
源, 或者使用--no-proxy
指定这一次暂时不用代理, 使用--save-exact
指定按照package.json
里的版本号安装依赖来避免恼人的自动向上更新策略等等, 这些参数是可以累加的, 具体的用法及可用的参数可以参考npm help install
给出的文档, 这里只做简单提示.
- 开发过程常见问题
很多时候, 很多问题都是在关键的时候出现的. 比如你想安装一个包的时候, 死活安装不上来, 各种错误都有...这里我们简单列举几个平时比较有可能遇到的.
- unexpected toekn|json|html
导致这个问题的原因一般有两种, 要么, 你开了代理, 但是使用的npm
源是代理服务器无法访问的; 要么, 你上一次的CTRL+C
导致了npm的缓存出现了问题, 你需要npm cache clean
这个命令, 记得加上--force
. 如同运行之后给出的提示, 我们只建议你在走投无路的时候尝试, 因为node_modules
机制下, 缓存是比较珍贵的?.
- EPERM
基本上, 出现这个错误的时候错误信息已经告诉你是权限问题了, Unix
系统下需要sudo
执行, Windows NT
下需要管理员身份的command prompt
.
- 同一个项目, Jack新增的项目依赖在Lucy那里install之后就error不断
你可能是中了semver
版本策略的招, 具体的可以通过npm help update
查看详细的升级策略, 具体的解法是, 你可以让其他人在执行install
命令的时候加上--save-exact
参数.
- 发布
发布的话, 除了publish
, 有一个比较使用的命令, 就是whoami
. 它可以查看当前registry
下登录的用户, 未登录或者登录的registry
不对就会给出error.
Conclusion
事实上, 这里的绝大多数内容在npm
的doc上都有. 我只列举了一部分常用的以及一些使用技巧. help
命令的使用方式在大多数CLI
应用上是差不多的, 你可以举一反三地都自己试试. 如果有更好地建议或者错误需要指出, 敬请留言评论啦. That's All.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。