NPM实用指北
npm
作为下载node
附送的大礼包,大家一定不会陌生。
然而关于npm
,估计大量的只是用到npm install XXX
以及npm run XXX
。
其实这里边还有很多有意思的命令&参数。
关于npm
,大概有两个作用:
- 能让我们很方便的从网上下载第三方包进行实现功能
- 能够让我们自己编写包,并上传到网上供其他人下载
下载相关的操作
下载主要就是围绕着install
这一个命令来的。
install 可以简写为 i
安装原有的依赖包
当我们处于一个项目下时,执行npm i
即可安装当前项目所有的依赖包。
包含dependencies
、devDependencies
、optionalDependencies
和bundleDependencies
中的所有。
如果我们在执行npm i
时添加--production
的参数,则表示是线上环境,将会忽略devDependencies
下的所有依赖。
现在我们有如下的package.json
文件:
{
"dependencies": {
"koa": "^2.5.0"
},
"devDependencies": {
"eslint": "^4.19.1"
}
}
如果执行npm i
,则会安装所有的依赖。
> npm ls --depth=
├── eslint@4.19.
└── koa@2.5.
然后我们再尝试添加--production
参数,使用--only=prod[uction]
同样可以实现效果。
> npm ls --depth=
└── koa@2.5.
使用--only=dev[elopment]
则用来仅安装devDependencies
的依赖。
–depth=XXX 用来设置显示路径的深度,默认会递归将所有的依赖都打印出来。
新增依赖的安装
上边是直接安装项目原有依赖的操作,如果我们要新增一些依赖,这里有一些选项可以了解一下。
如果我们在执行install
添加--no-save
、--save-dev
之类的flag
时,不会直接写入到dependencies
中,而是有一些其他的处理。
各种选项:
flag | description |
---|---|
--save-prod |
默认选项 对应dependencies |
--no-save |
不将依赖写进package.json |
--save-dev 、-D |
对应devDependencies |
--save-optional 、-O |
对应optionalDependencies ,在安装时可以通过指定--no-optional 来忽略该模块下的依赖 |
--save-bundle 、-B |
对应bundleDependencies ,貌似已经被废弃了-.- |
--save-exact 、-E |
安装精准的某个版本,在版本号处不会添加^ 之类的标识 |
--global 、-g |
全局安装包,一般来说需要管理员权限 |
更多的参数请查阅:https://docs.npmjs.com/cli/install
在
package.json
中经常能看到依赖的版本号前边有一个^
或~
。^
和~
会导致重新安装依赖的时候,按照规则安装最新版。
比如版本号为^2.1.0
,则会匹配>=2.1.0 <3.0.0
的所有包
如果版本号为~2.1.0
,则会匹配>=2.1.0 <2.2.0
的所有包
这两个标识的好处是:一个包进行修复bug
,只更新了最后一位版本号,所有依赖它的包不需要重新上传自己的package.json
所以说,涉及到可能产生不兼容后果的更新,请一定要修改前两位版本号。。否则就是坑人了-.-
以及我们可以指定安装包时候的tag
或者version
npm i koa@next
npm i koa@2.0.
npm i koa@">=2.0.0 <2.5.0"
这里的next
就是一个tag
如果不指定的话,有一个默认的latest
。
以及第二条指定安装2.0.0
版本的koa
。
最后一条则会在范围规则内选择最新的版本进行安装。
上传相关的操作
要上传,肯定就要先进行开发。
所以我们上传的整个流程大概是这样的:
npm init
创建package.json
- 进行开发
npm show <你的包名>
,如果404,那么恭喜你,这个名字还没有被占用。npm publish
,上传包。
npm init
其实有很多情况下,我们创建package.json
只是为了安装依赖,但是执行了npm init
以后却要确认好多次选填内容。
其实如果你添加了一个参数以后,npm
就不会让你确认这些选填内容了。npm init -f
,--force
、-y
和--yes
都可以实现这个效果。
当然,如果你是要将这个文件夹作为一个pacakge
发出去,则这些选填内容都是需要的。
开发包的过程
如何进行本地debug
在开发过程中,为了本地快速进行调试,可以执行这样的命令:npm link <你的包名>
如果在当前包的文件夹中,可以直接执行npm link
可以简写为
npm ln
然后在要调试的项目中执行npm link <你的包名>
即可创建一个引用本地的链接。
在调试完毕后,执行npm unlink
来删除链接。
如何创建命令行可执行模块
我们可以在package.json
中添加bin
字段,用来指定一个文件。
{
"bin": {
"sayhi": "bin/hi"
}
}
文件./bin/hi
:
#!/usr/bin/env node console.log('hi there')
如果用过-g
进行全局安装,就会注册对应的命令,我们在terminal
中就可以直接执行了。#!/usr/bin/env node
为必须的,路径可能会变
npm show
这个方法貌似没有被写在文档里。。但它确实是存在的。
执行npm show XXX
会返回这个包对应的信息,也可以直接在后边按照JSON
的格式来进行取值:
npm show koa version
npm show koa dist-tags.latest
npm publish
当我们的包开发完毕后,就可以执行publish
来进行上传了。
npm publish
你同样可以在后边指定一个文件夹路径或者压缩包,但都需要这两者包含package.json
文件(npm包的信息都在这里)
以及,我们可以在后边拼接--tag=XXX
来上传一个对应的tag
,如果不写的话,默认会上传到latest
下。
写tag
的好处是,我们可以同时维护多份代码,两者互不影响(但是要小心publish
的时候一定不要忘记tag
)
就比如去年的node.js
稳定版还是6,但是koa
已经开始使用7.6+
的async
/await
特性,所以他们就发布了koa@next
,也就是现在的2.x
,用来支持新的语法。
之后的版本更新
如果我们的包放到线上以后,发现了bug
,我们需要修复它,因为npm
的限制,所以每次publish
必须保证version
的一致性。npm
给我们提供了这样三个命令:
npm version patch
npm version minor
npm version major
三个命令依次会修改version
的第3.2.1
位。major.minor.patch
patch
patch
为改动最小的,也就是我们上边提到过的bug
修复,^
和~
都会兼容的版本号。
minor
如果是minor
,则会修改中间的版本号,一般来讲,新功能的增加需要修改这个版本号,因为可能会造成之前的使用方式改变。
major
最后一个则是很大的更新才会去修改的版本号,例如我们亲爱的koa
,在抛弃Generator
拥抱async
/await
就是直接发布了koa2.x
。
执行这三个命令的先提条件是,你当前仓库是不存在未提交的修改的。
因为npm
会直接帮你修改version
并增加一条commit
记录,如果有未提交的修改,可能会导致版本冲突。
在执行完这些命令(或者手动修改版本号也是没问题的),再执行npm publish
即可上传更新包了。
如果想要自定义这次提交的信息的话,可以这样:
npm version patch -m "Upgrade version to %s"
%s
会自动被npm
替换为更新后的版本号提交上去。
更新时一定记得加对应的--tag
,否则默认会推到@latest
上
npm scripts
关于package.json
中的scripts
,不知道大家了解多少。
如果你的包是上传到npm
上的,那么其实有很多scripts
是类似钩子的存在。
publish
当你的包执行了publish
上传到服务器后,这个脚本会执行。
其实我们可以在这个地方执行git push
操作来将本次的修改直接推到GitHub
仓库上,节省了一次不必要的命令键入。
或者如果你这个包同时还上传到apm
或者之类的同类型仓库,也可以直接在这里进行处理(省去多次繁琐的操作)
install
这个脚本会在包被安装后执行。
比如说我们使用Flowtype
开发了一个包,我们可以直接将源码传到npm
上,然后在install
命令中执行编译,去除flow comments
。
一些依赖于
node-gyp
的包都会有install: node-gyp rebuild
的操作。
uninstall
如果你的包会对一些全局的数据造成影响(比如某些包可能会去改写.bashrc
之类的文件)。
这时你可以在uninstall
脚本中将那些修改项进行还原(良心操作)。
更多的
scripts
钩子:https://docs.npmjs.com/misc/scripts
小记
最近翻看了一下npm
的文档,发现了很多之前很少用的命令&参数。
觉得npm
做的真心很不错,原来的一些重复性的工作,其实可以很轻松的使用npm
相关的命令来解决。
希望大家不要只拿来进行npm install
。
最后:NPM Loves You
。
参考资料
https://docs.npmjs.com/cli/init
https://docs.npmjs.com/misc/developers
https://docs.npmjs.com/cli/version
NPM实用指北的更多相关文章
- 可能比文档还详细--VueRouter完全指北
可能比文档还详细--VueRouter完全指北 前言 关于标题,应该算不上是标题党,因为内容真的很多很长很全面.主要是在官网的基础上又详细总结,举例了很多东西.确保所有新人都能理解!所以实际上很多东西 ...
- 后端API入门到放弃指北
后端API入门学习指北 了解一下一下概念. RESTful API标准] 所有的API都遵循[RESTful API标准]. 建议大家都简单了解一下HTTP协议和RESTful API相关资料. 阮一 ...
- [转] iOS开发者的Weex伪最佳实践指北
[From] http://www.cocoachina.com/ios/20170601/19404.html 引子 这篇文章是笔者近期关于Weex在iOS端的一些研究和实践心得,和大家一起分享分享 ...
- git宝典—应付日常工作使用足够的指北手册
最近公司gitlab又迁移,一堆git的命令骚操作,然鹅git命令,感觉还是得复习下——其实,git现在界面操作工具蛮多,比如intellij 自带的git操作插件就不错,gitlab github ...
- Python 简单入门指北(二)
Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...
- Python 简单入门指北(一)
Python 简单入门指北(一) Python 是一门非常容易上手的语言,通过查阅资料和教程,也许一晚上就能写出一个简单的爬虫.但 Python 也是一门很难精通的语言,因为简洁的语法背后隐藏了许多黑 ...
- 关于supervisor的入门指北
关于supervisor的入门指北 在目前这个时间点(2017/07/25),supervisor还是仅支持python2,所以我们要用版本管理pyenv来隔离环境. pyenv 根据官方文档的讲解, ...
- 关于Gevent的使用指北
关于Gevent的使用指北 只是看了入门指南,和一个翻译文档.写一下个人读书心得. 其实看完之后,第一个反映就是asyncio这个系统库,感觉gevent现在所做的一些事情是与asyncio很像的,但 ...
- Celery入门指北
Celery入门指北 其实本文就是我看完Celery的官方文档指南的读书笔记.然后由于我的懒,只看完了那些入门指南,原文地址:First Steps with Celery,Next Steps,Us ...
随机推荐
- 打印十字图 JAVA 递归实现
这个是我自己想的,头疼了一个下午,不过还好.做出来了.在网上找这道题但没有找到用递归的做法. /*递归思想实现 * 标题:打印十字图 小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可 ...
- spring学习笔记二 注解及AOP
本节需要导入spring-aop包 注解 使用注解的目的是为了代替配置,在使用注解时,省略键时,则是为value赋值. 扫描某个包下的所有类中的注解 <?xml version="1. ...
- Beta冲刺 第四天
Beta冲刺 第四天 1. 昨天的困难 1.网页使用了一些网上现成的模板,其主要是使用像素做处理的,所以检查起来比较费事费力. 2.使用github代码merge时出现了问题.所以花费了不少的时间在人 ...
- 201621123062《java程序设计》第六周作业总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰 ...
- python的PEP8 代码风格指南
PEP8 代码风格指南 这篇文章原文实际上来自于这里:https://www.python.org/dev/peps/pep-0008/ 知识点 代码排版 字符串引号 表达式和语句中的空格 注释 版本 ...
- 【iOS】swift-获取webView的高度
func webViewDidFinishLoad(webView: UIWebView) { let webHeightStr = webView.stringByEvalu ...
- nyoj Color the fence
Color the fence 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 Tom has fallen in love with Mary. Now Tom w ...
- signalR 消息推送
业务情景一:上传报表,上传excel.如果excel的数据量很大,上万条,上十万条数据,那么这个上传请求必然是个耗时请求.用户上传之后,很关心上传的进度和结果. 业务情景二:站内消息提醒,实时有效地接 ...
- python使用tesseract-ocr完成验证码识别(模型训练和使用部分)
一.Tesseract训练 大体流程为:安装jTessBoxEditor -> 获取样本文件 -> Merge样本文件 –> 生成BOX文件 -> 定义字符配置文件 -> ...
- JAVA_SE基础——14.循环结构语句
建议有些基础的同学阅读,0基础可能会有些困难(最好看正文配合基础课本的例子) 所谓循环语句主要就是在满足条件的情况下反复执行某一个操作.Java提供了3种常用的循环语句,分别为for循环语句.whil ...