关于npm
转载自AlloyTeam:http://www.alloyteam.com/2016/03/master-npm/
这是我学npm觉得最好的一篇文章啦~大家一起学起来吧
npm本来是Node.js的包管理工具,但随着JS这几年的蓬勃发展,现在的npm已经成了几乎所有跟JS相关的工具和软件包的管理工具了,并且还在不断发展完善中。
本文从笔者的经验,总结了npm安装/卸载、更新、发布这几个最主要功能的正确使用姿势和一些小技巧,顺便从官网搬来了npm3处理依赖的重大变化。
npm3
npm团队已经发布了npm3,近期有小伙伴吐槽npm3安装软件包的时候很慢,一开始笔者也感觉相比npm2慢了不少,但经过了几个版本的迭代,速度似乎又快起来了。
慢的同学是时候更新你的npm啦,而且之前安装进度条模糊成一坨的问题也已经修复了。
npm v3.0安装react的截图
npm v3.8安装react的截图
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
2
3
|
"dependencies": {
"react": "^0.14.7"
}
|
npm i react -D将增加
1
2
3
|
"devDependencies": {
"react": "^0.14.7"
}
|
npm update
假如react@15(版本号,下同)发布了,想尝鲜的小伙伴该怎么更新呢?
首先得知道npm上是否已经更新,npm info react可以查看到react在npm上发布过哪些版本以及最新的版本,但是内容太多,让人眼花缭乱,配合grep会好一些。
其实我们只想知道react最新的版本,使用npm dist-tags ls react直接列出react发布过哪些tag,
1
2
3
4
5
|
> npm dist-tags ls react
0.10.0-rc1: 0.10.0-rc1
0.11.0-rc1: 0.11.0-rc1
latest: 0.14.7
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
2
3
|
Package Current Wanted Latest Location
react 0.14.3 0.14.7 0.14.7 example
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
2
3
|
npm version patch => z+1
npm version minor => y+1 && z=0
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上一大头疼问题。
关于npm的更多相关文章
- 网络原因导致 npm 软件包 node-sass / gulp-sass 安装失败的处理办法
如果你正在构建一个基于 gulp 的前端自动化开发环境,那么极有可能会用到 gulp-sass ,由于网络原因你可能会安装失败,因为安装过程中部分细节会到亚马逊云服务器上获取文件.本文主要讨论在不变更 ...
- npm 私有模块的管理使用
你可以使用 NPM 命令行工具来管理你在 NPM 仓库的私有模块代码,这使得在项目中使用公共模块变的更加方便. 开始前的工作 你需要一个 2.7.0 以上版本的 npm ,并且需要有一个可以登陆 np ...
- NPM (node package manager) 入门 - 基础使用
什么是npm ? npm 是 nodejs 的包管理和分发工具.它可以让 javascript 开发者能够更加轻松的共享代码和共用代码片段,并且通过 npm 管理你分享的代码也很方便快捷和简单. 截至 ...
- Npm包的开发
个人开发包的目录结构 ├── coverage //istanbul测试覆盖率生成的文件 ├── index.js //入口文件 ├── introduce.md //说明文件 ├── lib │ ...
- npm package.json属性详解
概述 本文档是自己看官方文档的理解+翻译,内容是package.json配置里边的属性含义.package.json必须是一个严格的json文件,而不仅仅是js里边的一个对象.其中很多属性可以通过np ...
- npm 使用小结
本文内容基于 npm 4.0.5 概述 npm (node package manager),即 node 包管理器.这里的 node 包就是指各种 javascript 库. npm 是随同 Nod ...
- Node.js npm 详解
一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...
- 升级npm
查看npm的所有版本 运行命令: npm view npm versions 命令运行后,会输出到目前为止npm的所有版本. [ '1.1.25', '1.1.70', '1.1.71', '1.2. ...
- NPM如何更新到最新版
参考文章--npm更新到最新版本的方法 其实我们可以这样,随便新建一个文件夹例如:F:\test.按着"shift"键,右键该文件夹,选择"在此处打开命令窗口(W)&qu ...
- npm源切换
版权声明:欢迎转载,请附加转载来源:一路博客(http://www.16boke.com) 目录(?)[+] 安装 使用 列出可选的源 切换 增加源 删除源 测试速度 许可 项目主页 我们介绍 ...
随机推荐
- HEAD FIRST HTML & CSS学习笔记1
一.指定媒体类型=指定显示设备的类型 P400 有两种方式指定媒体类型: a. 直接在<link>标签中加属性media,例: <link href="print.css ...
- HEAD FIRST HTML & CSS学习笔记
CSS部分 1. border-bottom属性控制元素下边框的外观. eg: border-bottom:1px solid maroon; P265 下划线 text-decoration: ...
- Java—图形处理
抽象窗口化工具(AWT)为图形用户界面编程提供API编程接口,使得Java可以提供较好的图形用户界面. AWT把图形处理分为两个层次:一是处理原始图形,这一层较原始,图形直接以点.线和面的形式画到界面 ...
- 开博客这么久以来,第一篇技术文章,python与c的接口对接
在博客园开博客已经有了蛮长时间了,但是从来只是看别人的文章,自己却从未写过一篇技术文章,深表惭愧.内心还是希望能够给大家提供一些帮助的,希望这第一篇技术博客,能够给大家一些帮助.闲话少叙,开始正文. ...
- uva 10817(状压dp)
题意:就是有个学校要招老师.要让没门课至少有两个老师可以上.每个样样例先输入三个数字课程数量s,已经在任的老师数量,和应聘的老师数量.已经在任的一定要聘请. 思路是参考了刘汝佳书上的,关键如何状压. ...
- Xcode真机调试出现The account '***' has no team with ID '***'的解决方案
前段时间,想用真机调试的时候出现 The account '***' has no team with ID '***'的问题, 以前页真机调试过,没有这种情况,于是我登陆开发者中心,进去发现说我的账 ...
- Joomla软件功能介绍与开源程序大比拼Joomla,wordpress,Drupal哪个好?
Joomla 软件功能介绍: Joomla!是一套在国外相当知名的内容管理系统 (Content Management System, CMS),它属于Portal(企业入口网站)类型,顾名思义 ...
- 最近在做外贸网站的时候,需要大量的字体来充实页面,就学习了怎么引用Google Fonts
第一步,FQ进入谷歌官方字体网站:https://fonts.google.com 妥妥的. 第二步,点击你所选择字体演示块的右上角的加号,然后你所选择的字体会形成引用链接以及你所要写的css样式. ...
- ASP.NETMVC自定义错误页面真的简单吗?
Note:文章前半部分翻译自 http://benfoster.io/blog/aspnet-mvc-custom-error-pages ,着急的可直接看总结~ 如果你在设置asp.net mvc自 ...
- Beginning.......
第一次写博客,希望能坚持下去.................