简介
Node.js 是一个开源和跨平台的 JavaScript 运行时环境。
主要用于创建网络服务器 - 但不仅限于此。
NPM 包管理器简介
安装包
npm
是 Node.js 的标准包管理器。
如果一个项目有一个 package.json
文件,通过运行
npm install
它将在 node_modules
文件夹中安装项目所需的所有内容,如果它不存在则创建它。
你还可以安装特定的包,通过运行
npm install <package-name>
更新包
npm update
npm
将检查所有包是否有满足你的版本控制约束的更新版本。
你也可以指定要更新的单个包:
npm update <package-name>
版本控制
你可以安装特定版本的软件包,通过运行
npm install <package-name>@<version>
运行任务
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
npm 将软件包安装到哪里
当使用 npm
安装软件包时,可以执行两种安装类型:
- 本地安装
- 全局安装
默认安装
默认情况下,当输入 npm install
命令时,软件包会被安装到当前文件树中的 node_modules
子文件夹下。npm
还会在当前文件夹中存在的 package.json
文件的 dependencies
属性中添加 安装的包。
全局安装
使用 -g
标志可以执行全局安装:
npm install -g
npm
不会将软件包安装到本地文件夹下,而是使用全局的位置。
全局的位置到底在哪里?
npm root -g
命令会告知其在计算机上的确切位置。
在 macOS 或 Linux 上,此位置可能是 /usr/local/lib/node_modules
。 在 Windows 上,可能是 C:\Users\YOU\AppData\Roaming\npm\node_modules
。
package-lock.json 文件
package.json
文件是项目的清单。它是用于工具的配置中心。 它也是 npm
和 yarn
存储所有已安装软件包的名称和版本的地方。
在 package.json 中,可以使用 semver 表示法设置要升级到的版本(补丁版本或次版本),例如:
- 如果写入的是
〜0.13.0
,则只更新补丁版本:即0.13.1
可以,但0.14.0
不可以。 - 如果写入的是
^0.13.0
,则要更新补丁版本和次版本:即0.13.1
、0.14.0
、依此类推。 - 如果写入的是
0.13.0
,则始终使用确切的版本。
package-lock.json
会固化当前安装的每个软件包的版本,当运行 npm install
时,npm
会使用这些确切的版本。
当运行 npm update
时,package-lock.json
文件中的依赖的版本会被更新。
使用 npm 的语义版本控制
语义版本控制的概念很简单:所有的版本都有 3 个数字:x.y.z
。
- 第一个数字是主版本。
- 第二个数字是次版本。
- 第三个数字是补丁版本。
当发布新的版本时,不仅仅是随心所欲地增加数字,还要遵循以下规则:
- 当进行不兼容的 API 更改时,则升级主版本。
- 当以向后兼容的方式添加功能时,则升级次版本。
- 当进行向后兼容的缺陷修复时,则升级补丁版本。
该约定在所有编程语言中均被采用,每个 npm
软件包都必须遵守该约定,这一点非常重要,因为整个系统都依赖于此。
因为 npm
设置了一些规则,可用于在 package.json
文件中选择要将软件包更新到的版本(当运行 npm update
时)。
规则使用了这些符号:
^
~
>
>=
<
<=
=
-
||
这些规则的详情如下:
^
: 只会执行不更改最左边非零数字的更新。 如果写入的是^0.13.0
,则当运行npm update
时,可以更新到0.13.1
、0.13.2
等,但不能更新到0.14.0
或更高版本。 如果写入的是^1.13.0
,则当运行npm update
时,可以更新到1.13.1
、1.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
: 使用可用的最新版本。
卸载 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 全局或本地的软件包
本地和全局的软件包之间的主要区别是:
- 本地的软件包 安装在运行
npm install <package-name>
的目录中,并且放置在此目录下的node_modules
文件夹中。 - 全局的软件包 放在系统中的单独位置(确切的位置取决于设置),无论在何处运行
npm install -g <package-name>
。
通常,所有的软件包都应本地安装。
这样可以确保计算机中可以有数十个应用程序,并且如果需要,每个应用程序都可以运行不同的版本。
更新全局软件包会使所有的项目都使用新的版本,这可能会导致维护方面的噩梦,因为某些软件包可能会破坏与其他依赖项的兼容性等。
所有的项目都有自己的软件包本地版本,即使这看起来有点浪费资源,但与可能产生的负面影响相比也很小。
可能已经在系统上安装了一些全局软件包。 可以通过在命令行上运行以下命令查看:
npm list -g --depth 0
如何从 Node.js 读取环境变量
Node.js 的 process
核心模块提供了 env
属性,它承载了进程启动时设置的所有环境变量。
如果你的 node 项目中有多个环境变量,你也可以在你的项目根目录下创建一个 .env
文件,然后在运行时使用 dotenv 包加载它们。
# .env file
USER_ID="239482"
USER_KEY="foobar"
NODE_ENV="development"
在你的 js 文件中
require('dotenv').config();
process.env.USER_ID; // "239482"
process.env.USER_KEY; // "foobar"
process.env.NODE_ENV; // "development"