node学习笔记01

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:交互解释器)

  1. Read:读取用户输入,解析输入了JavaScript数据结构并存储在内存中。
  2. Eval:执行输入的数据结构
  3. Print:输出结果
  4. Loop:循环操作以上步骤直到用户退出
1
2
$ node
>
  • 简单的表达式运算

    1
    2
    3
    $ node
    > 2 + 4
    6
  • 使用变量

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ node
    > x = 10
    10
    > var y = 20
    undefined
    > x + y
    30
    > console.log("Hello World")
    Hello World
    undefined
  • 多行表达式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    > for(let i = 0;i < 5;i++){
    ... console.log("i:" + i);
    ... }
    i:0
    i:1
    i:2
    i:3
    i:4
    undefined

    ...三个点的符号是系统自动生成的,回车换行后即可,Node会自动检测是否为连续的表达式。

  • 下划线变量

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    > let a = 10
    undefined
    > let b = 10
    undefined
    > a + b
    20
    > let sum = _
    undefined
    > console.log(sum)
    20
    undefined

REPL命令

  1. ctrl + c 退出当前终端
  2. ctrl + c 按下两次 退出Node REPL
  3. .exit 退出Node REPL
  4. process.exit() 退出REPL
  5. ctrl + d 退出Node REPL
  6. up/down键 查看输入的历史命令
  7. tab键 列出当前命令
  8. .help 列出使用命令
  9. .break 退出多行表达式
  10. .clear 退出多行表达式
  11. .save filename 保存当前的Node REPL会话到指定文件
  12. .load filename 载入当前Node REPL会话的文件内容

执行脚本字符串

1
$ node -e "console.log('Hello World')"

执行脚本文件

1
2
3
$ node index.js
$ node path/index.js
$ node path/index

查看帮助

1
$ node --help

全局作用域成员

全局对象

  • 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),即任务不是马上执行,而而是插在任务队列的尾部,等到前面的任务运行完后再执行。
  • 提高代码的响应能力

回调函数的设计

  • 对于一个函数如果需要定义回调函数:

    • 回调函数一定作为参数的最后一个参数出现:
    1
    2
    function foo (name,age,callback) {}
    function bar (value,callback1,callback2){}
    • 回调函数的第一个参数默认接收错误信息,第二个参数采食真正的回调数据(便于外界获取调用的错误情况):
    1
    2
    3
    4
    foo("Jack",18,(error,data) => {
    if(error) throw error;
    console.log(data);
    })
  • Node统一约定:强调错误优先

    • 因为之后的操作大多数都是异步的方式,无法通过try…catch捕获异常。
    • 错误优先的回调函数,第一个参数为上一步的错误信息。

什么是异步

比如说:setTimeout()、$.ajax()

异步操作回调

  • 由于系统永远不知道用户什么时候会输入内容,所以代码不能永远停在一个地方
  • Node中的操作方式就是以异步回调的方式解决无状态的问题。

异步回调的问题

callback hell

1
2
3
4
5
6
7
8
9
foo1(function(){
foo2(function(){
foo3(function(){
foo4(function(){
foo5()
})
})
})
})

相比较与传统的代码:

  • 异步事件驱动的代码不容易阅读
  • 不容易调试
  • 不容易维护

非阻塞I/O

什么是I/O

  • I/O:input/output
  • 可以理解为输入到输出之间的转化过程
    • 敲击键盘(输入)看到编辑器中多出字符(输出)
    • 移动鼠标(输入)看到光标移动(输出)

事件驱动和非阻塞机制

事件驱动和非阻塞机制

  1. Node平台将一个任务连同该任务的回调函数放到一个事件循环系统中
  2. 事件循环高效地管理系统线程池同时高效执行每一个任务
  3. 当任务执行完成过后自动执行回调函数

Node中的异步I/O

node中的异步I/O

非阻塞的优势

  • 提高代码的响应效率
  • 充分利用单核CPU的优势
  • 改善I/O的不可预测带来的问题

进程与线程

什么是进程

  • 每一个正在运行的应用程序都称之为进程
  • 每一个应用程序至少有一个进程
  • 进程是用来给应用程序提供一个运行的环境
  • 进程是操作系统为应用程序分配资源的一个单位

什么是线程

  • 用来执行应用程序中的代码
  • 在一个进程内部,可以有很多线程
  • 在一个线程内部,同时只可以干一件事
  • 而且传统的开发方式大部分是I/O阻塞的
  • 所以需要多线程来更好地利用硬件资源
  • 给人带来的一种错觉:线程越多越好

本文结束,感谢阅读。

本文作者:melody0z
本文链接:https://melodyvoid.github.io/Node/node-learning-notes-01.html
欢迎转载,转载请注明文本链接

坚持原创技术分享,您的支持将鼓励我继续创作!