玩转 NPM

玩转 NPM

npm本来是Node.js的包管理工具,但随着JS这几年的蓬勃发展,现在的npm已经成了几乎所有跟JS相关的工具和软件包的管理工具了,并且还在不断发展完善中。

本文从笔者的经验,总结了npm安装/卸载、更新、发布这几个最主要功能的正确使用姿势和一些小技巧,顺便从官网搬来了npm3处理依赖的重大变化。

npm3

npm团队已经发布了npm3,近期有小伙伴吐槽npm3安装软件包的时候很慢,一开始笔者也感觉相比npm2慢了不少,但经过了几个版本的迭代,速度似乎又快起来了。

慢的同学是时候更新你的npm啦,而且之前安装进度条模糊成一坨的问题也已经修复了。

npm提供了大量的命令,所有的命令几乎都可以通过npm cmd [options]的方式使用。

npm -h

学习一个命令行工具,最简单直接的方式就是查看它的用户手册,npm提供了并不算很详细的命令行手册,可以通过npm -h查看(unix用户还可以通过man npm查看,相对来说比windows详细多了),需要某个npm命令更详细的文档则需要通过npm help cmd如npm help install来查看,注意不是 npm install help ,这样将会安装help包。

另外npm cmd -h也是一个快速查看命令可以怎么使用和搭配哪些常用选项的方法。

npm init

说到npm就不得不说package.json,每一个npm包都必须有一个package.json文件,年轻时候的我还傻乎乎的从其他地方拷贝package.json过来然后修改,为了自动化还写了个自动生成的脚本。

后来才发现原来npm自带此功能,官方原厂功能更好更强大,只需要执行npm init即可,以交互方式完成package.json的创建。

如果想生成默认package.json,可以执行npm init -y,连交互式界面都不会出现。

另外需要注意,npm init的时候需要输入用户字段,如果还没有设置npm用户,需要通过npm addUser设置。

事实上,最小单位的npm包就是只包含一个package.json文件的包,这样的话npm init就完成了一个npm包的创建。

npm install/uninstall

npm install作为npm最重要的功能和最常用的功能,不用过多说明,这里只介绍三个非常有用的选项–global,–save,–save-dev。

想必读者肯定知道–global可以简写成-g,其实另外两个选项也有简写形式,–save可以简写成-S,–save-dev可以简写成-D,注意大写。

另外npm install也可以简写成npm i,相应的卸载命令npm uninstall可以简写成npm un,事实上npm的很多命令和选项在设计上都非常类似unix上的命令行功能,这里指的是命令和选项都可以极大化地简写,只要在不混淆的情况下。

npm uninstall和npm install接受同样的选项和参数。

–save的作用是在packaje.json的dependencies字段增加或者修改一个安装包和版本号名值对,–save-dev则是修改devDependencies,这样就不用安装了某个包之后手动修改package.json,npm已经帮我们把包依赖和版本管理做好了。

以安装react为例,

npm i react -S将为package.json增加


  1. "dependencies": {
  2. "react": "^0.14.7"
  3. }

npm i react -D将增加


  1. "devDependencies": {
  2. "react": "^0.14.7"
  3. }

npm update

假如react@15(版本号,下同)发布了,想尝鲜的小伙伴该怎么更新呢?

首先得知道npm上是否已经更新,npm info react可以查看到react在npm上发布过哪些版本以及最新的版本,但是内容太多,让人眼花缭乱,配合grep会好一些。

其实我们只想知道react最新的版本,使用npm dist-tags ls react直接列出react发布过哪些tag,


  1. > npm dist-tags ls react
  2. 0.10.0-rc1: 0.10.0-rc1
  3. 0.11.0-rc1: 0.11.0-rc1
  4. latest: 0.14.7
  5. next: 15.0.0-rc.1

以及这些tag目前最新是哪些版本,比如最常用的latest,也是默认tag。

next tag已经发布了react@15的第一个rc版了,尝鲜的朋友可以试一试了。

另外一个命令npm outdated,会检测当前安装的所有npm包是否有更新,并列出可以更新的包,如果没有任何输出,那么恭喜你,所有的包都是不需要更新的。

如果之前安装的react版本是0.14.3,同时还安装了redux@3.2.0,执行npm outdated会输出


  1. Package Current Wanted Latest Location
  2. react 0.14.3 0.14.7 0.14.7 example
  3. redux 3.2.0 3.3.1 3.3.1 example

这种情况则说明react和redux该更新了,更新具体某个包使用npm update package_name即可,npm update则会更新所有可更新的包。

npm publish

npm作为一个大仓库,每天都有大量的新包发布上来,发布自己的包非常容易,而且几乎零门槛,对应的发布的命令是npm publish,但前提是你需要一个npm账号。

假设已经有账号了,在发布之前需要使用npm login进行登录,正式发布之前请先阅读以下关于版本号的介绍。

npm包的版本号一般都是x.y.z的形式。

其中x表示主版本号,通常有重大改变或者达到里程碑才改变;

y表示次要版本号,或二级版本号,在保证主体功能基本不变的情况下,如果适当增加了新功能可以更新此版本号;

z表示尾版本号或者补丁号,一些小范围的修修补补就可以更新补丁号。

第一版本通常是0.0.1或者1.0.0,当修改了代码,需要更新版本号重新发布到npm,不知道的小伙伴(年轻的我)肯定会手动修改package.json的version字段,而高级的玩法是直接使用npm version <update_type>命令自动搞定。

详细用法可通过npm help version查看,这里只介绍最常用的三种。


  1. npm version patch => z+1
  2. npm version minor => y+1 && z=0
  3. npm version major => x+1 && y=0 && z=0

三个选项分别对应三部分的版本号,每次运行命令会导致相应的版本号递增一,同时子版本号清零。

如果npm包同时又是一个git仓库,在运行了npm version <update_type>和npm publish之后,npm会自动给git仓库打上一个跟当前版本号一样的tag,对于挂在github上的npm包很有用。

npm2 & npm3

上面介绍了npm包安装/卸载、更新和发布,几乎能满足日常使用了,另外再搬点干货过来。

npm3虽然慢,但解决了windows上npm包目录太深的问题,相信使用过npm1或者npm2的都知道,node_modules太多太深了,甚至一不小心就超过windows资源管理器能处理的最长路径长度了,听起来有点拗口,说白了这时候复制粘贴删除就会报错了。

已经使用过npm3的肯定会发现,npm3将依赖模块扁平化存放了,node_modules文件夹里面子文件夹增多了,出现了很多没有通过npm install安装过的模块。

npm3在安装包的时候,由于每个包和包的依赖都会去计算是否需要再安装,搜索起来确实变慢了,好在至少现在的npm3速度还是可以接受的。

按照官方文档介绍,npm3处理模块依赖的方式跟npm2很不一样。

以下是从官网搬的砖

npm的依赖

假如我们写了个模块App,需要安装两个包A@1和C@1,其中A@1依赖另一个包B@1,C@1依赖B@2,用npm2和npm3安装之后的依赖图分别是这样的

npm3按照安装顺序存放依赖模块,先安装A@1,发现依赖模块B@1没有安装过也没有其他版本的B模块冲突,所以B@1存放在第一级目录,B@2为了避免和B@1的冲突,还是继续放在C@1之下。

npm2没什么好说的,来什么安装什么,根本不用理会公共依赖关系,依赖模块一层一层往下存放就是了,下面重点讲解npm3在这方面的改进。

现在App又需要安装一个包D@1,D@1依赖B@2,使用npm3安装之后,包结构将变成下面这样

虽然C@1和D@1都依赖B@2,但是由于A@1先安装,A@1依赖的B@1已经安装到第一级目录了,后续需要安装的所有包B,只要版本不是1,都需要避免和B@1的冲突,所以只能像npm2一样,安装在相应包下面。

接着又安装了一个E@1,依赖B@1,因为B@1已经安装过,且不会有版本冲突,这时候就不用重复安装B@1了,包结构会变成这样

随着App升级了,需要把A@1升级到A@2,而A@2依赖B@2,把E@1升级到E@2,E@2也依赖B@2,那么B@1将不会再被谁依赖,npm将卸载B@1,新的包结构将变成这样

可以看到出现了冗余,结果跟预期的不一样,既然所有对B的依赖都是B@2,那么只安装一次就够了。

npm dedupe

npm在安装包的时候没有这么“智能”,不过npm dedupe命令做的事就是重新计算依赖关系,然后将包结构整理得更合理。

执行一遍npm dedupe将得到

这才是最优且符合预期的结构,看来在每次安装/卸载了包之后最好重新执行npm dedupe,以保证包结构是最优的。

npm3通过将依赖模块扁平化安装,避免了冗余又解决了windows上一大头疼问题。

本文来自合作伙伴“Linux中国”

原文发布时间为:2013-04-02.

时间: 2024-09-18 06:05:07

玩转 NPM的相关文章

玩转spring boot——ajax跨域

前言  java语言在多数时,会作为一个后端语言,为前端的php,node.js等提供API接口.前端通过ajax请求去调用java的API服务.今天以node.js为例,介绍两种跨域方式:CrossOrigin和反向代理.    一.准备工作   pom.xml: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.

[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客_node.js

这里选用的操作系统是社区版Debian,Debian和Ubuntu的操作指令是一脉相承的,再加上之前玩过一段时间的Raspberry PI,个人比较熟悉,以下的安装过程其实同样适用于树霉派(安装node.js和NPM那一部分). 1) 注册并选型 在aws上注册并绑定信号卡后即可使用亚马逊的一年免费EC2主机,不过配置通常比较低,通常为0.612Mb(linux)和1G(Win)内存. http://aws.amazon.com/ 这里选用的是社区版Debian的版本是 Debian-squee

推荐一篇译文:《玩转 Dcoker:Hello World, 开发环境和你的应用》

问题描述 译文地址:http://wiki.jikexueyuan.com/project/wiki-journal-201507-1/docker.html玩转Dcoker:HelloWorld,开发环境和你的应用文章翻译:周倍同发表时间:2015年7月13日原文作者:TugberkUgurlu文章分类:云计算与安全关于本文Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上.几乎没有性能开销,可以很容易地在机器和

Node.js 和 npm 卸载安装方法详解

为了学 Vue.js,用 npm 装了 Vue,经过我的折腾,npm 被我玩坏了,干脆连 Node.js 也重新装一个,下面记录一下在本地 Windwos 环境用 vagrant 搭建的虚拟机(Homestaead)和生产环境阿里云 CentOS 系统安装 Node.js 的步骤,以及 npm 安装依赖的不同之处. 使用源码编译的方式安装 node.js.首先将机子上的 Node.js 卸载,我直接贴上 Stack Overflow 上提供的步骤: 1.卸载 npm 和 Node.js 先卸载

解决win7玩游戏无法全屏

相信不少用户的笔记本都在用Windows7操作系统了,虽然界面豪华漂亮,但包括笔者在内的不少用户总埋怨,在玩游戏时,游戏画面只能在屏幕中间显示,两边是黑色的,游戏无法以全屏模式显示,其实只要简单的设置即可解决问题. 方法 01:通用解决方案 登录注册表编辑器,进入HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Control /GraphicsDrivers/Configuration,依次展开下面的所有项目,双击右边窗口的"Scaling"名称,将数值

【玩转数据系列十】利用阿里云机器学习在深度学习框架下实现智能图片分类

伴随着今日阿里云机器学习PAI在云栖大会的重磅发布,快来感受下人工智能的魅力. 一.背景 随着互联网的发展,产生了大量的图片以及语音数据,如何对这部分非结构化数据行之有效的利用起来,一直是困扰数据挖掘工程师的一到难题.首先,解决非结构化数据常常要使用深度学习算法,上手门槛高.其次,对于这部分数据的处理,往往需要依赖GPU计算引擎,计算资源代价大.本文将介绍一种利用深度学习实现的图片识别案例,这种功能可以服用到图片的检黄.人脸识别.物体检测等各个领域. 下面尝试通过阿里云机器学习平台产品,利用深度

现在不知道怎么办-vr怎么用vr如何实现与手机同屏,玩游戏?

问题描述 vr怎么用vr如何实现与手机同屏,玩游戏? vr如何实现与手机同屏,玩游戏??vr如何实现与手机同屏,玩游戏?vr如何实现与手机同屏,玩游戏? 解决方案 VR对我来说

莫源:像搭积木一样玩转Docker的持续交付

云栖TechDay活动第十八期中,阿里云的高级研发工程师莫源带来了题为<像搭积木一样玩转Docker的持续交付>的分享,主要讲解了阿里云容器服务实现基于Docker的持续交付.容器持续交付的设计思路和未来发展反向. 幻灯片下载地址:https://yq.aliyun.com/attachment/download/?filename=dbf464e5883344e9dd010214576889bf.pdf 以下为现场分享观点整理. 最近Docker越来越火,持续交付的概念也随着被大家越炒越火.

三招教你玩转驱动人生

  软件自诞生起,致力于让用户更加简单方便的获取硬件驱动,提供最新最全的驱动库存供用户选择,并提供用户的高级手动安装模式,以及智能化的一键静默安装模式.智能驱动管理,支持驱动备份为 zip 存于文件夹,自解压文件,自安装文件,并完全兼容最新 windows7 操作系统,为用户提供多种解决维护方案.准确的硬件检测,温度监控,让用户更能清晰的了解电脑状况,维护好自己的电脑硬件. 驱动人生2010beta 版 然而,驱动人生对用户的无微不至体现在更多的细节上,怎么让驱动人生更加贴近用户的需求,让用户玩