1. npm 是什么?

npm 为你和你的团队打开了连接整个 JavaScript 天才世界的一扇大门。它是世界上最大的软件注册表,每星期大约有 30 亿次的下载量,包含超过 600000 个 包(package) (即,代码模块)。来自各大洲的开源软件开发者使用 npm 互相分享和借鉴。包的结构使您能够轻松跟踪依赖项和版本。

下面是关于 npm 的快速介绍:

npm 由三个独立的部分组成:

  • 网站
  • 注册表(registry)
  • 命令行工具 (CLI)

网站 是开发者查找包(package)、设置参数以及管理 npm 使用体验的主要途径。

注册表 是一个巨大的数据库,保存了每个包(package)的信息。

CLI 通过命令行或终端运行。开发者通过 CLI 与 npm 打交道。

如何查找包(package)

To find packages, start with the npm search bar.

While browsing, you’ll find:

  • node modules, which can be used on the server side.
  • packages that add commands for you to use in the command line.
  • packages that can be used on the front end of websites.

(To understand the difference between node modules and packages, click here).+

实例:查找一个包(package)

2. 如何安装 npm 并管理 npm 版本

npm 是用 Node.js 编写的,因此您需要安装 Node.js 才能使用 npm。您可以通过 Node.js 网站安装 npm,或者通过安装 Node Version Manager 或 NVM。本章解释了这两个选项。 如果你只是想开始探索 npm,使用 Node.js 安装方法是最快的。如果您是高级开发人员,准备好加入并使用版本,请使用节点版本管理器。如果您不确定,请在决定之前阅读本章。您可以随时更改将来运行 npm 的方式。

从 Node.js 网站安装 npm

1. 安装 Node.js 和 npm

如果您使用的是 OS X 或 Windows,请使用 Node.js 下载页面中的安装程序之一。请务必安装标有 LTS 的版本。其他版本尚未使用 npm 进行测试。

如果你是Linux请去文档查看更多内容

安装稳定版后,运行 node -v。版本应为 v8.5.0 或更高版本。

2. 更新 npm

安装 node.js 时,会自动安装 npm。但是,npm 比 Node.js 更新得更频繁,因此请确保您拥有最新版本。

run

npm -v

查看你当前的版本

去这个网站滑倒最下面 有当前稳定版的最新版本

安装最新的稳定版本

npm install npm@latest -g

安装最新的测试版本

npm install npm@next -g

使用版本管理器安装 Node.js 和 npm

由于npm和node.js产品由不同的实体管理,更新和维护会变得复杂。另外,Node.js的安装过程将npm安装在一个只有本地权限的目录中。当你试图在全局范围内运行软件包时,这可能导致权限错误。

为了解决这两个问题,许多开发者选择使用node版本管理器,即nvm,来安装npm。版本管理器将避免权限错误,并将解决更新Node.js和npm的复杂问题。

此外,开发人员可以使用nvm在多个版本的npm上测试他们的应用程序。nvm使你能够轻松地切换npm以及node版本。这使得你更容易确保你的应用程序为大多数用户工作,即使他们正在使用其他版本的npm。如果你决定安装一个版本管理器,请使用你所选择的版本管理器的说明来学习如何切换版本,并学习如何保持与最新版本的npm同步。

Apple macOS

点击这里,了解如何为MacOs安装nvm。

Microsoft Windows

要在 Windows 上安装和管理 npm 和 Node.js,我们建议使用 nvm-windows

Linux

单击此处了解如何为 Linux 安装 nvm。

想了解关于nvm的更多内容点击这里


3. 如何安装本地包

有两种方式用来安装 npm 包:本地安装和全局安装。至于选择哪种方式来安装,取决于我们如何使用这个包。

  • 如果你自己的模块依赖于某个包,并通过 Node.js 的 require 加载,那么你应该选择本地安装,这种方式也是 npm install 命令的默认行为。
  • 如果你想将包作为一个命令行工具,(比如 grunt CLI),那么你应该选择全局安装

想要了解更多关于 install 命令行的行为,可以查看 CLI 文档

安装一个包

可以使用下面的命令来安装一个包:

npm install <package_name>

上述命令执行之后将会在当前的目录下创建一个 node_modules 的目录(如果不存在的话),然后将下载的包保存到这个目录下。

测试:

为了确认 npm install 是正常工作的,可以检查 node_modules 目录是否存在,并且里面是否含有你安装的包的文件夹。

实例:

安装一个叫做 lodash 的包。安装成功之后,如果 node_modules 目录下存在一个名为 lodash 的文件夹,则说明成功安装了这个包。

Microsoft Windows:

C:\ npm install lodash
C:\ dir node_modules

#=> lodash

macOS, Ubuntu, Debian

> npm install lodash
> ls node_modules

#=> lodash

哪个版本的包会被安装了?

在本地目录中如果没有 package.json 这个文件的话,那么最新版本的包会被安装。

如果存在 package.json 文件,则会在 package.json 文件中查找针对这个包所约定的语义化版本规则,然后安装符合此规则的最新版本。

使用已安装的包

一旦将包安装到 node_modules 目录中,你就可以使用它了。比如在你所创建的 Node.js 模块中,你可以 require 这个包。

实例:

创建一个名为 index.js 的文件,并保存如下代码:

// index.js
var lodash = require('lodash');

var output = lodash.without([1, 2, 3], 1);
console.log(output);

运行 node index.js 命令。应当输出 [2, 3]

如果你没能正确安装 lodash,你将会看到如下的错误信息:

module.js:340
throw err;
^
Error: Cannot find module 'lodash'

可以在 index.js 所在的目录中运行 npm install lodash 命令来修复这个问题。

4.使用 package.json

管理本地安装的 npm 包的最佳方法是创建一个 package.json文件。

一个package.json文件:

  • 列出你的项目所依赖的包。
  • 允许您使用语义版本控制规则指定项目可以使用的包的版本。
  • 使您的构建可重现,因此容易与其他开发人员共享。

要求

必须package.json具备:

  • ```
    “name”

    - 全小写
    - 一个词,没有空格
    - 允许使用破折号和下划线

    - ```
    "version"

例如:

{
"name": "my-awesome-package",
"version": "1.0.0"
}

创建一个package.json

创建 package.json 文件有两种基本方法。

1. 运行 CLI 问卷

package.json使用您提供的值创建一个,请运行:

> npm init

这将启动一个命令行调查表,该调查表将以package.json在您启动命令的目录中创建一个结束。

2.创建一个默认值package.json

要获得默认值package.jsonnpm init请使用--yes or-y标志运行:

> npm init --yes

package.json此方法将使用从当前目录中提取的信息生成默认值。

> npm init --yes
Wrote to /home/ag_dubs/my_package/package.json:

{
"name": "my_package",
"description": "",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "https://github.com/ashleygwilliams/my_package.git"
},
"keywords": [],
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/ashleygwilliams/my_package/issues"
},
"homepage": "https://github.com/ashleygwilliams/my_package"
}
  • name: 当前目录名
  • version: 总是1.0.0
  • description: 自述文件中的信息,或空字符串""
  • main: 总是index.js
  • scripts: 默认创建一个空test脚本
  • keywords: 空的
  • author: 空的
  • license:ISC
  • bugs:来自当前目录的信息,如果存在
  • homepage:来自当前目录的信息,如果存在

您还可以为 init 命令设置几个配置选项。一些有用的:

> npm set init.author.email "wombat@npmjs.com"
> npm set init.author.name "ag_dubs"
> npm set init.license "MIT"

笔记:

如果 中没有描述字段,npm 将使用或 READMEpackage.json的第一行。README.md描述有助于人们在搜索 npm 时找到您的包,因此在 中进行自定义描述package.json以使您的包更容易找到绝对有用。

如何自定义package.json问卷

如果您希望创建许多 package.json 文件,您可能希望自定义 init 过程中提出的问题,以便文件始终包含您期望的关键信息。您可以自定义字段以及提出的问题。

为此,您需要.npm-init.js在主目录中 创建一个自定义~/.npm-init.js

一个简单的.npm-init.js可能看起来像这样:

module.exports = {
customField: 'Custom Field',
otherCustomField: 'This field is really cool'
}

在您的主目录中使用此文件运行npm init将输出package.json包含以下行的 a:

{
customField: 'Custom Field',
otherCustomField: 'This field is really cool'
}

您还可以使用该prompt功能自定义问题。

module.exports = prompt("what's your favorite flavor of ice cream, buddy?", "I LIKE THEM ALL");

要了解有关如何创建高级自定义的更多信息,请查看init-package-json的文档

指定依赖项

要指定项目所依赖的包,您需要在package.json文件中列出要使用的包。您可以列出两种类型的包:

  • "dependencies":您的应用程序在生产中需要这些包。
  • "devDependencies":这些包仅用于开发和测试。

手动编辑您的package.json

您可以手动编辑您的package.json. 您需要在包对象中创建一个属性,该属性称为dependencies指向一个对象。该对象将包含命名您要使用的包的属性。它将指向一个semver表达式,该表达式指定与您的项目兼容的该项目的版本。

如果您有只需要在本地开发期间使用的依赖项,请按照与上述相同的说明进行操作,但使用名为devDependencies.

例如,下面的项目my_dep在生产中使用与主要版本 1 匹配的任何版本的包,并且需要my_test_framework与主要版本 3 匹配的任何版本的包,但仅用于开发:

{
"name": "my_package",
"version": "1.0.0",
"dependencies": {
"my_dep": "^1.0.0"
},
"devDependencies" : {
"my_test_framework": "^3.1.0"
}
}

--save安装--save-dev标志

添加依赖项的更简单(也更棒)的方法是从命令行执行此操作,使用或 package.json标记npm install命令,具体取决于您希望如何使用该依赖项。--save``--save-dev

要向您package.json的 ‘s添加条目dependencies

npm install <package_name> --save

要向您package.json的 ‘s添加条目devDependencies

npm install <package_name> --save-dev

管理依赖版本

npm 使用语义版本控制,或者我们经常提到的 SemVer,来管理包的版本和版本范围。

如果您的package.json目录中有一个文件并且您运行npm install,npm 将查看该文件中列出的依赖项并使用语义版本控制下载最新版本。

学到更多

要了解更多关于 package.json 的强大功能,请参阅第 8 章中的视频“在本地安装 npm 包” 。

要了解有关语义版本控制的更多信息,请参阅入门“Semver”页面


5. 如何更新本地安装的包

定期更新你的应用所依赖的包(package)是个好习惯。因为依赖包的开发者更新了代码,你的应用也就能够获得提升。

为了完成这个任务需要:

  1. package.json 文件所在的目录中执行 npm update 命令。
  2. 执行 npm outdated 命令。不应该有任何输出。

深入学习

参考资料

6. 如何卸载本地安装的包

如需删除 node_modules 目录下面的包(package),请执行:

npm uninstall :

npm uninstall lodash

如需从 package.json 文件中删除依赖,需要在命令后添加参数 --save:

npm uninstall --save lodash

注意:如果你将安装的包作为 “devDependency”(也就是通过 --save-dev 参数保存的),那么 --save 无法将其从 package.json 文件中删除。所以必须通过 --save-dev 参数可以将其卸载。

试一试:

为了确定 npm uninstall 命令执行成功,请找到 node_modules 目录,并在此目录下检查你所卸载的包(package)所对应的目录是否消失了。

通过如下命令:

  • ls node_modules 在 Unix 系统中使用,例如 “OSX”
  • dir node_modules 在 Windows 系统中使用。

实例:

安装 lodash。为了确认安装成功,请检查 node_modules 目录下是否存在 lodash 目录。

通过 npm uninstall 命令卸载 lodash。为了确认执行成功,请检查 node_modules 目录下不存在 lodash 目录。

安装 Lodash
> npm install lodash
> dir node_modules # Unix 系统使用 `ls node_modules` 命令
卸载 Lodash
#=> lodash

> npm uninstall lodash
> dir node_modules # Unix 系统使用 `ls node_modules` 命令

#=>

7. 如何安装全局包

有两种方式用来安装 npm 包:本地安装和全局安装。选用哪种方式来安装,取决于你如何使用这个包。

  • 如果你想将其作为一个命令行工具,那么你应该将其安装到全局。这种安装方式后可以让你在任何目录下使用这个包。比如 grunt 就应该以这种方式安装。
  • If you want to depend on the package from your own module, then install it locally. This is the choice you would use if you are using require statements, for example.

将包安装到全局,你应该使用 npm install -g 命令,例如:

npm install -g jshint

如果你遇到 EACCES 错误,请查看第 3 章

小技巧:如果你安装的 npm 是 5.2 或更高版本,可以使用 npx 运行全局安装的包。

8. 如何更新全局安装的包

需要 2.6.1 或更高版本。如果您使用的是旧版本,请参见下文。

要更新全局包,请键入:

npm update -g 

例如,要更新名为 jshint 的包,您需要输入:

npm update -g jshint

要找出需要更新的软件包,请键入:

npm outdated -g --depth=0.

要更新所有全局包,请键入:

npm update -g.

如果您使用的是 2.6.0 或更低版本

对于低于 2.6.1 的 npm 版本,运行此脚本以更新所有过时的全局包。

但是,请考虑升级到最新版本的 npm。为此,请键入:

npm install npm@latest -g.

9.如何卸载全局安装的包

通过如下命令将包(package)安装到全局:

npm uninstall -g 

例如安装 jshint 包到全局,使用如下命令:

npm uninstall -g jshint

10. 如何创建 Node.js 模块

Node.js 模块是一种可以发布到 npm 的包。当你创建一个新模块时,创建 package.json 文件是第一步。

你可以使用 npm init 命令创建 package.json 文件。命令行中将会提示 package.json 字段中需要你输入的值。名称(name)版本(version) 这两个字段是必填的。你还需要输入 入口文件字段(main) 字段,当然,可以使用默认值 index.js。这些步骤在第 5 章 有详细的讲解。

如果你想为作者(author)字段添加信息,你可以使用以下格式(邮箱、网址都是选填的):

Your Name <email@example.com> (http://example.com)

创建 package.json 文件之后,还需要创建模块的入口文件。如果使用默认值,文件名是 index.js

在此文件中,添加一个函数,作为 exports对象的一个属性。这样,require 此文件之后,这个函数在其他代码中就可以使用了。

exports.printMsg = function() {
console.log("This is a message from the demo package");
}

试一试:

  1. 将你的包发布到 npm。
  2. 在你的项目外新建一个目录。
  3. 然后 cd 进入这个新目录。
  4. 执行 npm install 命令。
  5. 创建一个 test.js 文件,require 这个包,并调用其中的方法。
  6. 执行 node test.js 命令。是否输出 console.log 中填写的信息?

深入学习

To understand types of packages, click here.

11.如何发布和更新包

你可以发布任何有package.json文件的目录。本章解释了如何首次发布软件包,以及如何在以后更新它。

如何发布一个包

准备工作

了解 npm 政策

在你开始之前,最好先看看 npm 的政策,以防你对网站礼仪、命名、许可或其他准则有疑问。

创建一个用户账户

要发布,您必须是 npm 注册表上的用户。如果您不是用户,请使用 npm adduser. 如果您在网站上创建了用户帐户,请使用npm login从您的终端访问您的帐户。

测试一下:

  1. 从终端输入npm whoami以查看您是否已经登录(从技术上讲,这也意味着您的凭据已存储在本地)。
  2. 检查您的用户名是否已添加到https://npmjs.com/~username

例如,

https://www.npmjs.com/~carolynawombat

查看软件包目录

查看内容

注意,目录中的所有内容都会被包括在内,除非它被本地的.gitignore或.npmignore文件所忽略。要了解如何使用这些命令,请参阅npm-developers

查看 package.json 文件

阅读使用 package.json以确保您想要的详细信息反映在您的包中。

选择一个名字

为您的包裹选择一个唯一的名称。尝试选择一个描述性的名称:

  • 尚未被其他人拥有
  • 拼写不像另一个名字,除了有错别字
  • 不会混淆其他人关于作者身份
  • 符合npm 政策指南。例如,不要将您的包裹命名为令人反感的名称,也不要使用他人的商标名称。
  • 在 package.json 文件的相应行中指定名称。

注意:如果您使用的是scopes,则前 3 个警告不适用。

包括文档 (readme.md)

npm 建议您包含一个自述文件来记录您的包。自述文件必须具有文件名readme.md。文件扩展名.md表示该文件是markdown文件。当有人找到你的包时,这个文件会出现在 npm 网站上。

在开始之前,请查看一些软件包页面,了解可以添加到自述文件中的信息的想法,并了解为什么这如此重要。

  1. 使用任何文本编辑器创建文件。
  2. 将其保存在项目目录中,名称为readme.md
  3. 当您发布时,此文档将显示在人们下载您的包的网页上。

发布!

用于npm publish发布包。

测试

https://npmjs.com/package/。你应该会看到一个关于你的新包的页面。它可能看起来有点像这样:

恭喜!

如何更新包

如何更新版本号

进行更改时,可以使用更新包

npm version 

其中 语义版本控制版本类型、补丁、次要或主要版本之一。

此命令将更改package.json.

注意:如果您已将一个标签链接到您的 npm 帐户,这也会将带有更新版本号的标签添加到您的 git 存储库。

更新版本号后,再次运行npm publish

测试:转到https://npmjs.com/package/。应更新包号。

如何更新自述文件

除非发布了新版本的软件包,否则站点上显示的 README 将不会更新,因此您需要运行npm version patchnpm publish更新站点上显示的文档。

学到更多

要了解有关节点模块和包的更多信息,请参阅此处

要了解语义版本控制,请单击此处

要了解有关标签的更多信息,请单击此处

要了解有关package.json文件的更多信息,请单击此处

要了解有关命名的更多信息,包括 npm 如何保护您免受误码混淆,请单击此处


上传一个npm包流程总结

第一步:注册一个账号

去npm的官方网站注册一个账号点击打开链接

第二步:初始化

使用npm init初始化一个package.json文件

npm init -y // 加上-y 就不要输入那些信息了 信息可以在package.json中去改

注意:必须要有这个文件才能上传,npm可以上传任何一个包含package.json的包,
main:(入口)设置为lib/minigui-ui.common.js(名字自取)然后在本目录下建一个minigui-ui.common.js文件
name:表示你这个包的名字只能小写
version:代表版本,每次更新都要修改这里的版本再npm publish
files:包含那些地文件夹和文件

"name": "minigui-ui",
"version": "3.0.0",
"description": "A Component Library for Vue.js.",
"main": "lib/minigui-ui.common.js",
"files": [
"lib",
"src",
"packages",
"types"
]

package.json可以在这里了解一下点击查看

第三步:登录连接npm

npm login 
//或者
npm adduser

第四步:检查镜像

因为大部分的人npm使用的是淘宝镜像,上传会失败,所以需要替换为原来的镜像 https://registry.npmjs.org/

npm config set registry https://registry.npmjs.org/

再查看是否设置成功

npm config get registry

扩展一下:

// 查看当前配置
npm config list

// 安装镜像
npm config set registry https://registry.npm.taobao.org/
npm config set disturl https://npm.taobao.org/dist

// 删除镜像
npm config delete registry
npm config delete disturl

第五步:上传前的检查

如果第四步更改了镜像 那么就要重新 执行第三步

第六步:上传到NPM

npm publish

第七步 : error

如果出现报错 复制报错内容自行搜索

常见报错 如 npm包名称同名 要取一个唯一的名字

第八步: 想要撤销上传

npm unpublish --force

12. 如何使用语义化版本

​ 沟通新发布的代码中的变化程度是很重要的,因为有时更新会破坏软件包所需要的代码(称为依赖关系)。语义版本管理(semver)是一种标准,旨在解决这个问题。

面向出版商的Semver

如果一个项目要与其他人共享,它应该从1.0.0开始,(尽管npm上的一些项目并不遵循这一规则)。

在这之后,应该按照以下方式处理变化。

SemVerTable

面向消费者的Semver

针对使用者的语义化版本

如果你从1.0.4的包开始,你会这样指定范围。

补丁版本。1.0或1.0.x或~1.0.4
次要版本。1或1.x或^1.0.4
主要版本。*或x

了解更多

关于使用package.json文件的语义版本管理的更多信息,请参阅第5章

关于另一种标记发布版本的方法,请了解npm dist标签,以及它们与语义版本管理的关系

13. 如何用Dist-tags给软件包贴标签

分发标签(dist-tags)是对语义版本管理(例如,v0.12)的补充。使用它们来组织和标记不同版本的软件包。除了比semver编号更容易让人读懂之外,标签还允许发布者更有效地发布他们的软件包。

添加标签

要给你的软件包的特定版本添加一个标签,请使用。

npm dist-tag add @ []

使用标签发布

默认情况下,npm publish会用latest标签来标记你的软件包。如果你使用--tag标志,你可以指定另一个标签来使用。例如,下面将用beta标签发布你的软件包。

npm publish --tag beta

使用标签安装

npm publish一样,npm install默认使用latest标签。要覆盖这一行为,请使用npm install @。下面的例子将把 “somepkg “安装在已经被标记为 “beta “的版本上。

npm install somepkg@beta

注意事项

因为dist-tags与semver共享同一个命名空间,所以要避免使用可能导致冲突的标签名称。最好的做法是避免使用以数字或字母 “v “开头的标签。

了解更多

参见本CLI文档了解更多关于标签的信息。参见第13章以了解更多关于语义版本控制的信息。

14. 其它内容

如何使用双重身份验证(2FA)

参阅:这里

如何使用安全令牌

参阅:这里

如何从 CLI 更改配置文件设置

参阅:这里

了解包和模块

参阅:这里

更详细的命令行

参阅:这里

更详细的npm用法

参阅:这里

配置npm

参阅:这里

疑难杂症故障排查

参阅:这里


15. 结语

了解更多npm内容 可以参考以下链接

视频教程