NodeJS学习笔记(备忘录)

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 <version>  安装指定版本,如:安装v4.4.0,nvm install v4.4.0

nvm uninstall <version>  删除已安装的指定版本,语法与install类似

nvm use <version>  切换使用指定的版本node #当设置了default默认版本后,该设置则为暂时性设置,即退出控制台再重进时则会恢复到默认版本

nvm ls  列出所有安装的版本

nvm alias default <version>  如: 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.10.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<install> --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"];
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335