Node简介
什么是Node
- Node 就是 JavaScript 语言在服务器端的运行环境
- 所谓“运行环境(平台)”有两层意思:
- 首先,JavaScript 语言通过 Node 在服务器运行,在这个意义上,Node 有点像 JavaScript 虚拟机;
- 其次,Node 提供大量工具库,使得 JavaScript 语言与操作系统互动(比如读写文件、新建子进程),在这个意义上, Node 又是 JavaScript 的工具库。
重点理解
- Node是一个JavaScript的运行环境(平台),不是一门语言,也不是JavaScript的框架;
- Node的实现结构;
- Node可以用来开发服务端应用程序,Web系统;
- 基于Node的前端工具集
Node.js的特点
Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js’ package ecosystem, npm, is the largest ecosystem of open source libraries in the world.
- 单线程
- 事件驱动(event-driven)
- 非阻塞I/O(non-blocking I/O)
Node命令的基本用法
进入REPL(Read Eval Print Loop:交互解释器)
- Read:读取用户输入,解析输入了JavaScript数据结构并存储在内存中。
- Eval:执行输入的数据结构
- Print:输出结果
- Loop:循环操作以上步骤直到用户退出
|
|
简单的表达式运算
123$ node> 2 + 46使用变量
12345678910$ node> x = 1010> var y = 20undefined> x + y30> console.log("Hello World")Hello Worldundefined多行表达式
123456789> for(let i = 0;i < 5;i++){... console.log("i:" + i);... }i:0i:1i:2i:3i:4undefined...
三个点的符号是系统自动生成的,回车换行后即可,Node会自动检测是否为连续的表达式。下划线变量
1234567891011> let a = 10undefined> let b = 10undefined> a + b20> let sum = _undefined> console.log(sum)20undefined
REPL命令
- ctrl + c 退出当前终端
- ctrl + c 按下两次 退出Node REPL
- .exit 退出Node REPL
- process.exit() 退出REPL
- ctrl + d 退出Node REPL
- up/down键 查看输入的历史命令
- tab键 列出当前命令
- .help 列出使用命令
- .break 退出多行表达式
- .clear 退出多行表达式
- .save filename 保存当前的Node REPL会话到指定文件
- .load filename 载入当前Node REPL会话的文件内容
执行脚本字符串
|
|
执行脚本文件
|
|
查看帮助
|
|
全局作用域成员
全局对象
- global: 类似于客户端JavaScript运行环境中的window
- process:用于获取当前的Node进程信息,一般用于获取变量之类的信息
- console:Node中内置的console模块,提供操作控制台的输入输出功能,常见使用方法与客户端类似。
全局函数
- setInterval(callback,millisecond)
- clearInterval(timer)
- setTimeout(callback,millisecond)
- clearTimeout(timer)
- Buffer:Class
- 用于操作二进制数据
异步编程
异步操作
- Node采用Chrome V8引擎处理JavaScript脚本,V8最大特点就是单线程运行,一次只能运行一个任务。
- Node大量采用异步操作(asynchonous operation),即任务不是马上执行,而而是插在任务队列的尾部,等到前面的任务运行完后再执行。
- 提高代码的响应能力
回调函数的设计
对于一个函数如果需要定义回调函数:
- 回调函数一定作为参数的最后一个参数出现:
12function foo (name,age,callback) {}function bar (value,callback1,callback2){}- 回调函数的第一个参数默认接收错误信息,第二个参数采食真正的回调数据(便于外界获取调用的错误情况):
1234foo("Jack",18,(error,data) => {if(error) throw error;console.log(data);})Node统一约定:强调错误优先
- 因为之后的操作大多数都是异步的方式,无法通过try…catch捕获异常。
- 错误优先的回调函数,第一个参数为上一步的错误信息。
什么是异步
比如说:setTimeout()、$.ajax()
异步操作回调
- 由于系统永远不知道用户什么时候会输入内容,所以代码不能永远停在一个地方
- Node中的操作方式就是以异步回调的方式解决无状态的问题。
异步回调的问题
callback hell
|
|
相比较与传统的代码:
- 异步事件驱动的代码不容易阅读
- 不容易调试
- 不容易维护
非阻塞I/O
什么是I/O
- I/O:input/output
- 可以理解为输入到输出之间的转化过程
- 敲击键盘(输入)看到编辑器中多出字符(输出)
- 移动鼠标(输入)看到光标移动(输出)
事件驱动和非阻塞机制
- Node平台将一个任务连同该任务的回调函数放到一个事件循环系统中
- 事件循环高效地管理系统线程池同时高效执行每一个任务
- 当任务执行完成过后自动执行回调函数
Node中的异步I/O
非阻塞的优势
- 提高代码的响应效率
- 充分利用单核CPU的优势
- 改善I/O的不可预测带来的问题
进程与线程
什么是进程
- 每一个正在运行的应用程序都称之为进程
- 每一个应用程序至少有一个进程
- 进程是用来给应用程序提供一个运行的环境
- 进程是操作系统为应用程序分配资源的一个单位
什么是线程
- 用来执行应用程序中的代码
- 在一个进程内部,可以有很多线程
- 在一个线程内部,同时只可以干一件事
- 而且传统的开发方式大部分是I/O阻塞的
- 所以需要多线程来更好地利用硬件资源
- 给人带来的一种错觉:线程越多越好
本文结束,感谢阅读。
本文作者:melody0z
本文链接:https://melodyvoid.github.io/Node/node-learning-notes-01.html
欢迎转载,转载请注明文本链接