NodeJS读书笔记
安装Node.js
1. 3m安装法
安装nvm(Linux)
curl -o- https://raw.githubusercontent.com/creationx/nvm/v0.29.0/install.sh | bash
cat ~/.bashrc | grep nvm
export NVM DIR="/home/ubuntu/.nvm"
[-s "$NVM_DIR_nvm.sh"] && . "$NVM_DIR/nvm.sh" #This loads nvm ...
source /.bashrc
检查是否安装成功
nvm --version
0.29.0
如果是zsh,则需要手动将环境变量放置到~/.zshrc里
% vi ~/.zshrc
export NVM DIR="/home/ubuntu/.nvm"
[-s "$NVM_DIR_nvm.sh"] && . "$NVM_DIR/nvm.sh"
% source ~/.zshrc
查看可安装版本
% nvm ls-remote
iojs-v1.0.0
iojs-v1.0.1
...
v14.15.0 (Latest LTS: Fermium)
v15.0.0
...
一般奇数版本(如: v5.x、v7.x)都是尝试性版本,包括正在测试新特性
偶数版本(如: v4.x、v10.x)为LTS版本,即稳定版本。可用于线上生产环境。
nvm相关命令
nvm install stable 安装最新稳定版 node
nvm install 安装指定版本,如:安装v4.4.0,nvm install v4.4.0
nvm uninstall 删除已安装的指定版本,语法与install类似
nvm use 切换使用指定的版本node #当设置了default默认版本后,该设置则为暂时性设置,即退出控制台再重进时则会恢复到默认版本
nvm ls 列出所有安装的版本
nvm alias default 如: nvm alias default v11.1.0 #设置默认版本,当设置默认版本后每次登陆控制台均是该版本的nodeJS,即永久默认使用
nvm reinstall-packages [版本号] #通过nvm切换node版本后,此时先前版本npm安装的全局模块可能在当前版本的环境并没安装,所以为了方便一键安装,nvm提供了该命令使得可以在当前版本的环境下一键[拷贝]同样的全局模块。
npm使用
npm打包在node解释器中,随node同时安装。
理论: npm2.x时期依赖结构为树形结构,npm3.x为扁平化结构+树形结构管理,npm5.x开始时为npm v3优化版,当有多个版本依赖时改为树形结构,并加入lock来锁定依赖版本。
npm init #初始化项目
npm init --yes #初始化项目并配置都为默认
npm init -y #同init --yes
npm list #列举已安装的模块(本地非全局)
npm ls #同list
npm list -g #列举已安装的全局模块
npm ls -g #同list -g
npm install #从package.json的依赖管理中自动安装依赖模块(dependences和devDependences)
npm install [模块名] #安装模块的最新版
npm install [模块名]@[版本号] #安装指定版本的模块
npm i [模块名] #同install
npm i [模块名]@[版本号] #install指定版本的模块安装
npm uninstall [模块名] #卸载模块
npm un [模块名] #同uninstall
npm i或install [模块名@版本号] -g #安装全局模块,会自动配置至环境变量中
npm i或install [模块名@版本号] -D #安装模块,并将依赖记录到devDependences中
npm i或install [模块名@版本号] -s #安装模块,并将依赖记录到devependences中
npm i或install [模块名@版本号] -P #同-s
npm run [指令别名] #执行在package.json中script下的对应执行指令
npm config set registry https://registry.npm.taobao.org #配置淘宝源镜像
npm ls [模块名] #查看指定模块的版本
npm list --depth=0 #查看运行时依赖项
npm list [模块名] #同ls,查看指定模块的版本
#模块发布相关---------
npm adduser #设置npm的账户
npm publish #发布模块
npm root --global<-g> #查看本地全局模块安装位置
npm view [模块名] version #查看指定模块在npm仓库中最新可用的版本
package.json
管理配置文件相关
{
"name": "koa-framework", // 项目名称
"version": "1.0.0", // 项目版本
"description": "", // 项目描述
"main": "index.js", // 项目入口文件,即在require中只写到项目文件夹时默认的入口js
"scripts": { // npm script脚本命令,即:在script下都可以使用npm run xxx来运行执行对应的脚本命令。键名为npm run后面的命令,值为真实执行的命令
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [], // 项目关键字,用于发布到npm仓库时用户可以通过关键字搜索到发布的项目
"author": "", // 项目作者
"license": "ISC", // 项目采用的许可证类型
"private": true, // 如果设置为 true,则可以防止应用程序/软件包被意外发布到 npm 上。
"dependencies": { // 项目相关的依赖
"koa": "^2.13.0"
},
"devDependencies": {}, // 设置作为开发依赖安装的 npm 软件包的列表。它们不同于 dependencies,因为它们只需安装在开发机器上,而无需在生产环境中运行代码。通过npm i -D xxx或者npm intall --dev xxx插入此列表中。
"engines": { // 设置此软件包/应用程序要运行的 Node.js 或其他命令的版本。
"node": ">= 6.0.0",
"npm": ">= 3.0.0",
"yarn": "^0.13.0"
},
"browserslist": { // 用于告知要支持哪些浏览器(及其版本)。babel会用到该配置
"> 1%", // 此配置意味着需要支持使用率超过 1%(来自 CanIUse.com 的统计信息)的所有浏览器的最新的 2 个主版本,但不含 IE8 及更低的版本。
"last 2 versions",
"not ie <= 8"
}
}
nodeJS使用了 semver(语义版本控制),所有的版本都有 3 个数字,第一个是主版本,第二个是次版本,第三个是补丁版本,具有以下规则:
-
~
: 如果写入的是〜0.13.0
,则只更新补丁版本:即0.13.1
可以,但0.14.0
不可以。即只能更新第三个补丁版本(最小版本)。 -
^
: 如果写入的是^0.13.0
,则要更新补丁版本和次版本:即0.13.1
、0.14.0
、依此类推。即能更新主版本后面的次版本与最小版本(补丁版本)。 -
*
: 如果写入的是*
,则表示接受所有的更新,包括主版本升级。 -
>
: 接受高于指定版本的任何版本。 -
>=
: 接受等于或高于指定版本的任何版本。 -
<=
: 接受等于或低于指定版本的任何版本。 -
<
: 接受低于指定版本的任何版本。 - 无符号: 仅接受指定的特定版本。
-
latest
: 使用可用的最新版本。
还可以在范围内组合以上大部分内容,例如:1.0.0 || >=1.1.0 <1.2.0,即使用 1.0.0 或从 1.1.0 开始但低于 1.2.0 的版本。
nrm使用
nrm用于统一管理npm镜像(npm mirror manager)。
安装nrm
npm i nrm -g #全局安装nrm
nrm相关
nrm list或者ls #查看可用镜像列表
nrm use [镜像名] #切换并使用镜像
nrm add [镜像名] [镜像URL地址] #加入新的镜像并命名,之后使用指定镜像名即可
nrm del [镜像名] #删除指定镜像
注:使用add时指定的是存在的镜像名,貌似会覆盖原有镜像地址。
2. Yarn的使用
Yarn是代替npm包管理器的最优方案。
安装Yarn
#1.下载安装脚本安装
curl -o- -L https://yarnpkg.com/install.sh | bash
#2.使用npm全局安装
npm i --global<-g> yarn
初始化yarn工程
#1.初始化方式
yarn init
#2.直接默认设置初始化
yarn init -y
添加依赖
#添加依赖
yarn add [依赖名]
#添加指定版本的依赖
yarn add [依赖名]@[版本号]
#添加指定标签的依赖
yarn add [依赖名]@[Tag名]
更新依赖
#更新依赖
yarn upgrade [依赖名]
#更新指定版本的依赖
yarn upgrade [依赖名]@[版本号]
#更新指定标签的依赖
yarn upgrade [依赖名]@[Tag名]
通过配置文件(package.json)安装项目的依赖
yarn
#或者
yarn install
安装全局模块
等同于npm的安装全局模块
yarn global add [依赖包名]
移除依赖
yarn remove [依赖名]
#移除全局依赖
yarn global remove [全局依赖名]
单台服务器上多个实例
pm2的使用
#安装pm2
npm i pm2 -g
#使用mp2开始多实例
pm2 start [入口js] -i 0 --name [实例名]
#注: -i -> --instance 即要开启的实例, 后面跟实例数量
多模块管理器Lerna
用于管理具有多个程序包的JavaScript项目的工具。Lerna是一种工具,可以优化使用git和npm管理多包存储库的工作流程。
Lerna使用
#需要全局安装
npm i -g lerna
#初始化git仓库
git init lerna-repo
#进入到创建的仓库并初始化lerna仓库
cd lerna-repo && lerna init
#此时仓库的目录结构如下:
#lerna-repo/
#packages/
#package.json
#lerna.json
#模块发布命令,一定要注意npm源是npmjs.org,否则无法发布成功
lerna publish
NodeJS API部分
process内置对象
nodeJS中内置了process对象用于处理应用进程、运行环境相关的操作。
-
使用process对象编码形式关闭应用
// 由于process为内置对象,所以不需要采用require("xxxx")的方式引入。 process.exit(1); // 调用process对象的exit方法,参数可选。如果填写了参数,则在node应用停止后会将该参数值返回。此处返回1,一般返回0则表示正常停止。 // 如果调用时不传入退出码,则可以在调用exit方法前调用exitCode设置退出码。 process.exitCode = 1; // 由于在调用该方式时会强制应用停止运行,所以再运行I/O、网络请求时调用该方法,相关的操作会强制停止,可能会到之后文件丢失、网络丢包等不友好的情况。 // 所以可以采用如下方式通知进程进行应用退出: process.kill(process.pid, "SIGTERM"); // 参数传入要退出的应用pid号,和发送给经常的退出信号 // 这里的退出信号遵循POSIX, SIGTERM表示应用程序在处理完最后的操作后停止应用进程。 // 如果传入的信号为SIGKILL,则与调用exit方法一样,强制中断。此时应用的所有正在执行的操作直接中断并结束应用进程。
-
获取系统环境变量
// process内置对象中提供了env属性,可用来获取系统中设置的环境变量数组 console.log(process.env); // 获取NODE_ENV变量 console.log(process.env.NODE_ENV); // 这里有个坑,默认操作系统并没有该变量,所以很多文章中说默认为development是不正确的,如果想要获取development默认值,则需要设置环境变量,或者通过node应用设置临时环境变量,例如在终端: 执行export NODE_ENV=development后,则设置了一个临时默认的NODE_ENV环境变量。此时调用process.env.NODE_ENV后就会获取设置的该临时环境变量。
-
从命令行接受参数
# 命令行参数格式如下: # 方式1 node app.js param1 param2 # 方式2 node app.js arg1=param1 arg2=param2 # 方式3 node app.js --arg1=param1 --arg2=param2
在node中,命令行参数同样可以使用
process
内置对象来获取// process中有argv属性用来获取nodejs命令行传入的参数 console.log(process.argv); /* 打印出的结果如下: [ '/Users/linux/.nvm/versions/node/v10.15.0/bin/node', '/Users/linux/Workspace/node/从命令行接收参数1.js' ] process对象打印出来的是一个命令行参数的数组. 数组中第一个元素是node命令所在的全路径,第二个元素是当前执行的脚步全路径,之后的元素即为从命令行中传入的参数. */ // 命令行参数通过方式1和方式2传入时,直接可以通过argv数组的下标获取 // 命令行参数通过方式3传入时(即参数键值对前加两个破折号),可以使用第三方模块minimist进行获取, // 方法如下: // 第一步, 安装minimist模块: npm i -S minimist // 第二步,导入minimist模块进行参数解析: const minimist = require("minimist"); const args = minimist(process.argv.slice(2)); // 自定义参数是从数组下标的2位置开始 // 第三步,获取参数值,例如获取键是arg1的值: let arg1 = args["arg1"];