npm 学习

@一棵菜菜  December 3, 2018

根据npm官方文档摘抄整理,方便自己快速查阅和回顾。

简介

【官方说明】
npm 为你和你的团队打开了连接整个 JavaScript 天才世界的一扇大门,它是世界上最大的软件注册表。来自各大洲的开源软件开发者使用 npm 互相分享和借鉴。包的结构使您能够轻松跟踪依赖项和版本。npm网站 是开发者查找包(package)、设置参数以及管理 npm 使用体验的主要途径。

Nodejs自身提供了基本的模块,但是开发实际应用过程中仅仅依靠这些基本模块则还需要较多的工作。幸运的是,Nodejs库和框架为我们提供了帮助,让我们减少工作量。但是成百上千的库或者框架管理起来又很麻烦,有了npm,可以很快的找到特定服务要使用的包,进行下载、安装以及管理已经安装的包。

npm是一个用于管理package之间依赖关系的管理器

每个项目的根目录下面,一般都会有package.json文件,定义了这个项目中所需各种包或模块及项目中的配置信息。npm install命令将根据这个配置文件,自动下载所需的包或模块,也就是配置项目中所需的运行和开发环境。

仔细观察package.json文件可以发现其内部就是一个JSON对象,该对象的每一个成员就是当前项目的一项设置。

如何安装 npm 并管理 npm 版本

npm是在node.js中编写的,所以你需要先下载node.jd才能使用npm。安装node.js时, npm将自动安装。

全局下载npm包

sudo npm install npm -g
  1. 安装 Node.js 和 npm

    Node.js官方下载地址
    注意:请务必安装标记为LTS的版本。其他版本还没有经过npm的测试。
  2. 查看版本

    node -v
    npm -v

相关文件

  1. package.json 文件(配置项)
  2. node_modules 文件夹(保存下载的包的地方)
  3. package-lock.json 文件(锁定安装时的包的版本号)
  4. .npmignore

安装淘宝 NPM 镜像(可以学习下)

淘宝 NPM 镜像:这是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。

安装:

npm i -g cnpm --registry=https://registry.npm.taobao.org

然后就可以cnpm安装依赖包了,比如下载webpack

cnpm install webpack --save-dev
淘宝 NPM 镜像 官方网站

安装package

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

  1. 如果你自己的模块依赖于某个包,并通过 Node.js 的 require() 加载,那么你应该选择本地安装,这种方式也是 npm install 命令的默认行为
  2. 如果你想将包作为一个命令行工具(要在命令行上运行它),(比如 grunt CLI),那么你应该选择全局安装。这种安装方式后可以让你在任何目录下使用这个包

注意:如果既需要require()又需要在命令行上运行它,那么在两个地方都安装它,或者使用npm链接。

安装一个包

本地安装命令

> npm install <package_name>

这个命令执行之后将会在当前的目录下创建一个node_modules的目录(如果不存在的话),然后将下载的包保存到这个目录下。(默认也会添加到package.json文件中的dependencies对象下)。

全局安装命令(一般要管理者权限)

> npm install -g <package>

将成员放入/ usr / local或安装node的任何地方。

提示:如果你遇到 EACCES 权限 错误,请查看此处

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

在本地目录中如果没有 package.json这个文件的话,那么最新版本的包会被安装。
如果存在package.json文件,则会在package.json文件中查找针对这个包所约定的语义化版本规则【传送门】,然后安装符合此规则的最新版本。

使用已安装的包

一旦将包安装到 node_modules 目录中,你就可以使用它了。比如在你所创建的 Node.js 模块中,你可以 require 这个包。
如果你没能正确安装 lodash,你将会看到如下的错误信息:

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

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

2. 使用package.json

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

创建一个package.json

有两种方式可以创建:

  1. 运行一个 CLI 问答券方式创建
> npm init
  1. 快速创建一个默认的package.json
> npm init --yes

指定依赖项(Specifying Dependencies)

要指定项目所依赖的包,就需要在package.json中列出我们希望使用的包。有两种类型可以列出:

• "dependencies": 生产应用程序需要这些包。
• "devDependencies": 这些包只用于开发和测试。

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

添加一个条目到 package.json 的 dependencies:

npm install <package_name>
npm install <package_name> --save

添加一个条目到 package.json 的 devDependencies:

npm install <package_name> --save-dev
上面代码表示单独安装模块。--save表示将该模块写入dependencies属性,--save-dev表示将该模块写入devDependencies属性。同时省略则表示不写入package.json文件中。
【注意:「同时省略则表示不写入package.json文件中」这是 Node.js v8.0以下版本要注意的问题。v8.0及以上使用npm install xxx命令安装模块时,不再需要--save选项,会自动将模块依赖信息保存到 package.json 文件;】

3. 更新包

定期更新你的应用所依赖的包(package)是个好习惯。

npm update

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

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

    npm uninstall <package>
  2. 如需从 package.json 文件中删除依赖:

    a. 从package.json 文件中的dependencies中删除依赖:

    npm uninstall --save lodash

    b. 从package.json 文件中的devDependencies中删除依赖:

    npm uninstall --save-dev lodash

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

  1. 【疑问:但我尝试npm uninstall lodash --save还是可以删除devDependency 中的依赖哎】
  2. npm install lodash --save后,再用npm uninstall lodash --save-dev卸载时,是先移动再删除:notice save lodash is being moved from dependencies to devDependencies

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

语义化版本规则

针对发布者的语义化版本规则

如:v1.0.0

• 修复bug或者其他小的改变,增加第三个数子
• 没有破坏或改变已存在的特性 的新特性,增加第二个数字
• 破坏向后兼容性的更改,增加第一个数字

semver for publishers.png

针对使用者的语义化版本

如果您从包1.0.4开始,这是您指定范围的方式:

• 补丁发布:1.0或1.0.x或~1.0.4
• 次要版本:1或1.x或^1.0.4
• 主要版本:*或x
原文

如何使用Dist-tags来标记包

分布标签(dist-tags)补充语义版本控制(例如,v0.12)。使用它们来组织和标记不同版本的包。更具人性、可读性,标签还允许发布者更有效地分发他们的包。

使用标签安装

比如npm publish,默认npm install <pkg>会使用latest(最新)标签。要覆盖此行为,请使用npm install <pkg>@<tag>。以下示例将安装somepkg已标记的版本beta

npm install somepkg@beta

理解包和模块

What is a package

What is a module

Git url可以是这种形式的

git://github.com/user/project.git#commit-ish
git+ssh://user@hostname:project.git#commit-ish
git+http://user@hostname/project/blah.git#commit-ish
git+https://user@hostname/project/blah.git#commit-ish

commit-ish 可以是任何tag, sha, 或者作为可以提供的分支的git checkout的参数,默认是master。如git+https://user@hostname/project/blah.git#v0.2.4

大多数npm包都是模块

通常,在Node中使用的npm包通过require被加载,使它们成为模块。但是,没有要求npm包必须是模块!

原文(推荐多读一读理解)

故障排除-常见错误

尝试清除npm缓存

有时npm的缓存会产生一些奇怪的问题,你可以使用:

npm cache clean

权限错误

  1. 修复缓存的权限sudo chown -R $(whoami) "$HOME/.npm"
  2. 再试一次sudo。例如sudo npm install express -gsudo npm install -g npm。(之后您可能需要修复缓存权限,如上所述)。
原文

package-lock.json 文件

作用

锁定安装时的包的版本号,并且需要上传到git,以保证其他人在npm install时大家的依赖能保证一致。

这个package-lock.json 文件是在 npm install时候生成一份文件,用以记录当前状态下实际安装的各个npm package的具体来源和版本号。

npm最新的版本就开始提供自动生成package-lock.json功能,为的是让开发者知道只要你保存了源文件,到一个新的机器上、或者新的下载源,只要按照这个package-lock.json所标示的具体版本下载依赖库包,就能确保所有库包与你上次安装的完全一样。

产生原因

原来package.json文件只能锁定大版本,也就是版本号的第一位,并不能锁定后面的小版本,你每次npm install都是拉取的该大版本下的最新的版本,为了稳定性考虑我们几乎是不敢随意升级依赖包的,这将导致多出来很多工作量,测试/适配等,所以package-lock.json文件出来了,当你每次安装一个依赖的时候就锁定在你安装的这个版本。

  1. 那如果我们安装时的包有bug,后面需要更新怎么办?

    npm install xxx@x.x.x 这样去更新我们的依赖,然后package-lock.json也能随之更新

  2. 假如我已经安装了jquery 2.1.4这个版本,从git更新了package.json和package-lock.json,我npm install能覆盖掉node_modules里面的依赖吗?

    在直接更新package.json和package-lock.json这两个文件后,npm install是可以直接覆盖掉原先的版本的,所以在协作开发时,这两个文件如果有更新,你的开发环境应该npm install一下才对

推荐查看更多详细内容

package.json 完整配置说明

{
  // 项目名称
  "name": "demo",
  // 版本号(遵守“主版本.次要版本.补丁号”的格式)
  "version": "1.0.0",
  // 描述你的模块,或者搜索
  "description": "vue.js js iview ",
  // 指定了加载的入口文件,即主文件
  "main": "app.js",
  // 指定了特殊的编译或安装脚本(运行脚本命令的npm命令行缩写,比如start指定了运行npm start时,所要执行的命令)
  "scripts": {
    "start": "node index.js"
  },
  //repository(仓库)指定一个代码存放地址
  "repository": {
    "type": "git",
    "url": "git+https://github.com/XXXX"
  },
  //作者
  "author": "mayuan",
  //授权方式
  "license": "MIT",
  // 显式地声明您的程序所需的node(或其他任何东西)的版本
  "engines": {
      "node": "0.10.x"
  },
  "bugs": {
      "url": "https://github.com/XXXX"
  },
  // 一个字符串数组,方便别人搜索到本模块
  "keywords": [
  "vue","iview"
  ], 
  // 指定项目开发和测试时需要的包(指定项目开发所需要的模块)
  "devDependencies": {
      "babel-core": "^6.23.1",
      "babel-loader": "^6.3.2",
      "babel-preset-es2015": "^6.22.0",
      "vue-html-loader": "^1.0.0",
      "vue-loader": "^8.5.2",
      "vue-style-loader": "^1.0.0",
      "webpack": "^1.13.2"
  },
  // 指定项目生产应用程序需要的包(指定了项目运行所依赖的模块)
  "dependencies": {
      "express": "latest", //指定express是最新版本
      "mongoose": "~3.8.3",
      "handlebars-runtime": "~1.0.12",
      "express3-handlebars": "~0.5.0",
      "MD5": "~1.2.0"
  }
}

说明

  1. name:请不要使用该名称来指定它在node上运行,或在JavaScript中运行。您可以使用“engines”字段显式地声明您的程序所需的node(或其他任何东西)的版本,并且很好地假设它是javascript。所以,node-foobar-js都不是好名字,foo或bar更好。
  2. engines: Specify the versions of node (or whatever else) that your program runs on. The node API changes a lot, and there may be bugs or new functionality that you depend on. Be explicit.
原文
参考官方文档

引用

npm官方文档
参考博客:https://blog.csdn.net/hh12211221/article/details/77567627

添加新评论