npm简介

NPM 使用介绍

  • NPM是随同NodeJS一起安装的包管理工具,就像maven工具。
  • 新版的nodejs已经集成了npm,所以之前npm也一并安装好了。
  • 同样可以通过输入 "npm -v" 来测试是否成功安装。

查看版本

npm -v

命令安装模块

//安装最新模块
npm install <Module Name>

//安装指定版本的模块
npm install <Module Name>@versions

//安装模块最新版本的包
npm install <Module Name>@latest

//安装软件包并将其另存为package.json文件中的依赖项
npm install <Module Name> --save


安装参数--save 和--save dev

  • 需要添加包的时候,可以手动更改package.json文件
  • 命令行,增加--save 或者--save dev 后缀
--save,表示将包名和对应的版本,添加到package.json里的dependencies模块(生产环境)
npm install <package_name> --save
--save dev,表示将包名和对应的版本,添加到package.json里的devDependencies模块(开发环境)
npm install <package_name> --save dev

镜像切换

获取配置文件的镜像地址

npm get registry 

使用某个镜像下载模块

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

修改npm的配置文件(第一种方法)

npm config edit

registry=https://registry.npm.taobao.org

修改配置文件镜像(第二种方法)

//原始
npm config set registry https://registry.npmjs.org
//淘宝
npm config set registry http://registry.npm.taobao.org/
//淘宝
npm config set registry http://npm.taobao.org

全局安装与本地安装

npm 的包安装分为本地安装(local)、全局安装(global)两种

npm install express          # 本地安装
npm install express -g       # 全局安装

如果出现以下错误:

npm err! Error: connect ECONNREFUSED 127.0.0.1:8087 

解决办法为:

npm config set proxy null

本地安装

    1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
    1. 可以通过 require() 来引入本地安装的包。

全局安装

    1. 将安装包放在 /usr/local 下或者你 nodejs 的安装目录(C:\nodejs\node_modules)。
    1. 可以直接在命令行里使用。

常用命令

创建模块

npm init
//可以跳过所有的问题
npm init --yes

卸载模块

npm uninstall express

卸载后,你可以到 /node_modules/ 目录下查看包是否还存在,或者查看依赖列表是否还存在该依赖。

更新模块

npm update express

查看模块

//查看全局安装模块
npm list -g

//查看 当前项目 某个模块的版本号
npm list grunt

//查看模块的所有版本号
npm view cron versions

//查看模块的最新版本号
npm view cron version

//查看模块版本信息
npm info cron

检查过时安装包

//查看,是否有新版本
npm outdated

Package    显示包名。若使用了 --long / -l 则还是显示这个包属于 dependencies 还是devDependency
Current    当前依赖包安装版本
Wanted     根据 package.json 包版本前缀规则可以更新的最新版本号
Latest     最新包版本号【默认情况下是最新的,这取决于开发人员的包管理制度】
Location   是该依赖包在所居于的依赖树中所在的位置

package 字体颜色含义
红色 package.json 中包版本前缀规则可更新的依赖包
黄色 package.json 中包版本前缀规则不可更新的依赖包

查看依赖列表

npm ls

搜索模块

npm search express

删除代理

npm config rm proxy
npm config rm https-proxy

查看所有命令&查找帮助

npm help

查看某条命令的详细帮助

npm help install

在 npm 资源库中注册用户(使用邮箱注册)

npm adduser

发布模块

npm publish

撤销发布自己发布过的某个版本代码

npm unpublish <package>@<version>

清空NPM本地缓存,对付使用相同版本号发布新版本代码的人

npm cache clear

package.json详解

作用

  • package.json 位于模块的目录下,用于定义包的属性。

  • 作为一个描述文件,描述了你的项目依赖那些包

  • 允许我们使用“语义版本规则”,指明你项目依赖的版本

属性说明

  • name - 包名。(全部小写,没有空格,可以使用下划线或者横线)
  • version - 包的版本号。(x.x.x的格式,符合语义化规则)
  • description - 包的描述。
  • scripts - 支持的脚本,默认是一个空的test
  • main - main 字段指定了程序的主入口文件,require('moduleName') 就会加载这个文件。这个字段的默认值是模块根目录下面的 index.js。
  • license - 默认是MIT
  • homepage - 包的官网 url 。
  • author - 包的作者姓名。
  • contributors - 包的其他贡献者姓名。
  • dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。
  • repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。
  • keywords - 关键字,有助于人们使用npm search搜索时候发现你的项目

npm init命令设置一些package默认值

npm set init.author.name "line"

指定依赖的包

包依赖有2种方式

  • dependencies,在生产环境中需要用到的依赖
  • devDependencies,在开发、测试环境中用到的依赖

语义化版本规则

如上package.设置有依赖dependencies的内容,例如 "vue": "2.5.22",key是依赖包的名称,value是这个依赖包的版本,那么版本签名的是什么意思呢,或者版本前面直接是一个*是什么意思,这就是npm的语义化版本规则。

使用NPM下载和发布代码时都会接触到版本号。NPM使用语义版本号来管理代码,这里简单介绍一下。

语义版本号分为X.Y.Z三位,分别代表主版本号、次版本号和补丁版本号。当代码变更时,版本号按以下原则更新。

  • 补丁版本,解决了bug或者一些较小的更改,更新Z位,如:1.0.1

  • 小版本,增加了新特性、功能,同时不会影响之前的版本,更新Y位,如:1.1.0

  • 大版本,大改版,无法兼容之前的版本,更新X位,如:2.0.0

使用者,可以在package.json文件中写明可以接受的更新程度,

  • 接受补丁版本的更新,1.0 1.0.x -1.0.4
  • 接受小版本的更新,1 1.x ^1.0.4
  • 接受大版本的更新 * x

依赖版本认知

项目对应依赖包一般保存在 package.json 文件中,相对应版本号的形式为major.minor.patch

major 表示非兼容的重大 API 改变(主要的)

minor 表示向后兼容的功能性改变(次要的)

patch 表示向后兼容的 bug 修正(修补的)

依赖包对应版本号前缀符号含义

  • * 匹配最新的 major 版本依赖包
  • ^ 匹配最新的 minor 版本依赖包,eg: 1.1.0 可以更新匹配所有 1.x.x 的包,不会更新匹配 2.x.x
  • ~ 匹配最新的 patch 版本依赖包,eg: 1.1.0 可以更新匹配所有 1.1.x 的包,不会更新匹配 1.2.x
  • 没有前缀表示固定版本号, 版本不会更新匹配任何其他版本。【需要手动修改 package.json 包版本】

执行脚本

#npm执行脚本,package.json文件有个scripts字段,可以定义脚本命令(lint,build),npm直接执行
npm run lint
npm run build

#npm run 执行script下面所有的命令
npm run

#dev 脚本,开发阶段要做的处理.dev是自定义命令
npm run dev 

#serve,脚本用于启动服务,serve是自定义命令
npm run serve

样例(node_modules/express/package.json内容)

{
  "name": "express",
  "description": "Fast, unopinionated, minimalist web framework",
  "version": "4.13.3",
  "author": {
    "name": "TJ Holowaychuk",
    "email": "tj@vision-media.ca"
  },
  "contributors": [
    {
      "name": "Aaron Heckmann",
      "email": "aaron.heckmann+github@gmail.com"
    },
    {
      "name": "Ciaran Jessup",
      "email": "ciaranj@gmail.com"
    },
    {
      "name": "Douglas Christopher Wilson",
      "email": "doug@somethingdoug.com"
    },
    {
      "name": "Guillermo Rauch",
      "email": "rauchg@gmail.com"
    },
    {
      "name": "Jonathan Ong",
      "email": "me@jongleberry.com"
    },
    {
      "name": "Roman Shtylman",
      "email": "shtylman+expressjs@gmail.com"
    },
    {
      "name": "Young Jae Sim",
      "email": "hanul@hanul.me"
    }
  ],
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/strongloop/express.git"
  },
  "homepage": "http://expressjs.com/",
  "keywords": [
    "express",
    "framework",
    "sinatra",
    "web",
    "rest",
    "restful",
    "router",
    "app",
    "api"
  ],
  "dependencies": {
    "accepts": "~1.2.12",
    "array-flatten": "1.1.1",
    "content-disposition": "0.5.0",
    "content-type": "~1.0.1",
    "cookie": "0.1.3",
    "cookie-signature": "1.0.6",
    "debug": "~2.2.0",
    "depd": "~1.0.1",
    "escape-html": "1.0.2",
    "etag": "~1.7.0",
    "finalhandler": "0.4.0",
    "fresh": "0.3.0",
    "merge-descriptors": "1.0.0",
    "methods": "~1.1.1",
    "on-finished": "~2.3.0",
    "parseurl": "~1.3.0",
    "path-to-regexp": "0.1.7",
    "proxy-addr": "~1.0.8",
    "qs": "4.0.0",
    "range-parser": "~1.0.2",
    "send": "0.13.0",
    "serve-static": "~1.10.0",
    "type-is": "~1.6.6",
    "utils-merge": "1.0.0",
    "vary": "~1.0.1"
  },
  "devDependencies": {
    "after": "0.8.1",
    "ejs": "2.3.3",
    "istanbul": "0.3.17",
    "marked": "0.3.5",
    "mocha": "2.2.5",
    "should": "7.0.2",
    "supertest": "1.0.1",
    "body-parser": "~1.13.3",
    "connect-redis": "~2.4.1",
    "cookie-parser": "~1.3.5",
    "cookie-session": "~1.2.0",
    "express-session": "~1.11.3",
    "jade": "~1.11.0",
    "method-override": "~2.3.5",
    "morgan": "~1.6.1",
    "multiparty": "~4.1.2",
    "vhost": "~3.0.1"
  },
  "engines": {
    "node": ">= 0.10.0"
  },
  "files": [
    "LICENSE",
    "History.md",
    "Readme.md",
    "index.js",
    "lib/"
  ],
  "scripts": {
    "test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/",
    "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/",
    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/",
    "test-tap": "mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/"
  },
  "gitHead": "ef7ad681b245fba023843ce94f6bcb8e275bbb8e",
  "bugs": {
    "url": "https://github.com/strongloop/express/issues"
  },
  "_id": "express@4.13.3",
  "_shasum": "ddb2f1fb4502bf33598d2b032b037960ca6c80a3",
  "_from": "express@*",
  "_npmVersion": "1.4.28",
  "_npmUser": {
    "name": "dougwilson",
    "email": "doug@somethingdoug.com"
  },
  "maintainers": [
    {
      "name": "tjholowaychuk",
      "email": "tj@vision-media.ca"
    },
    {
      "name": "jongleberry",
      "email": "jonathanrichardong@gmail.com"
    },
    {
      "name": "dougwilson",
      "email": "doug@somethingdoug.com"
    },
    {
      "name": "rfeng",
      "email": "enjoyjava@gmail.com"
    },
    {
      "name": "aredridel",
      "email": "aredridel@dinhe.net"
    },
    {
      "name": "strongloop",
      "email": "callback@strongloop.com"
    },
    {
      "name": "defunctzombie",
      "email": "shtylman@gmail.com"
    }
  ],
  "dist": {
    "shasum": "ddb2f1fb4502bf33598d2b032b037960ca6c80a3",
    "tarball": "http://registry.npmjs.org/express/-/express-4.13.3.tgz"
  },
  "directories": {},
  "_resolved": "https://registry.npmjs.org/express/-/express-4.13.3.tgz",
  "readme": "ERROR: No README data found!"
}

思考

package 与 package-lock文件的区别

package.json(依赖版本管理文件)记录你项目中所需要的所有模块。

  • 当你执行npm install的时候,node会先从package.json文件中读取所有dependencies信息
  • 然后根据dependencies中的信息与node_modules中的模块进行对比,没有的直接下载,已有的检查更新(最新版本的nodejs不会更新,因为有package-lock.json文件),使用package-lock文件读取的包版本下载。

package-lock.json(锁定依赖版本文件)锁定所有模块的版本号,包括 主模块和所有 依赖子模块

  • 当你执行npm install的时候,node从package.json文件读取模块名称,从package-lock.json文件中获取版本号,然后进行下载或者更新。
  • 正因为有了package-lock.json文件锁定版本号,所以当你执行npm install的时候,node不会自动更新package.json文件中的模块,必须用npm install packagename(自动更新小版本号)或者npm install packagename@x.x.x(指定版本号)来进行安装才会更新,package-lock.json文件中的版本号也会随着更新。

npm install和npm update区别

两者最大的区别是在对待已经安装过的模糊版本时候

  • npm install会忽略模糊版本

  • npm update会更新模糊版本至最新

install and update 处理 devDependencies 方式也不同

  • npm install 会安装/更新devDependencies,除非你指定 --production标志

  • npm update 会忽略 devDependencies,除非你指定 --dev 标志

  • package 表示 package.json 依赖版本管理文件

  • lock 表示 package-lock.json 锁定依赖版本文件

  1. lock 文件存在
  • npm i 会按照 lock 对应包版本进行安装,不会自动升级
    • 手动更改 package 中对应包, lock 会按照 package 前缀版本规范更新到最新版本, package 版本为手动版本不变
  • npm update 会按照 package 对应包版本前缀升级规范安装到最新到版
    • package 中对应包版本号改变【按前缀规范最新版与 lock 中相同则不变,不同则改变】
    • lock 中对应包版本号改变

2.lock 文件不存在

  • npm i 会按照 package.json 对应包版本前缀升级规范安装到最新到版本
    • package.json 仍然是之前的前缀规范版本号
    • package-lock.json 中按版本前缀规范升级到最新的版本
  • npm updatenpm i 相似
    • 但会忽略 devDependencies 下的对应包更新安装
    • 添加了 -D 才会在安装更新 dependencies 下的前提下更新安装 devDependencies 下对应的依赖包
posted @ 2021-09-30 17:48  海韵༒听心  阅读(185)  评论(0编辑  收藏  举报