共计 2845 个字符,预计需要花费 8 分钟才能阅读完成。
如果你写 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 版本, 可能需要加上 -lor –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.