# 认识 Node.js

  • Node 是一个服务器端 JavaScript 解释器
  • Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境
  • Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效
  • Node.js 的包管理器 npm,是全球最大的开源库生态系统
  • Node.js 是一门动态语言,运行在服务端的 Javascript

# 版本介绍

  • 在命令窗口中输入 node -v 可以查看版本
  • 0.x 完全不技术 ES6
  • 4.x 部分支持 ES6 特性
  • 5.x 部分支持ES6特性(比4.x多些),属于过渡产品,现在来说应该没有什么理由去用这个了
  • 6.x 支持98%的 ES6 特性
  • 8.x 支持 ES6 特性

# 环境搭建

  • 下载安装文件 (opens new window)
  • 下载完后进行安装,建议安装到默认路径,注意不要有中文路径
  • 配置环境变量
  • 在命令窗口中输入 node -v,如果正常显示版本号则表示安装成功

# NVM管理Node版本

先安装一个 nvm( https://github.com/creationix/nvm )

$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.2/install.sh | bash

nvm 的全称是 Node Version Manager,之所以需要这个工具,是因为 Node.js 的各种特性都没有稳定下来,所以我们经常由于老项目或尝新的原因,需要切换各种版本。

安装完成后,你的 shell 里面应该就有个 nvm 命令了,调用它试试

$ nvm

当看到有输出时,则 nvm 安装成功。

安装 Node.js

使用 nvm 的命令安装 Node.js

$ nvm install 0.12

安装完成后,查看一下

$ nvm ls

这时候可以看到自己安装的所有 Node.js 版本,输出应如下:

(图1)

那个绿色小箭头的意思就是现在正在使用的版本,我这里是 v0.10.29。我还安装了 v0.11.14,但它并非我当前使用的版本。

如果你那里没有出现绿色小箭头的话,告诉 nvm 你要使用 0.12.x 版本

$ nvm use 0.12

然后再次查看,这时候小箭头应该出现了。

OK,我们在终端中输入

$ node

REPL(read–eval–print loop) 应该就出来了,那我们就成功了。

随便敲两行命令玩玩吧。

比如 > while (true) {},这时你的 CPU 应该会飚高。

完善安装

上述过程完成后,有时会出现,当开启一个新的 shell 窗口时,找不到 node 命令的情况。

这种情况一般来自两个原因

  1. shell 不知道 nvm 的存在

  2. nvm 已经存在,但是没有 default 的 Node.js 版本可用。

解决方式:

一、检查 ~/.profile 或者 ~/.bash_profile 中有没有这样两句

export NVM_DIR="/Users/YOURUSERNAME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm

没有的话,加进去。这两句会在 bash 启动的时候被调用,然后注册 nvm 命令。

二、调用 $ nvm ls

看看像不像上述图1中一样,有 default 的指向。

如果没有的话,执行 $ nvm alias default 0.12$ nvm ls

# Node.js 模块

模块系统是 Node.js 最基本也是最常用的。一般情况模块可分为四类:

  • 原生模块
  • 文件模块
  • 第三方模块
  • 自定义模块

# 自定义模块

  1. 创建模块(b.js)
//b.js
function FunA(){
    return 'Tom';
}
//暴露方法 FunA
module.exports = FunA;
  1. 加载模块(a.js)
//a.js
var FunA = require('./b.js');//得到 b.js => FunA
var name = FunA();// 运行 FunA,name = 'Tom'
console.log(name); // 输出结果

# module.exports

module.exports 就 Node.js 用于对外暴露,或者说对外开放指定访问权限的一个对象。如上面的案例,如果没有这段代码

module.exports = FunA;

那么 require('./b.js') 就会为 undefined。 一个模块中有且仅有一个 module.exports,如果有多个那后面的则会覆盖前面的。

# exports

exportsmodule 对象的一个属性,同时它也是一个对象。在很多时候一个 js 文件有多个需要暴露的方法或是对象,module.exports 又只能暴露一个,那这个时候就要用到 exports:

function FunA(){
    return 'Tom';
}

function FunB(){
    return 'Sam';
}

exports.FunA = FunA;
exports.FunB = FunB;
//FunA = exports,exports 是一个对象
var FunA = require('./b.js');
var name1 = FunA.FunA();// 运行 FunA,name = 'Tom'
var name2 = FunA.FunB();// 运行 FunB,name = 'Sam'
console.log(name1);
console.log(name2);

当然在引入的时候也可以这样写

//FunA = exports,exports 是一个对象
var {FunA, FunB} = require('./b.js');
var name1 = FunA();// 运行 FunA,name = 'Tom'
var name2 = FunB();// 运行 FunB,name = 'Sam'
console.log(name1);
console.log(name2);

# npm scripts

# NPM版本管理

npm -v

使用nrm管理npm版本

npm install -g nrm

执行命令nrm ls查看可选的源。

*npm ---- https://registry.npmjs.org/

cnpm --- http://r.cnpmjs.org/

taobao - http://registry.npm.taobao.org/

eu ----- http://registry.npmjs.eu/

au ----- http://registry.npmjs.org.au/

sl ----- http://npm.strongloop.com/

nj ----- https://registry.nodejitsu.com/

其中,带*的是当前使用的源,上面的输出表明当前源是官方源。

  1. 切换

如果要切换到taobao源,执行命令 nrm use taobao

  1. 增加

你可以增加定制的源,特别适用于添加企业内部的私有源,执行命令 nrm add <registry> <url>,其中reigstry为源名,url为源的路径。

nrm add registry http://registry.npm.frp.trmap.cn/
  1. 删除

执行命令nrm del <registry>删除对应的源。

  1. 测试速度

你还可以通过 nrm test 测试相应源的响应时间。

nrm test npm             

# 什么是 npm 脚本

npm 允许在package.json文件里面,使用scripts字段定义脚本命令。package.json 里面的scripts 字段是一个对象。它的每一个属性,对应一段脚本。定义在package.json里面的脚本,就称为 npm 脚本。

查看当前项目的所有 npm 脚本命令,可以使用不带任何参数的npm run命令。

# 使用

  • npm run 脚本名称
  • 如果是并行执行(即同时的平行执行),可以使用&符号。 npm run script1.js & npm run script2.js
  • 如果是继发执行(即只有前一个任务成功,才执行下一个任务),可以使用&&符号。npm run script1.js && npm run script2.js

# 简写形式

  • npm startnpm run start
  • npm stopnpm run stop
  • npm testnpm run test
  • npm restartnpm run stop && npm run restart && npm run start
阅读全文