NodeJs中npm使用
什么是 NPM
npm
之于 Node
,就像 pip
之于 Python
, gem
之于 Ruby
, pear
之于 PHP
。
npm
是 Node
官方提供的包管理工具,他已经成了 Node
包的标准发布平台,用于 Node
包的发布、传播、依赖控制。npm
提供了命令行工具,使你可以方便地下载、安装、升级、删除包,也可以让你作为开发者发布并维护包。
为什么要使用 NPM
npm
是随同 Node
一起安装的包管理工具,能解决 Node
代码部署上的很多问题,常见的场景有以下几种:
- 允许用户从
npm
服务器下载别人编写的第三方包到本地使用。 - 允许用户从
npm
服务器下载并安装别人编写的命令行程序到本地使用。 - 允许用户将自己编写的包或命令行程序上传到
npm
服务器供别人使用。
npm
的背后,是基于 CouchDB
的一个数据库,详细记录了每个包的信息,包括作者、版本、依赖、授权信息等。它的一个很重要的作用就是:将开发者从繁琐的包管理工作(版本、依赖等)中解放出来,更加专注于功能的开发。
如何使用 NPM
# 查看 npm 命令列表
$ npm help
# 查看各个命令的简单用法
$ npm -l
# 查看 npm 的版本
$ npm -v
# 查看 npm 的配置
$ npm config list -l
npm install
安装本地包
npm install <package_name>:这个命令将在当前目录中创建node_modules目录(如果尚不存在),并将该软件包下载到该目录。该命令默认本地安装。
安装了哪个版本的软件包?
如果本地目录中没有package.json文件,则会安装最新版本的软件包。
如果有package.json文件,则安装满足该package(如果有的话)在package.json中声明的semver规则的最新版本。
安装全局包
npm install -g <package>:全局安装包。
npm init
npm init:这个命令用于创建一个package.json。
npm init --yes或npm init -y:从当前目录中提取的信息生成默认的package.json。创建过程中不会提问。
如果您的目录中已经有一个package.json文件,并且运行了npm install,那么npm将查看该文件中的dependencies,并下载满足所有这些的最新版本。
package.json文件中的description帮助人们在npm搜索中找到您的包,所以在package.json中进行自定义描述非常有用。
也可以完全自定义package.json文件的内容和在init期间提出的问题。这通过创建自定义.npm-init.js来完成。默认情况下,npm将查找您的主目录。 〜/ .npm-init.js
dependencies与devDependencies
dependencies和devDependencies指定了项目依赖的包。
dependencies:这些包在生产中需要。
devDependencies:这些包用于开发和测试。
npm install <package_name> --save命令会添加条目到package.json的dependencies中。
npm install <package_name> --save-dev命令会添加条目到package.json的devDependencies中。
npm update
更新本地软件包npm update:用于更新依赖的软件包。需要在package.json文件所在的目录中运行该命令。
更新全局软件包
npm update -g <package>:更新全局软件包。
npm update -g:更新所有的全局软件包。
npm outdated -g --depth=0:找出需要更新的包。
npm uninstall
卸载本地软件包
npm uninstall <package>:从node_modules目录中移除一个包。
npm uninstall --save <package>:从package.json的dependencies中移除一个包。
npm uninstall --save-dev <package>:从package.json的devDependencies中移除一个包。
实际操作时,发现使用npm uninstall <package>不仅会在node_modules目录下删除该包,还会将该包在package.json中dependencies或devDependencies里面的信息删除。
卸载全局软件包
npm uninstall -g <package>:卸载全局软件包。
npm run
npm
不仅可以用于模块管理,还可以用于执行脚本。package.json
文件有一个 scripts
字段,可以用于指定脚本命令,供 npm
直接调用。package.json
文件内容:
{
"name": "myproject",
"devDependencies": {
"jshint": "latest",
"browserify": "latest",
"mocha": "latest"
},
"scripts": {
"lint": "jshint **.js",
"test": "mocha test/"
}
}
scripts:
顾名思义,就是一些脚本代码,可以通过 npm run script-key
来调用,例如在这个 package.json
的文件夹下使用 npm run dev
就相当于运行了 node build/dev-server.js
这一段代码。
使用 scripts
的目的就是为了把一些要执行的代码合并到一起,使用 npm run 来快速的运行,方便省事。
npm run
是 npm run-script
的缩写,一般都使用前者,但是后者可以更好的反应这个命令的本质。
// 脚本 "scripts": {
"dev": "node build/dev-server.js",
"build": "node build/build.js",
"docs": "node build/docs.js",
"build-docs": "npm run docs & git checkout gh-pages & xcopy /sy dist\\* . & git add . & git commit -m 'auto-pages' & git push & git checkout master",
"build-publish": "rmdir /S /Q lib & npm run build &git add . & git commit -m auto-build & npm version patch & npm publish & git push",
"lint": "eslint --ext .js,.vue src"
}
npm run
如果不加任何参数,直接运行,会列出 package.json
里面所有可以执行的脚本命令。npm
内置了两个命令简写, npm test
等同于执行 npm run test
,npm start
等同于执行 npm run start
。
"build": "npm run build-js && npm run build-css"
上面的写法是先运行 npm run build-js
,然后再运行 npm run build-css
,两个命令中间用 &&
连接。如果希望两个命令同时平行执行,它们中间可以用 &
连接。
写在 scripts
属性中的命令,也可以在 node_modules/.bin
目录中直接写成 bash
脚本。下面是一个 bash
脚本。
#!/bin/bash cd site/main
browserify browser/main.js | uglifyjs -mc > static/bundle.js
假定上面的脚本文件名为 build.sh
,并且权限为可执行,就可以在 scripts
属性中引用该文件。
"build-js": "bin/build.sh"
pre- 和 post- 脚本
npm run 为每条命令提供了 pre- 和 post- 两个钩子( hook )。
以 npm run lint 为例,执行这条命令之前, npm 会先查看有没有定义 prelint 和 postlint 两个钩子,
如果有的话,就会先执行 npm run prelint ,然后执行 npm run lint ,最后执行 npm run postlint 。
{
"name": "myproject",
"devDependencies": {
"eslint": "latest"
"karma": "latest"
},
"scripts": {
"lint": "eslint --cache --ext .js --ext .jsx src",
"test": "karma start --log-leve=error karma.config.js --single-run=true",
"pretest": "npm run lint",
"posttest": "echo 'Finished running tests'"
}
}
上面代码是一个 package.json 文件的例子。如果执行 npm test,会按下面的顺序执行相应的命令。
pretest
test
posttest
如果执行过程出错,就不会执行排在后面的脚本,即如果 prelint 脚本执行出错,就不会接着执行 lint 和 postlint 脚本。
总结:本地命令加上-g就是全局命令。
创建全局链接
npm 提供了一个有趣的命令 npm link,它的功能是在本地包和全局包之间创建符号链接。我们说过使用全局模式安装的包不能直接通过 require 使用。但通过 npm link 命令可以打破这一限制。
举个例子,我们已经通过 npm install -g express 安装了 express ,这时在工程的目录下运行命令:npm link express ./node_modules/express -> /user/local/lib/node_modules/express
我们可以在 node_modules 子目录中发现一个指向安装到全局的包的符号链接。通过这种方法,我们就可以把全局包当做本地包来使用了。
除了将全局的包链接到本地以外,使用 npm link 命令还可以将本地的包链接到全局。
使用方法是在包目录(package.json 所在目录)中运行 npm link 命令。 如果我们要开发一个包,利用这种方法可以非常方便地在不同的工程间进行测试。
创建包
包是在模块基础上更深一步的抽象,Node 的包类似于 C/C++ 的函数库或者 Java 、.Net 的类库。它将某个独立的功能封装起来,用于发布、更新、依赖管理和版本控制。Node 根据 CommonJS 规范实现了包机制,开发了 npm 来解决包的发布和获取需求。
Node 的包是一个目录,其中包含了一个 JSON 格式的包说明文件 package.json。严格符合 CommonJS 规范的包应该具备以下特征:
package.json 必须在包的顶层目录下;
二进制文件应该在 bin 目录下;
JavaScript 代码应该在 lib 目录下;
文档应该在 doc 目录下;
单元测试应该在 test 目录下。
Node 对包的要求并没有这么严格,只要顶层目录下有 package.json,并符合一些规范即可。当然为了提高兼容性,我们还是建议你在制作包的时候,严格遵守 CommonJS 规范。
我们也可以把文件夹封装为一个模块,即所谓的包。包通常是一些模块的集合,在模块的基础上提供了更高层的抽象,相当于提供了一些固定接口的函数库。通过定制 package.json,我们可以创建更复杂,更完善,更符合规范的包用于发布。
Node 在调用某个包时,会首先检查包中 packgage.json 文件的 main 字段,将其作为包的接口模块,如果 package.json 或 main 字段不存在,会尝试寻找 index.js 或 index.node 作为包的接口。
package.json 是 CommonJS 规定的用来描述包的文件,完全符合规范的 package.json 文件应该含有以下字段:
name: 包的名字,必须是唯一的,由小写英文字母、数字和下划线组成,不能包含空格。
description: 包的简要说明。
version: 符合语义化版本识别规范的版本字符串。
keywords: 关键字数组,通常用于搜索。
maintainers: 维护者数组,每个元素要包含 name 、 email(可选)、 web(可选)字段。
contributors: 贡献者数组,格式与 maintainers 相同。包的作者应该是贡献者数组的第一个元素。
bugs: 提交 bug 的地址,可以是网址或者电子邮件地址。
licenses: 许可证数组,每个元素要包含 type (许可证的名称)和 url(链接到许可证文本的地址)字段。
repositories: 仓库托管地址数组,每个元素要包含 type (仓库的类型,如 git)、URL(仓库的地址)和 path(相对于仓库的路径,可选)字段。
dependencies: 包的依赖,一个关联数组,由包名称和版本号组成。
https://segmentfault.com/p/1210000009653830/read
https://segmentfault.com/a/1190000010001155
http://www.ruanyifeng.com/blog/2016/10/npm_scripts.html
NodeJs中npm使用的更多相关文章
- nodeJS中npm常见的命令
常用的nodeJS中npm的命令:npm主要是node包管理和发布的工具.npm常用的命令:1:npm install <name> //(下载包) 下载后的包放在当前路径下面 npm i ...
- Nodejs中npm install 命令的问题
在使用nodejs的npm包管理工具中碰到过许多个坑,在网上查了很久才解决,现在加以总结. 两种安装方式(本地安装,全局安装) 1.全局安装(npm install -g moduleName/npm ...
- nodejs中npm常用命令
npm install <name>安装nodejs的依赖包 例如npm install express 就会默认安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本, ...
- (转)nodejs中npm常用命令
npm install <name>安装nodejs的依赖包 例如npm install express 就会默认安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本, ...
- nodeJs中npm详解
npm 是 Node.js 的模块依赖管理工具.作为开发者使用的工具,主要解决开发 node.js 时会遇到的问题.如同 RubyGems 对于 Ruby 开发者和 Maven 对于 Java 开发者 ...
- NodeJS 中npm包管理工具
NPM 使用介绍 NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从 ...
- nodejs中npm以及yarn常用指令
1.npm下载相关 1.npm install/i vue //下载vue的包 2.npm i vue --save-dev / -D //下载vue的包,并添加到开发依赖中 3.npm i //下载 ...
- 关于nodejs中npm命令没有反应的解决方法
最近在学习angularJS,正在做一个单页面应用,在安装nodejs之后,发现命令行传了输入npm -v能输出结果外,其余npm的任何操作都没有反应,一开始我以为是下载的比较慢,等了半小时还是没动静 ...
- vue 之 nodejs中npm的使用
npm是什么? 简单的说,npm就是JavaScript的包管理工具.类似Java语法中的maven,gradle,python中的pip. 安装包 我们在桌面上创建一个文件夹/01-studyNpm ...
随机推荐
- Java包装
public class Test2 { public static void main(String[] args) { /*String str = "..............&qu ...
- 《Semantic Sentence Matching with Densely-connected Recurrent and Co-attentive Information》DRCN 句子匹配
模型结构 首先是模型图: 传统的注意力机制无法保存多层原始的特征,根据DenseNet的启发,作者将循环网络的隐层的输出与最后一层连接. 另外加入注意力机制,代替原来的卷积.由于最后的特征维度过大,加 ...
- Python 6 -- 构建一个Web应用
用Flask Web框架,实现浏览器页面交互.在此之前需要了解web的基本工作流程,可参照https://blog.csdn.net/m0_37466453/article/details/72752 ...
- Python并发编程之线程池/进程池--concurrent.futures模块
一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/ ...
- 【CDH学习之一】CDH简介
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 zookeeper-3.4.11 一.CDH在商业应用中,对 ...
- android手机平板如何使用usb有线网卡
最近有个项目需要在android平板上使用usb有线网卡,所以做了一部分工作,在这里简单总结一下. 我在TB上购买了一个micro-usb接口的android免驱有线网卡,这个网上很多,随便买一个符合 ...
- python小练习:读入一个考试得分,判断这个分数是哪个等级,并输出,考虑异常场景
读入一个考试得分,判断这个分数是哪个等级,并输出. 等级:>=90 优 ,>=80且小于90 良,>=70 且小于80,中,>=60且<70及格 <60 不及格 ...
- C# 数值类型和无穷大
在c#语言中的数字有两个特性要了解.例如:任何数除以0所得的结果是无穷大,不在int long 和decimal类型的范围内.所以计算(一个数除以0会出错),但是在double和float类型中有一个 ...
- c# 定义委托和使用委托(事件的使用)
使用委托时要先实例化,和类一样,使用new关键字产生委托的新实例,然后将一个或者多个与委托签名匹配的方法与委托实例关联.随后调用委托时,就会调用所有与委托实例关联的方法. 与委托关联可以是任何类或者结 ...
- JustOj 1386: 众数的数量
题目链接:http://oj.jxust.edu.cn/problem.php?id=1386 题目描述 qwn和Q伟N最近沉迷于Battle of Balls,天天翘课玩游戏.因为Q伟N太坑了,所以 ...