# Node 基础简介
# 介绍
Node.js 不是一种新语言而是一个平台,为 JavaScript 提供了浏览器之外的运行时环境。它提供了丰富的内置模块,包括 File System 模块、Net 模块、HTTP 模块、URL 模块、Process 模块等等。这些模块能够让 JavaScript 操作我们的计算机,建立 Web 服务器。
# node 环境下的相关操作 - 具体可参考 REPL 模块
首先,不带参数,直接执行 node
命令,可以开启 REPL
.help - 列出使用命令
.break - 退出多行表达式
.clear – 1、退出多行表达式 2、清除REPL运行环境的上下文对象中保存的所有变量和函数
.exit – 退出REPL运行环境
.save filename - 保存当前的 Node REPL 会话到指定文件
.load filename - 载入当前 Node REPL 会话的文件内容
ctrl + c:.break
ctrl + c (两次):.exit
ctrl + d:.exit
向上/向下 键 - 查看输入的历史命令
tab 键 - 查看当前作用域下的所有可用的方法
REPL(交互式解释器)
- R Read - 读取
- E Eval - 运算
- P Print - 打印输出
- L Loop - 重复
在 REPL 运行环境中使用下划线字符(_
)来访问最近使用的表达式,但是不意味着可以改变变量的值
# 模块系统
模块化,就是指代码具有模块结构,**整个应用可以自顶向下划分为若干个模块,每个模块彼此独立,代码不会相互影响。**模块化的目的是使代码可以更好地复用,从而支持更大规模的应用开发。
作用:为了更好组织、管理代码,nodejs 引入了模块
定义:一个文件就是一个独立的模块
特点:每个模块都有自己的独立作用域 - 模块作用域
扩展:作用域
- 全局作用域
- 函数作用域
- 块级作用域(es2015+)
- 模块作用域
# Node.js 核心模块
Node.js 内置的模块比较丰富,常用的主要是以下几个。
- File System 模块:这是操作目录和文件的模块,提供文件和目录的读、写、创建、删除、权限设置等等。
- Net 模块:提供网络套接字 socket,用来创建 TCP 连接,TCP 连接可以用来访问后台数据库和其他持久化服务。
- HTTP 模块:提供创建 HTTP 连接的能力,可以用来创建 Web 服务,也是 Node.js 在前端最常用的核心模块。
- URL 模块:用来处理客户端请求的 URL 信息的辅助模块,可以解析 URL 字符串。
- Path 模块:用来处理文件路径信息的辅助模块,可以解析文件路径的字符串。
- Process 模块:用来获取进程信息。
- Buffer 模块:用来处理二进制数据。
- Console 模块:控制台模块,同浏览器的 Console 模块,用来输出信息到控制台。
- Crypto 加密解密模块:用来处理需要用户授权的服务。
- Events 模块:用来监听和派发用户事件。
# 全局对象
全局对象 global,其最根本的作用是作为一个全局变量的宿主。 按照 ECMAScript 定义,满足以下条件的变量是全局变量:
- 在最外层定义的变量
- 全局对象的属性
- 隐式定义的变量(未定义直接赋值的变量)
在 Node.js 中你不可能在最外层定义变量,因为所有用户代码都是输入当前模块的,而模块本身不是最外层上下文。
process: 用于描述当前 Node.js 进程状态的对象,提供了一个与操作系统的简单接口。
- process.argv process.argv 属性返回一个数组,这个数组包含了启动 Node.js 进程时的命令行参数。 第一个元素为 process.execPath。即 Node.js 进程的可执行文件所在的绝对路径 第二个元素为当前执行的 JavaScript 文件路径。 剩余的元素为其他命令行参数。
node index.js 1991 name=chenfangxu --v "lalla"
[ '/usr/local/Cellar/node/7.9.0/bin/node',
'/Users/cfangxu/project/demo/myNEapp/site/index.js',
'1991',
'name=chenfangxu',
'--v',
'lalla' ]
- process.env:返回一个对象,成员为当前 Shell 的环境变量,比如 process.env.HOME 返回用户的主目录,process.env.PATH 环境变量 PATH
- process.platform:返回一个字符串,表示当前的操作系统,比如 Linux。
- process.version: Node 版本
# 方法
process.nextTick(callback) 为事件循环设置一项任务,Node.js 会在下次事件循环中调用 callback(具体的时间点是:在当前执行栈的尾部、下一次 Event Loop 之前执行)。因为一个 Node.js 进程只有一个线程,因此在任何时刻都只有一个事件在执行。如果这个事件占用了大量的 CPU 时间,执行事件循环中的下一个事件就需要等待很久,因此 Node.js 的一个编程原则就是尽量缩短每个事件的执行时间。process.nextTick()提供了一个这样的工具,可以把很复杂的工作拆散,编程一个个较小的事件。
process.chdir():切换工作目录到指定目录。
process.cwd():返回运行当前脚本的工作目录的路径。
process.exit([code]):退出当前进程。如果 code 未提供,此 exit 方法要么使用'success' 状态码 0,要么使用 process.exitCode 属性值,前提是此属性已被设置。 Node.js 在所有['exit']事件监听器都被调用了以后,才会终止进程。
console:用于提供控制台标准输出
console.log():向标准输出流打印字符并以换行符结束。
console.error():向标准错误流输出
console.trace(): 向标准错误流输出当前的调用栈
# 重点说一下字符串替换(浏览器和 Node.js 有些不一样)
在字符串中使用占位符,并且用传递给该方法的其他参数替换占位符,从而完成字符串的替换。
%s | 用字符串替换元素
%(d|i)| 用整数替换元素
%f | 用浮点数替换元素,使用%.1f 可以将浮点数格式化为小数点后只保留一位有效数字。也可以使用 %.nf 来指定小数点后保留 n 位数字。
%(o|O) | 元素作为一个对象来显示
%c | 应用提供的 CSS
- console.assert(value[, message][, ...args]) 一个简单的断言测试,验证 value 是否为真。 如果不为真,则抛出 AssertionError。 如果提供了 message,则使用 util.format() 格式化并作为错误信息使用。 注意:Node.js 中的 console.assert() 方法与在浏览器中的 console.assert() 方法的实现是不一样的。 具体地说,在浏览器中,用非真的断言调用 console.assert() 会导致 message 被打印到控制台但不会中断后续代码的执行。 而在 Node.js 中,非真的断言会导致抛出 AssertionError。
# util 实用模块
提供常用函数的集合,用于弥补核心 JavaScript 的功能过于精简不足。
- util.format(format[, ...args])
util.format() 方法返回一个格式化后的字符串,使用第一个参数作为一个类似 printf 的格式。
第一个参数是一个字符串,包含零个或多个占位符。 每个占位符会被对应参数转换后的值所替换。 支持的占位符有:
- %s - 字符串。
- %d - 数值(整数或浮点数)。
- %i - 整数。
- %f - 浮点数
- %j - JSON。如果参数包含循环引用,则用字符串 '[Circular]' 替换。
- %o - 一个对象的字符串,类似用 util.inspect() 并且 options { showHidden: true, depth: 4, showProxy: true }, 展示整个对象包括不可遍历的和 symbol 属性
- %O - 一个对象的字符串 类似用 util.inspect() 并且 options 为空 展示整个对象不包括不可遍历的和 symbol 属性
- %% - 单个百分号('%')。不消耗参数。
注意:
只有一个参数,不会格式化,而是直接返回字符串。
util.format('%% %s'); // '%% %s'
- util.inspect(object[, options])
- options
- showHidden 如果为 true,则 object 的不可枚举的符号与属性也会被包括在格式化后的结果中。 默认为 false。
- depth 指定格式化 object 时递归的次数。 这对查看大型复杂对象很有用。 默认为 2。 若要无限地递归则传入 null。
- colors 如果为 true,则输出样式使用 ANSI 颜色代码。 默认为 false。 颜色可自定义。
- customInspect 如果为 false,则 object 上自定义的 inspect(depth, opts) 函数不会被调用。 默认为 true。
- showProxy 如果为 true,则 Proxy 对象的对象和函数会展示它们的 target 和 handler 对象。 默认为 false。
- maxArrayLength 指定格式化时数组和 TypedArray 元素能包含的最大数量。 默认为 100。 设为 null 则显示全部数组元素。 设为 0 或负数则不显式数组元素。
- breakLength 一个对象的键被拆分成多行的长度。 设为 Infinity 则格式化一个对象为单行。 默认为 60。
# 文件系统 fs
fs 模块是文件操作的封装,它提供了文件的读取、写入、更名、删除、遍历目录、链接等 POSIX 文件系统的操作。 与其他模块不同,fs 模块中大部分的操作都提供了异步的和同步的两个版本。
注意: Node.js 的异步编程接口习惯是以函数的最后一个参数为回调函数,通常一个函数只有一个回调函数。回调函数的实际参数中第一个是 err,其余的参数是其他返回的内容。如果没有发生错误,err 的值会是 null 或 undefined,如果有错误发生,err 通常是 Error 对象的实例。
注意: 与同步 I/O 函数不同,Node.js 中的异步函数大多没有返回值。
- fs.open 方法中有参数 mode,用于创建文件时给文件指定权限,默认为 0o666。回调函数将会传递一个文件描述符 fd。 文件权限: 是 POSIX 操作系统中对文件读取和访问权限的规范,通常用一个八进制数来表示。例如 0o754 表示文件所有者的权限是 7(读、写、执行),同组的用户权限是 5(读,执行),其他用户的权限是 4(读),写成字符表示就是 -rwxr-xr--。 文件描述符: 是一个非负整数,表示操作系统内核为当前进程所维护的打开文件的记录表索引。
# 服务端开发需要懂的图
- 时序图
- 层级结构图