在介绍npm的前面,我们先介绍一下commonJS规范。commonJS规范的提出,主要是为了弥补js没有标准的缺陷,已达到Ruby和Java具备开发大型应用的基础能力,如今,commonJS中的大部分规范虽然依旧是草案,但是已经为javascript开发大型应用指明了一条非常棒方向,目前,它依然在成长,目前commonJS规范涵盖了模块、二进制、Buffer、字符集编码、I/O流、进程环境、文件系统、套接字、单元测试、web服务器网关接口、包管理等。而其中的npm则就是commonJS中关于包管理的具体实现。
-摘抄于《深入浅出Nodejs》
package.json
: 包描述文件bin
:用于存放可执行二进制文件的目录lib
:用于存放JavaScript代码的目录doc
: 用于存放文档的目录test
: 用于存放单元测试用例的代码CommonJS为package.json文件定义了如下一些必要字段
name
:包的名称,必须是唯一的,由小写英文字母、数字和下划线组成,不能包含空格。description
:包的简要说明。version
: 符合语义化版本识别规范的版本字符串。 keywords
:关键字数组,通常用于搜索。maintainers
:维护者数组,每个元素要包含name、email(可选)、web(可选)字段。contributors
:贡献者数组,格式与maintainers相同。包的作者应该是贡献者数组的第一个元素。bugs
:提交bug的地址,可以是网址或者电子邮件地址。licenses
:许可证数组,每个元素要包含type(许可证的名称)和url(链接到许可证文本的地址)字段。repositories
:仓库托管地址数组。每个元素要包含type(许可证的名称)和url(链接到许可证文本的地址)字段。dependencies
:包的依赖,一个关联数组,由包名称和版本组成。除此之外,还有一些可选字段:
homepage
: 当前包网站地址os
: 操作系统支持列表cpu
: cpu架构的支持列表engine
: 支持的JavaScript引擎类表,有效的引擎取值为ejs、flusspferd、node、v8等等builtin
: 标志当前包是否是内建在底层系统的标准组件directories
: 包目录说明implements
: 实现规范列表,标志当前包实现了commonJS的那些规范script
: 脚本说明对象。npm script 是记录在 package.json 中的 scripts 字段中的一些自定义脚本,使用自定义脚本,用户可以将一些项目中常用的命令行记录在 package.json 不需要每次都要敲一遍。主要多了author、bin、main、devDependencies
author
: 包作者bin
: 一些包作者希望包可以作为命令行工具使用,配置好bin字段后,通过npm install package_name -g命令可以将脚本添加到执行路径中,之后可以在命令行中直接执行。这种称之为全局模式main
: 模块引入方法require()在引入包时,会优先检查这个字段,并将其作为包中其余模块入口。如果不存在这个字段,require()方法会查找宝目录下的index.js、index.node、index.json文件作为默认入口devDependencies
: 一些模块只有在开发的时候需要依赖,配置这个属性,可以提示包的后续开发者安装依赖包。npm ls
以树状图的方式列下一个项目下面的所有依赖的 逻辑结构在node中引入一个模块需要经过三个步骤
模块的分类:
通常使用npm i安装的npm包都是自定义模块,在运行时动态加载,需要完整的路径分析、文件定位、编译执行过程、速度相对来说比较慢,所以我们这里就什么理解自定义模块的查找方式中的路径生成规则,为什么你的require(包名)就能够将这个包require进来使用。
模块路径生成规则:
node_modules
node_modules
node_modules
node_modules
可见当前文件目录越深,模块查找会耗时更多,这就是模块自定义加载速度是最慢的原因
这个版本下安装依赖使用嵌套安装依赖
优点和弊端
优点:解决了版本单一时存在的不兼容问题,实现多版本兼容 缺点:可能造成相同模块大量冗余
哪么如何做到多版本兼容额前提下减少这种模块冗余问题,于是npm3做了一个改进
npm v3会尽量把逻辑上某个层级的模块在物理结构上全部放在项目的第一层级,具体摘抄为以下:
但是npm v3仍然没有把npm v2模块冗余的缺陷优化到极致,可能出现这种情况
实际是使用 npm dedupe去除冗余模块原理就是当A模块下的C V1.0模块被更新到 C V2.0情况下,我们可以使用这条命令把所有C v2.0的二级依赖模块“重定向”到一级目录下的那个C v1.0
按照位置来区分:
按照使用方式:
如何选择安装方式
npm config get cache
:查找缓存包存放地址--prefer-offline
--prefer-online
--offline
当升级npm@5.2.0,会安装一个新的包npx
npx 的使用很简单,就是执行 npx command 即可,这里的 command 默认就是 ./node_modules 目录中安装的可执行脚本名。
了解很少,这篇博文讲的比较好npx介绍
npm help <????>
: 查看某一命令的帮助npm install <package>
:默认使用–save,如果不想保存到package.json中,可以添加--no-save参数;还可以指定–save-dev 或 -g参数npm install --production
: npm将不会安装在中列出的模块 devDependenciesnpm install npm -g
: npm更新命令npm init
:在此目录生成package.json文件,可以添加-y | --yes 参数则默认所有配置为默认yesnpm root -g
:查看全局安装地址npm run
:列出项目所有脚本命令参数,npm uninstall <package>
:卸载依赖包, 默认使用–save参数,即从package.json中移除npm ls [-g] [--depth=0]
:查看当前目录或全局的依赖包,可指定层级为0npm outdated
:查看当前过期依赖,其中current显示当前安装版本,latest显示依赖包的最新版本,wanted显示我们可以升级到可以不破坏当前代码的版本npm search <string>
:查找包含该字符串的依赖包,根据keywords进行查找npm prune
:移除当前不在package.json中但是存在node_modules中的依赖npm repo <package>
:浏览器端打开项目地址(GitHub)npm home <package>
:在浏览器端查看项目(项目主页)npm info <package>
: 查看package的package.jsonnpm view <package>
: 等同于npm info npm dedupe
: 去除冗余模块