Node.js 官网入门教程(二) npm(包管理、安装、包版本、卸载、npx)、package.json(scripts、devDependencies)、package-lock.json(语义版本规则符号)

文章目录

  • Node.js 官网入门教程(二) npm(包管理、安装、包版本、卸载、npx)、package.json(scripts、devDependencies)、package-lock.json(语义版本规则符号)
    • 1. npm 包管理器简介
      • npm 简介
      • 下载
        • 安装所有依赖
        • 安装单个软件包
        • 更新软件包
      • 版本控制
      • 运行任务
    • 2. npm 将软件包安装到哪里
    • 3. 如何使用或执行 npm 安装的软件包
    • 4. package.json 指南
      • 文件结构
        • 属性分类
        • name
        • author
        • contributors
        • bugs
        • homepage
        • version
        • license
        • keywords
        • description
        • repository
        • main
        • private
        • scripts
        • dependencies
        • devDependencies
        • engines
        • browserslist
        • 命令特有的属性
      • 软件包版本
    • 5. package-lock.json 文件
      • 示例
    • 6. 查看 npm 包安装的版本
    • 7. 安装 npm 包的旧版本
    • 8. 将所有 Node.js 依赖包更新到最新版本
    • 9. 使用 npm 的语义版本控制
    • 10. 卸载 npm 软件包

总结:

  • 通用

    • Node.js安装包:http://nodejs.cn/download/。
    • API检索网址:API 文档 | Node.js 中文网 (nodejs.cn)
    • 第三方模板引擎:art-template官方文档
    • Express: 提供了创建 Web 服务器的最简单但功能最强大的方法之一。 它的极简主义方法,专注于服务器的核心功能,是其成功的关键。
    • koa: 由 Express 背后的同一个团队构建,旨在变得更简单更轻巧。 新项目的诞生是为了满足创建不兼容的更改而又不破坏现有社区。
    • readyState
      • 存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
      • 0: 请求未初始化
      • 1: 服务器连接已建立
      • 2: 请求已接收
      • 3: 请求处理中
      • 4: 请求已完成,且响应已就绪
    • status
      • 200, OK,访问正常
      • 301, Moved Permanently,永久移动
      • 302, Moved temporarily,暂时移动
      • 304, Not Modified,未修改
      • 307, Temporary Redirect,暂时重定向
      • 401, Unauthorized,未授权
      • 403, Forbidden,禁止访问
      • 404, Not Found,未发现指定网址
      • 500, Internal Server Error,服务器发生错误
  • lodash

    • 中文网:Lodash 简介 | Lodash 中文文档 | Lodash 中文网 (lodashjs.com)
    • Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。
    • lodash是对各种方法、函数的封装,使得使用更加方便,具体的使用方法可以参见lodash官网中的介绍。
  • npx

    • npx是一个工具,npm v5.2.0引入的一条命令(npx),一个npm包执行器,指在提高从npm注册表使用软件包时的体验 ,npm使得它非常容易地安装和管理托管在注册表上的依赖项,npx使得使用CLI工具和其他托管在注册表。它大大简化了一些事情。
    • 就像npm极大地提升了我们安装和管理包依赖的体验,在npm的基础之上,npx让npm包中的命令行工具和其他可执行文件在使用上变得更加简单。它极大地简化了我们之前使用纯粹的npm时所需要的大量步骤。
    • 主要特点
      • 临时安装可执行依赖包,不用全局安装,不用担心长期的污染
      • 可以执行依赖包中的命令,安装完成自动运行。
      • 自动加载node_modules中依赖包,不用指定$PATH。
      • 可以指定node版本、命令的版本,解决了不同项目使用不同版本的命令的问题。
  • npm

    • Yarn 是 npm 的一个替代选择。

    • 默认软件包会被安装到当前文件树中的 node_modules 子文件夹下

    • 使用 -g 标志可以执行全局安装

    • 把可执行文件放到 node_modules/.bin/ 文件夹下

    • 升级

      • 若要将所有软件包更新到新的主版本,则全局地安装 npm-check-updates 软件包:

        npm install -g npm-check-updates
        

        然后运行:

        ncu -u
        

        这会升级 package.json 文件的 dependenciesdevDependencies 中的所有版本,以便 npm 可以安装新的主版本。

  • package.json

    • main 设置了应用程序的入口点。

    • scripts 定义了一组可以运行的 node 脚本。

    • private 如果设置为 true,则可以防止应用程序/软件包被意外地发布到 npm

    • dependencies 设置了作为依赖安装的 npm 软件包的列表。

    • devDependencies 设置了作为开发依赖安装的 npm 软件包的列表。

      它们不同于 dependencies,因为它们只需安装在开发机器上,而无需在生产环境中运行代码

    • engines 设置了此软件包/应用程序在哪个版本的 Node.js 上运行。

    • browserslist 用于告知要支持哪些浏览器(及其版本)

  • package-lock.json

    • 会固化当前安装的每个软件包的版本,当运行 npm install时,npm 会使用这些确切的版本。
    • 如果写入的是 〜0.13.0,则只更新补丁版本:即 0.13.1 可以,但 0.14.0 不可以。
    • 如果写入的是 ^0.13.0,则要更新补丁版本和次版本:即 0.13.10.14.0、依此类推。
    • 如果写入的是 0.13.0,则始终使用确切的版本。
  • 语义版本

    语义版本控制的概念很简单:所有的版本都有 3 个数字:x.y.z

    • 第一个数字是主版本。
    • 第二个数字是次版本。
    • 第三个数字是补丁版本。
      • ^: 只会执行不更改最左边非零数字的更新。 如果写入的是 ^0.13.0,则当运行 npm update 时,可以更新到 0.13.10.13.2 等,但不能更新到 0.14.0 或更高版本。 如果写入的是 ^1.13.0,则当运行 npm update 时,可以更新到 1.13.11.14.0 等,但不能更新到 2.0.0 或更高版本。
      • ~: 如果写入的是 〜0.13.0,则当运行 npm update 时,会更新到补丁版本:即 0.13.1 可以,但 0.14.0 不可以。
      • >: 接受高于指定版本的任何版本。
      • >=: 接受等于或高于指定版本的任何版本。
      • <=: 接受等于或低于指定版本的任何版本。
      • <: 接受低于指定版本的任何版本。
      • =: 接受确切的版本。
      • -: 接受一定范围的版本。例如:2.1.0 - 2.6.2
      • ||: 组合集合。例如 < 2.1 || > 2.6
  • 卸载npm包

    • 移除 package.json 文件中的引用:使用 -S--save 标志
    • 如果程序包是开发依赖项(列出在 package.json 文件的 devDependencies 中),则必须使用 -D--save-dev 标志从文件中移除
    • 如果该软件包是全局安装的,则需要添加 -g--global 标志

1. npm 包管理器简介

npm 简介

npm 是 Node.js 标准的软件包管理器。

在 2017 年 1 月时,npm 仓库中就已有超过 350000 个软件包,这使其成为世界上最大的单一语言代码仓库,并且可以确定几乎有可用于一切的软件包。

它起初是作为下载和管理 Node.js 包依赖的方式,但其现在也已成为前端 JavaScript 中使用的工具。

npm 有很多功能。

Yarn 是 npm 的一个替代选择。

下载

npm 可以管理项目依赖的下载。

安装所有依赖

如果项目具有 package.json 文件,则通过运行:

npm install

它会在 node_modules 文件夹(如果尚不存在则会创建)中安装项目所需的所有东西。

安装单个软件包

也可以通过运行以下命令安装特定的软件包:

npm install <package-name>

通常会在此命令中看到更多标志:

  • --save 安装并添加条目到 package.json 文件的 dependencies。
  • --save-dev 安装并添加条目到 package.json 文件的 devDependencies。

区别主要是,devDependencies 通常是开发的工具(例如测试的库),而 dependencies 则是与生产环境中的应用程序相关。

更新软件包

通过运行以下命令,更新也变得很容易:

npm update

npm 会检查所有软件包是否有满足版本限制的更新版本。

也可以指定单个软件包进行更新:

npm update <package-name>

版本控制

除了简单的下载外,npm 还可以管理版本控制,因此可以指定软件包的任何特定版本,或者要求版本高于或低于所需版本。

很多时候,一个库仅与另一个库的主版本兼容。

或者,一个库的最新版本中有一个缺陷(仍未修复)引起了问题。

指定库的显式版本还有助于使每个人都使用相同的软件包版本,以便整个团队运行相同的版本,直至 package.json 文件被更新。

在所有这些情况中,版本控制都有很大的帮助,npm 遵循语义版本控制标准。

运行任务

package.json 文件支持一种用于指定命令行任务(可通过使用以下方式运行)的格式:

npm run <task-name>

例如:

{"scripts": {"start-dev": "node lib/server-development","start": "node lib/server-production"},
}

使用此特性运行 Webpack 是很常见的:

{"scripts": {"watch": "webpack --watch --progress --colors --config webpack.conf.js","dev": "webpack --progress --colors --config webpack.conf.js","prod": "NODE_ENV=production webpack -p --config webpack.conf.js",},
}

因此可以运行如下,而不是输入那些容易忘记或输入错误的长命令:

$ npm run watch
$ npm run dev
$ npm run prod

2. npm 将软件包安装到哪里

当使用 npm 安装软件包时,可以执行两种安装类型:

  • 本地安装
  • 全局安装

默认情况下,当输入 npm install 命令时,例如:

npm install lodash

软件包会被安装到当前文件树中的 node_modules 子文件夹下。

在这种情况下,npm 还会在当前文件夹中存在的 package.json 文件的 dependencies 属性中添加 lodash 条目。

使用 -g 标志可以执行全局安装:

npm install -g lodash

在这种情况下,npm 不会将软件包安装到本地文件夹下,而是使用全局的位置。

全局的位置到底在哪里?

npm root -g 命令会告知其在计算机上的确切位置。

在 macOS 或 Linux 上,此位置可能是 /usr/local/lib/node_modules。 在 Windows 上,可能是 C:\Users\YOU\AppData\Roaming\npm\node_modules

但是,如果使用 nvm 管理 Node.js 版本,则该位置会有所不同。

例如,使用 nvm,则软件包的位置可能为 /Users/joe/.nvm/versions/node/v8.9.0/lib/node_modules

3. 如何使用或执行 npm 安装的软件包

当使用 npm 将软件包安装到 node_modules 文件夹中或全局安装时,如何在 Node.js 代码中使用它?

假设使用以下命令安装了流行的 JavaScript 实用工具库 lodash

npm install lodash

这会把软件包安装到本地的 node_modules 文件夹中。

若要在代码中使用它,则只需使用 require 将其导入到程序中:

const _ = require('lodash')

如果软件包是可执行文件,该怎么办?

在这种情况下,它会把可执行文件放到 node_modules/.bin/ 文件夹下。

验证这一点的简单示例是 cowsay。

cowsay 软件包提供了一个命令行程序,可以执行该程序以使母牛说些话(以及其他动物也可以说话)。

当使用 npm install cowsay 安装软件包时,它会在 node_modules 文件夹中安装自身以及一些依赖包:

有一个隐藏的 .bin 文件夹,其中包含指向 cowsay 二进制文件的符号链接:

=如何执行这些可执行文件?

可以输入 ./node_modules/.bin/cowsay 来运行它,但是最新版本的 npm(自 5.2 起)中包含的 npx 是更好的选择。 只需运行:

npx cowsay

则 npx 会找到程序包的位置。

4. package.json 指南

如果使用 JavaScript、或者曾经与 JavaScript 项目、Node.js 或前端项目进行过交互,则肯定会遇到过 package.json 文件。

它有什么用途?应该了解它的什么,可以使用它完成哪些有趣的事情?

package.json 文件是项目的清单。 它可以做很多完全互不相关的事情。 例如,它是用于工具的配置中心。 它也是 npmyarn 存储所有已安装软件包的名称和版本的地方。

文件结构

这是一个示例的 package.json 文件:

{}

它是空的! 对于应用程序,package.json 文件中的内容没有固定的要求。 唯一的要求是必须遵守 JSON 格式,否则,尝试以编程的方式访问其属性的程序则无法读取它。

如果要构建要在 npm 上分发的 Node.js 软件包,则必须具有一组可帮助其他人使用它的属性。 稍后会详细介绍。

这是另一个 package.json:

{"name": "nodejs_cn"
}

它定义了 name 属性,用于告知应用程序或软件包的名称。

这是一个更复杂的示例,该示例是从 Vue.js 应用程序示例中提取的:

{"name": "test-project","version": "1.0.0","description": "A Vue.js project","main": "src/main.js","private": true,"scripts": {"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js","start": "npm run dev","unit": "jest --config test/unit/jest.conf.js --coverage","test": "npm run unit","lint": "eslint --ext .js,.vue src test/unit","build": "node build/build.js"},"dependencies": {"vue": "^2.5.2"},"devDependencies": {"autoprefixer": "^7.1.2","babel-core": "^6.22.1","babel-eslint": "^8.2.1","babel-helper-vue-jsx-merge-props": "^2.0.3","babel-jest": "^21.0.2","babel-loader": "^7.1.1","babel-plugin-dynamic-import-node": "^1.2.0","babel-plugin-syntax-jsx": "^6.18.0","babel-plugin-transform-es2015-modules-commonjs": "^6.26.0","babel-plugin-transform-runtime": "^6.22.0","babel-plugin-transform-vue-jsx": "^3.5.0","babel-preset-env": "^1.3.2","babel-preset-stage-2": "^6.22.0","chalk": "^2.0.1","copy-webpack-plugin": "^4.0.1","css-loader": "^0.28.0","eslint": "^4.15.0","eslint-config-airbnb-base": "^11.3.0","eslint-friendly-formatter": "^3.0.0","eslint-import-resolver-webpack": "^0.8.3","eslint-loader": "^1.7.1","eslint-plugin-import": "^2.7.0","eslint-plugin-vue": "^4.0.0","extract-text-webpack-plugin": "^3.0.0","file-loader": "^1.1.4","friendly-errors-webpack-plugin": "^1.6.1","html-webpack-plugin": "^2.30.1","jest": "^22.0.4","jest-serializer-vue": "^0.3.0","node-notifier": "^5.1.2","optimize-css-assets-webpack-plugin": "^3.2.0","ora": "^1.2.0","portfinder": "^1.0.13","postcss-import": "^11.0.0","postcss-loader": "^2.0.8","postcss-url": "^7.2.1","rimraf": "^2.6.0","semver": "^5.3.0","shelljs": "^0.7.6","uglifyjs-webpack-plugin": "^1.1.1","url-loader": "^0.5.8","vue-jest": "^1.0.2","vue-loader": "^13.3.0","vue-style-loader": "^3.0.1","vue-template-compiler": "^2.5.2","webpack": "^3.6.0","webpack-bundle-analyzer": "^2.9.0","webpack-dev-server": "^2.9.1","webpack-merge": "^4.1.0"},"engines": {"node": ">= 6.0.0","npm": ">= 3.0.0"},"browserslist": ["> 1%", "last 2 versions", "not ie <= 8"]
}

这里有很多东西:

  • version 表明了当前的版本。
  • name 设置了应用程序/软件包的名称。
  • description 是应用程序/软件包的简短描述。
  • main 设置了应用程序的入口点。
  • private 如果设置为 true,则可以防止应用程序/软件包被意外地发布到 npm
  • scripts 定义了一组可以运行的 node 脚本。
  • dependencies 设置了作为依赖安装的 npm 软件包的列表。
  • devDependencies 设置了作为开发依赖安装的 npm 软件包的列表。
  • engines 设置了此软件包/应用程序在哪个版本的 Node.js 上运行。
  • browserslist 用于告知要支持哪些浏览器(及其版本)。

以上所有的这些属性都可被 npm 或其他工具使用。

属性分类

本节详细介绍了可以使用的属性。

其中大多数属性仅可用于 https://www.npmjs.com/,其他属性则可被与代码交互的脚本(例如 npm 或其他工具)使用。

name

设置软件包的名称。

示例:

"name": "nodejs_cn"

名称必须少于 214 个字符,且不能包含空格,只能包含小写字母、连字符(-)或下划线(_)。

这是因为当软件包在 npm 上发布时,它会基于此属性获得自己的 URL。

如果在 GitHub 上公开地发布此软件包,则 GitHub 仓库的名称是作为此属性的不错选择。

author

列出软件包的作者名称。

示例:

{"author": "NodeJS中文网 <mail@nodejs.cn> (http://nodejs.cn)"
}

也可以使用以下格式:

{"author": {"name": "NodeJS中文网","email": "mail@nodejs.cn","url": "http://nodejs.cn"}
}

contributors

除作者外,该项目可以有一个或多个贡献者。 此属性是列出他们的数组。

示例:

{"contributors": ["NodeJS中文网 <mail@nodejs.cn> (http://nodejs.cn))"]
}

也可以使用以下格式:

{"contributors": [{"name": "NodeJS中文网","email": "mail@nodejs.cn","url": "http://nodejs.cn"}]
}

bugs

链接到软件包的问题跟踪器,最常用的是 GitHub 的 issues 页面。

示例:

{"bugs": "https://github.com/nodejscn/node-api-cn/issues"
}

homepage

设置软件包的主页。

示例:

{"homepage": "http://nodejs.cn"
}

version

指定软件包的当前版本。

示例:

"version": "1.0.0"

此属性遵循版本的语义版本控制记法,这意味着版本始终以 3 个数字表示:x.x.x

第一个数字是主版本号,第二个数字是次版本号,第三个数字是补丁版本号。

这些数字中的含义是:仅修复缺陷的版本是补丁版本,引入向后兼容的更改 的版本是次版本,具有重大更改的是主版本。

license

指定软件包的许可证。

示例:

"license": "MIT"

keywords

此属性包含与软件包功能相关的关键字数组。

示例:

"keywords": ["email","machine learning","ai"
]

这有助于人们在浏览相似的软件包或浏览 https://www.npmjs.com/ 网站时找到你的软件包。

description

此属性包含了对软件包的简短描述。

示例:

"description": "NodeJS中文网入门教程"

如果要将软件包发布到 npm,则这个属性特别有用,人们可以知道该软件包是干啥用的。

repository

此属性指定了此程序包仓库所在的位置。

示例:

"repository": "github:nodejscn/node-api-cn",

注意 github 前缀。 其他流行的服务商还包括:

"repository": "gitlab:nodejscn/node-api-cn",
"repository": "bitbucket:nodejscn/node-api-cn",

可以显式地设置版本控制系统:

"repository": {"type": "git","url": "https://github.com/nodejscn/node-api-cn.git"
}

也可以使用其他的版本控制系统:

"repository": {"type": "svn","url": "..."
}

main

设置软件包的入口点。

当在应用程序中导入此软件包时,应用程序会在该位置搜索模块的导出。

示例:

"main": "src/main.js"

private

如果设置为 true,则可以防止应用程序/软件包被意外发布到 npm 上。

示例:

"private": true

scripts

可以定义一组可以运行的 node 脚本。

示例:

"scripts": {"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js","start": "npm run dev","unit": "jest --config test/unit/jest.conf.js --coverage","test": "npm run unit","lint": "eslint --ext .js,.vue src test/unit","build": "node build/build.js"
}

这些脚本是命令行应用程序。 可以通过调用 npm run XXXXyarn XXXX 来运行它们,其中 XXXX 是命令的名称。 例如:npm run dev

可以为命令使用任何的名称,脚本也可以是任何操作。

dependencies

设置作为依赖安装的 npm 软件包的列表。

当使用 npm 或 yarn 安装软件包时:

npm install <PACKAGENAME>
yarn add <PACKAGENAME>

该软件包会被自动地插入此列表中。

示例:

"dependencies": {"vue": "^2.5.2"
}

devDependencies

设置作为开发依赖安装的 npm 软件包的列表。

它们不同于 dependencies,因为它们只需安装在开发机器上,而无需在生产环境中运行代码。

当使用 npm 或 yarn 安装软件包时:

npm install --save-dev <PACKAGENAME>
yarn add --dev <PACKAGENAME>

该软件包会被自动地插入此列表中。

示例:

"devDependencies": {"autoprefixer": "^7.1.2","babel-core": "^6.22.1"
}

engines

设置此软件包/应用程序要运行的 Node.js 或其他命令的版本。

示例:

"engines": {"node": ">= 6.0.0","npm": ">= 3.0.0","yarn": "^0.13.0"
}

browserslist

用于告知要支持哪些浏览器(及其版本)。 Babel、Autoprefixer 和其他工具会用到它,以将所需的 polyfill 和 fallback 添加到目标浏览器。

示例:

"browserslist": ["> 1%","last 2 versions","not ie <= 8"
]

此配置意味着需要支持使用率超过 1%(来自 CanIUse.com 的统计信息)的所有浏览器的最新的 2 个主版本,但不含 IE8 及更低的版本。

(查看更多)

命令特有的属性

package.json 文件还可以承载命令特有的配置,例如 Babel、ESLint 等。

每个都有特有的属性,例如 eslintConfigbabel 等。 它们是命令特有的,可以在相应的命令/项目文档中找到如何使用它们。

软件包版本

在上面的描述中,已经看到类似以下的版本号:〜3.0.0^0.13.0。 它们是什么意思,还可以使用哪些其他的版本说明符?

该符号指定了软件包能从该依赖接受的更新。

鉴于使用了 semver(语义版本控制),所有的版本都有 3 个数字,第一个是主版本,第二个是次版本,第三个是补丁版本,详见规则。

还可以在范围内组合以上大部分内容,例如:1.0.0 || >=1.1.0 <1.2.0,即使用 1.0.0 或从 1.1.0 开始但低于 1.2.0 的版本。

5. package-lock.json 文件

在版本 5 中,npm 引入了 package-lock.json 文件。

那是什么?您可能知道 package.json 文件,它更常见并且存在的时间更长。

该文件旨在跟踪被安装的每个软件包的确切版本,以便产品可以以相同的方式被 100% 复制(即使软件包的维护者更新了软件包)。

这解决了 package.json 一直尚未解决的特殊问题。 在 package.json 中,可以使用 semver 表示法设置要升级到的版本(补丁版本或次版本),例如:

  • 如果写入的是 〜0.13.0,则只更新补丁版本:即 0.13.1 可以,但 0.14.0 不可以。
  • 如果写入的是 ^0.13.0,则要更新补丁版本和次版本:即 0.13.10.14.0、依此类推。
  • 如果写入的是 0.13.0,则始终使用确切的版本。

无需将 node_modules 文件夹(该文件夹通常很大)提交到 Git,当尝试使用 npm install 命令在另一台机器上复制项目时,如果指定了 语法并且软件包发布了补丁版本,则该软件包会被安装。 ^ 和次版本也一样。

如果指定确切的版本,例如示例中的 0.13.0,则不会受到此问题的影响。

可能是你,或者是其他人,会在某处尝试通过运行 npm install 初始化项目。

因此,原始的项目和新初始化的项目实际上是不同的。 即使补丁版本或次版本不应该引入重大的更改,但还是可能引入缺陷。

package-lock.json 会固化当前安装的每个软件包的版本,当运行 npm install时,npm 会使用这些确切的版本。

这个概念并不新鲜,其他编程语言的软件包管理器(例如 PHP 中的 Composer)使用类似的系统已有多年。

package-lock.json 文件需要被提交到 Git 仓库,以便被其他人获取(如果项目是公开的或有合作者,或者将 Git 作为部署源)。

当运行 npm update 时,package-lock.json 文件中的依赖的版本会被更新。

示例

这是在空文件夹中运行 npm install cowsay 时获得的 package-lock.json 文件的示例结构:

{"requires": true,"lockfileVersion": 1,"dependencies": {"ansi-regex": {"version": "3.0.0","resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.
0.0.tgz","integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="},"cowsay": {"version": "1.3.1","resolved": "https://registry.npmjs.org/cowsay/-/cowsay-1.3.1.tgz"
,"integrity": "sha512-3PVFe6FePVtPj1HTeLin9v8WyLl+VmM1l1H/5P+BTTDkM
Ajufp+0F9eLjzRnOHzVAYeIYFF5po5NjRrgefnRMQ==","requires": {"get-stdin": "^5.0.1","optimist": "~0.6.1","string-width": "~2.1.1","strip-eof": "^1.0.0"}},"get-stdin": {"version": "5.0.1","resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.
1.tgz","integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g="},"is-fullwidth-code-point": {"version": "2.0.0","resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/
is-fullwidth-code-point-2.0.0.tgz","integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="},"minimist": {"version": "0.0.10","resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10
.tgz","integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="},"optimist": {"version": "0.6.1","resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz","integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=","requires": {"minimist": "~0.0.1","wordwrap": "~0.0.2"}},"string-width": {"version": "2.1.1","resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz","integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==","requires": {"is-fullwidth-code-point": "^2.0.0","strip-ansi": "^4.0.0"}},"strip-ansi": {"version": "4.0.0","resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz","integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=","requires": {"ansi-regex": "^3.0.0"}},"strip-eof": {"version": "1.0.0","resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz","integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="},"wordwrap": {"version": "0.0.3","resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz","integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="}}
}

安装 cowsay,其依赖于:

  • get-stdin
  • optimist
  • string-width
  • strip-eof

这些软件包还需要其他软件包,正如从 require 属性可以看到的:

  • ansi-regex
  • is-fullwidth-code-point
  • minimist
  • wordwrap
  • strip-eof

它们会按字母顺序被添加到文件中,每个都有 version 字段、指向软件包位置的 resolved 字段、以及用于校验软件包的 integrity 字符串。

6. 查看 npm 包安装的版本

若要查看所有已安装的 npm 软件包(包括它们的依赖包)的最新版本,则:

npm list

例如:

❯ npm list
/Users/joe/dev/node/cowsay
└─┬ cowsay@1.3.1├── get-stdin@5.0.1├─┬ optimist@0.6.1│ ├── minimist@0.0.10│ └── wordwrap@0.0.3├─┬ string-width@2.1.1│ ├── is-fullwidth-code-point@2.0.0│ └─┬ strip-ansi@4.0.0│   └── ansi-regex@3.0.0└── strip-eof@1.0.0

也可以打开 package-lock.json 文件,但这需要进行一些视觉扫描。

npm list -g 也一样,但适用于全局安装的软件包。

若要仅获取顶层的软件包(基本上就是告诉 npm 要安装并在 package.json 中列出的软件包),则运行 npm list --depth=0

❯ npm list --depth=0
/Users/joe/dev/node/cowsay
└── cowsay@1.3.1

也可以通过指定名称来获取特定软件包的版本:

❯ npm list cowsay
/Users/joe/dev/node/cowsay
└── cowsay@1.3.1

这也适用于安装的软件包的依赖:

❯ npm list minimist
/Users/joe/dev/node/cowsay
└─┬ cowsay@1.3.1└─┬ optimist@0.6.1└── minimist@0.0.10

如果要查看软件包在 npm 仓库上最新的可用版本,则运行 npm view [package_name] version

❯ npm view cowsay version1.3.1

7. 安装 npm 包的旧版本

可以使用 @ 语法来安装 npm 软件包的旧版本:

npm install <package>@<version>

示例:

npm install cowsay

以上命令会安装 1.3.1 版本(在撰写本文时)。

使用以下命令可以安装 1.2.0 版本:

npm install cowsay@1.2.0

全局的软件包也可以这样做:

npm install -g webpack@4.16.4

可能还有需要列出软件包所有的以前的版本。 可以使用 npm view <package> versions

❯ npm view cowsay versions[ '1.0.0','1.0.1','1.0.2','1.0.3','1.1.0','1.1.1','1.1.2','1.1.3','1.1.4','1.1.5','1.1.6','1.1.7','1.1.8','1.1.9','1.2.0','1.2.1','1.3.0','1.3.1' ]

8. 将所有 Node.js 依赖包更新到最新版本

当使用 npm install <packagename> 安装软件包时,该软件包最新的可用版本会被下载并放入 node_modules 文件夹中,并且还会将相应的条目添加到当前文件夹中存在的 package.jsonpackage-lock.json 文件中。

npm 会核计依赖,并安装这些依赖最新的可用版本。

假设要安装 cowsay,这是一个很酷的命令行工具,可以让母牛说话。

npm install cowsay 时,此条目会被添加到 package.json 文件中:

{"dependencies": {"cowsay": "^1.3.1"}
}

以下是 package-lock.json 的片段,为方便查看,在其中删除了嵌套的依赖:

{"requires": true,"lockfileVersion": 1,"dependencies": {"cowsay": {"version": "1.3.1","resolved": "https://registry.npmjs.org/cowsay/-/cowsay-1.3.1.tgz","integrity": "sha512-3PVFe6FePVtPj1HTeLin9v8WyLl+VmM1l1H/5P+BTTDkMAjufp+0F9eLjzRnOHzVAYeIYFF5po5NjRrgefnRMQ==","requires": {"get-stdin": "^5.0.1","optimist": "~0.6.1","string-width": "~2.1.1","strip-eof": "^1.0.0"}}}
}

现在,这两个文件告诉我们,已安装了 cowsay 的 1.3.1 版本,并且更新的规则是 ^1.3.1(这对于 npm 版本控制规则意味着 npm 可以更新到补丁版本和次版本:即 1.3.21.4.0、依此类推)。

  • 如果写入的是 〜0.13.0,则只更新补丁版本:即 0.13.1 可以,但 0.14.0 不可以。
  • 如果写入的是 ^0.13.0,则要更新补丁版本和次版本:即 0.13.10.14.0、依此类推。
  • 如果写入的是 0.13.0,则始终使用确切的版本。

如果有新的次版本或补丁版本,并且输入了 npm update,则已安装的版本会被更新,并且 package-lock.json 文件会被新版本填充。

package.json 则保持不变。

若要发觉软件包的新版本,则运行 npm outdated

以下是一个仓库中一些过时的软件包的列表,该仓库已很长时间没有更新:

这些更新中有些是主版本。 运行 npm update 不会更新那些版本。 主版本永远不会被这种方式更新,因为它们(根据定义)会引入重大的更改,npm 希望为你减少麻烦。

若要将所有软件包更新到新的主版本,则全局地安装 npm-check-updates 软件包:

npm install -g npm-check-updates

然后运行:

ncu -u

这会升级 package.json 文件的 dependenciesdevDependencies 中的所有版本,以便 npm 可以安装新的主版本。

现在可以运行更新了:

npm update

如果只是下载了项目还没有 node_modules 依赖包,并且想先安装新的版本,则运行:

npm install

9. 使用 npm 的语义版本控制

如果 Node.js 软件包中有一件很棒的事情,那就是它们都同意使用语义版本控制作为版本编号。

语义版本控制的概念很简单:所有的版本都有 3 个数字:x.y.z

  • 第一个数字是主版本。
  • 第二个数字是次版本。
  • 第三个数字是补丁版本。

当发布新的版本时,不仅仅是随心所欲地增加数字,还要遵循以下规则:

  • 当进行不兼容的 API 更改时,则升级主版本。
  • 当以向后兼容的方式添加功能时,则升级次版本。
  • 当进行向后兼容的缺陷修复时,则升级补丁版本。

该约定在所有编程语言中均被采用,每个 npm 软件包都必须遵守该约定,这一点非常重要,因为整个系统都依赖于此。

为什么这么重要?

因为 npm 设置了一些规则,可用于在 package.json 文件中选择要将软件包更新到的版本(当运行 npm update 时)。

规则使用了这些符号:

  • ^
  • ~
  • >
  • >=
  • <
  • <=
  • =
  • -
  • ||

这些规则的详情如下:

  • ^: 只会执行不更改最左边非零数字的更新。 如果写入的是 ^0.13.0,则当运行 npm update 时,可以更新到 0.13.10.13.2 等,但不能更新到 0.14.0 或更高版本。 如果写入的是 ^1.13.0,则当运行 npm update 时,可以更新到 1.13.11.14.0 等,但不能更新到 2.0.0 或更高版本。
  • ~: 如果写入的是 〜0.13.0,则当运行 npm update 时,会更新到补丁版本:即 0.13.1 可以,但 0.14.0 不可以。
  • >: 接受高于指定版本的任何版本。
  • >=: 接受等于或高于指定版本的任何版本。
  • <=: 接受等于或低于指定版本的任何版本。
  • <: 接受低于指定版本的任何版本。
  • =: 接受确切的版本。
  • -: 接受一定范围的版本。例如:2.1.0 - 2.6.2
  • ||: 组合集合。例如 < 2.1 || > 2.6

可以合并其中的一些符号,例如 1.0.0 || >=1.1.0 <1.2.0,即使用 1.0.0 或从 1.1.0 开始但低于 1.2.0 的版本。

还有其他的规则:

  • 无符号: 仅接受指定的特定版本(例如 1.2.1)。
  • latest: 使用可用的最新版本。

10. 卸载 npm 软件包

若要卸载之前在本地安装(在 node_modules 文件夹使用 npm install <package-name>)的软件包,则从项目的根文件夹(包含 node_modules 文件夹的文件夹)中运行:

npm uninstall <package-name>

如果使用 -S--save 标志,则此操作还会移除 package.json 文件中的引用。

如果程序包是开发依赖项(列出在 package.json 文件的 devDependencies 中),则必须使用 -D--save-dev 标志从文件中移除:

npm uninstall -S <package-name>
npm uninstall -D <package-name>

如果该软件包是全局安装的,则需要添加 -g--global 标志:

npm uninstall -g <package-name>

例如:

npm uninstall -g webpack

可以在系统上的任何位置运行此命令,因为当前所在的文件夹无关紧要。

Node.js 官网入门教程(二) npm(安装、包版本、卸载、npx)、package.json(scripts、devDependencies)package-lock.json(语义版本规则符号相关推荐

  1. Node.js 官网入门教程(一) CommonJS 模块规范、Node.js REPL、console、CLI、exports

    Node.js 官网入门教程(一) CommonJS 模块规范.Node.js REPL.console.CLI.exports 文章目录 Node.js 官网入门教程(一) CommonJS 模块规 ...

  2. React.js 官网入门教程 分离文件 操作无法正常显示HelloWord

    对着React官网的教程练习操作,在做到分离文件练习时,按照官网步骤来却怎么也无法正常显示HelloWord. 经测试,html文件中内容改为: <!DOCTYPE html> <h ...

  3. 2021最新Node.js官网安装教程,配置环境变量(图文详细)

    打开官网 Node.js官网 ,选择自己的版本,这里我使用的是Windows64位的,下载.msi安装包 下载之后,双击运行 点击next下一步 勾选同意,点击Next下一步 选择安装路径,这里我选择 ...

  4. React 官网入门教程 - 井字棋小游戏

    刚刚开始学习 React,跟着官网的小教程做了一遍,还做了一些代码的精简和修改 官网教程地址:点击跳转到官网 最终效果: import React from 'react' import ReactD ...

  5. node.js学习总结:node.js的内置模块,模块化,npm与包 express,前后端身份认证 JWT认证机制

    node.js学习总结 什么是node.js node.js的内置模块 fs系统模块 path路径模块 http模块 模块化 npm与包 express express路由 express+mysql ...

  6. node js官网下载地址

    2019独角兽企业重金招聘Python工程师标准>>> https://nodejs.org/en/download/ 转载于:https://my.oschina.net/CeSh ...

  7. Apache Ignite的Node.js客户端使用入门

    为什么80%的码农都做不了架构师?>>>    介绍 Ignite原生提供了若干种主要编程语言的支持,最近,还通过瘦客户端技术对其它的编程语言提供了支持,其中在2.7版本中新增加的瘦 ...

  8. 如何哄骗文艺青年安装Node.js? 将网易云音乐灰色歌曲变亮

    Node.js是一门编程语言, 是世界上最流行的编程语言之一, 而一门语言的流行程度往往取决于, 它的好玩库多不多? 而 Node.js 的好玩库真的是超多, 即使是爱听网易云的文艺青年也会爱上它, ...

  9. Three.js零基础入门教程(2023版本)

    1. threejs文件包下载和目录简介 在正式学习Three.js之前,先做一些必要的准备工作,具体说就是下载threejs官方文件包,threejs官方文件包提供了很多有用的学习资源. Three ...

最新文章

  1. julia有 pytorch包吗_有了Julia语言,深度学习框架从此不需要计算图
  2. linux expect 输入密码,shell脚本无密码登录 expect的使用方法详解
  3. 怎么用mysql来统计消费金额限制_mysql——用户消费行为分析
  4. 从命令行修改你的Mac DNS(主要在在线恢复mac系统不能上网时候使用)
  5. 【行业报告】基于社交图谱关系的反欺诈产品应用——青云
  6. EasyUI中菜单Menu的简单使用
  7. Spring MVC 3.2.2 +easyui 返回JSON数据格式
  8. 基坑计算理论m法弹性支点法_人工冲孔轻型井点在基坑降水工程中的应用
  9. 使用Java EE的ManagedExecutorService异步执行事务
  10. MySQL优化的一些基础
  11. k-means 聚类过程演示
  12. 程序员面试金典 - 面试题 17.26. 稀疏相似度(哈希map)
  13. python爬虫架构设置_Python爬虫进阶三之Scrapy框架安装配置
  14. 2018年上半年读者最喜爱的异步新书TOP50
  15. 学习patch命令打补丁,diff命令制作补丁
  16. hihocoder 1457 : 后缀自动机四·重复旋律7(后缀自动机+拓扑序BFS)
  17. 数字图像处理matlab 版下载,数字图像处理(MATLAB版)
  18. 震旦188e扫描_震旦ad188打印机无法扫描怎么处理
  19. 配置ouster雷达过程
  20. ARM Cortex 详解

热门文章

  1. 5G(3)---全球第一个5G标准发布_5g标准谁制定_5g标准有哪些
  2. PS网页设计教程XVI——在PS中创建一个摩登实验室风格的网页设计
  3. Android数据持久化保存--File
  4. Mars3D开发基础学习:glTF小模型
  5. C++经典算法题-兔子增长题
  6. http 4xx,5xx Server error
  7. 华硕vm510l拆电池图解_华硕vm510l的拆机教程详解 参数报价
  8. 会声会影导出视频跳帧一卡一卡解决办法
  9. 小程序之修改单条数据
  10. android studio int转,Android Studio Flavors的妙用(转)