认识nodejs
什么是 node.js
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时(运行环境)
浏览器引擎
渲染引擎:用于解释翻译和运行 html + css (通常指的浏览器引擎就是指的渲染引擎)
js 引擎:浏览器用于编译运行 js 的工具,一个 js 代码的执行器
作用:浏览器引擎是用于解析翻译和渲染页面的工具,主要用于解释翻译 html css j
js和nodejs的区别
js 是一门非阻塞的单线程语言 js 依赖于浏览器(因为浏览器内部它内置了 js 引擎! 正因为有了 js 引擎,浏览器就可以执行 js 代码)
Node.js 应用程序运行于单个主线程中,具有线程安全性。Node.js 在其标准库中提供了一组异步的 I/O 原生功能(用以防止 JavaScript 代码被阻塞),并且 Node.js 中的库通常是使用非阻塞的范式编写的(从而使阻塞行为成为例外而不是规范)。
区别:
①node.js 没有 BOM 和 DOM(不支持浏览器环境下所提供的一些api)
②浏览器环境下不支持CommonJS语法规范 报错
③都能正常的识别运行ECMA规范的代码
BOM (browser object model) 浏览器的对象模型
node.js 不能通过 js 控制浏览器(因为 node.js 不是浏览器)
DOM (document object model) 文档的对象模型
node.js 不能直接渲染页面(因为不是浏览器,没有 html 文档)
浏览器不认识 node.js 内置模块的代码
语法规范
CommonJs 和 EcmaScript 都是语法和规范
CommonJs 规定 node.js 模块化的语法规范,讲模块化时,再具体解释
EcmaScript (简称 ES)规定了 js 浏览器中的语法,也是 node.js 的语法
开发者常说的 ES5,ES6 就是 js 的语法版本,通常新版本会支持新语法特性。如:ES6 中支持 `let` 关键字,还支持 `lamda` 表达式(俗称:箭头函数,箭头方法等)
nodejs的作用
做服务器、做脚本工具(例如:一件迁移文件,一键发布代码等)
全局变量
全局变量:任何代码中,任何的作用域都能访问得到的变量称为全局变量
nodejs环境下的全局变量:
nodejs下的顶层对象 global 或者 globalThis , 在nodejs中没有window
引入模块:require
控制台对象:console
当前脚本所在的目录路径:__dirname
当前脚本的绝对路径:__filename
进程对象:process
console.log(process.pid) // pid表示当前进程的id号
console.log(process.env) // 当前计算机的环境对象
console.log(process.argv) // 获取执行当前脚本时传入的额外参数列表
内置模块
模块:一个第三方封装好的一个工具箱,开箱即用
模块可以从使用途径上大致的分为: 内置模块 和 第三方模块
内置模块:下载nodejs时,所携带的模板,由nodejs官方提供的
第三方(非官方):第三方的模块,同样具备独立的功能和特性,开箱即用
使用时的区别:
1.官方的内置模快在使用前不需要下载!直接引入使用即可
2.第三方的模块在使用其必须要先进行下载,通过npm方式或者其他方式,下载后才能引入该模块并使用
path
p ==> 路径字符串
获取传入的路径字符串中的目录路径: console.log(path.dirname(p))
文件全称:path.basename(p)
扩展名:path.extname(p)
结合路径(连接):path.join()
处理文件路径:resolve 函数(相当于模拟了 cmd 读取路径的过程)
eg:onsole.log(path.resolve('c:/abc', 'd:/demo', 'ok', 'hello.js'))
os(系统模块)
os模块(系统模块):用于查询当前系统的相关信息
cpus() 返回的一个当前系统的cpu内核数
一般用:os.cpus().length
查看当前系统架构信息:os.arch()
查看当前的系统平台 类型:os.platform()
events(事件模块)
事件模块:管理事件
通过事件模块创建一个事件发射器,实例对象:
const eventEmitter = new events.EventEmitter()
// 通过on方法绑定一个自定义事件,
eventEmitter.on('say', () => {
console.log('say hello!')
})
// 通过js代码触发say事件
setTimeout(() => {
// 触发say事件
eventEmitter.emit('say')
}
, 2000)
assert(断言模块)
断言: 下一个结论! 判断一个结论是否正确,如果 断言失败,则断言模块会自动抛出一个错误!断言之后的代码无法正常执行!
可用于:断言一个表达式的真假、除法函数(除数不能为0)、判断对象的结构数据是否一样等
assert.ok() 等价于 assert()
eg:assert.ok(sex === 'female','性别不是male')
cluster(集群)
含义:一个事物的多个重复个体形成的群落
集群的作用:集群模块可以让js代码在多个cpu核心上运行多个副本 可以更好的利用cpu,同时执行多份代码
node.js 的集群模块就是创建应用集群用的,多个相同的应用程序也能组成应用程序集群
集群中有主从的概念 :主程序 、 从程序
![](https://img-blog.csdnimg.cn/img_convert/e8bd769e2e720afd9ec563962647cfb0.png)
接受输入数据
浏览器输入api: prompt()
nodejs中的输入:
const readline = new require('readline').createInterface({
//指定输入流
input:process.stdin,
//指定输出流
output:process.stdout
})
readline.question('请输入你的名字:',(answer)=>{
console.log(answer)
// .....
// 关闭输入流
readline.close()
})
获取脚本运行时的额外参数
查看版本号:process.argv.includes('-v')
全局安装:process.argv.includes('-g')
异步
异步:程序的执行不需要等待上一次执行的结果
同步:程序需要等待,需要基于上一次执行的结果
单线程的语言如何避免主线程被阻塞的问题:为了解决阻塞,提出了异步的代码,通过回调函数
缺点:回调在解决异步问题的同时,会产生一个比较严重的问题,回调次数多了! 产生了回调地狱!
总结:(有回调不一定是异步,异步一定有回调) 回调函数可以解决异步问题,但是不代表所有的回调都是解决异步问题!
回调地域
回调地域特点:(代码呈大于符号)
1.阅读极其不变
2.逻辑无法理顺
3.代码扩展性差
Promise
作用:Promise用来更好的解决异步问题
new Promise 创建一个Promise的实列对象
这个实列对象创建完成后,会立即调用构造时传入的回调函数
resolve 是一个变量 用于接受成功后所需要执行的回调函数
reject 是一个变量 用于接受失败后或者抛出异常时所需要执行的回调函数
![](https://img-blog.csdnimg.cn/img_convert/3d3442d2cc740258a538d69f106e0ce6.png)
promise的状态
(一旦promis的状态被确定后,无法更改!)
成功状态 resolve 执行then方法中的回调函数
错误状态 reject 执行cathc方法中的回调函数
3.等待状态 pending
链式调用
then方法的返回值:默认是一个新的promise实列对象,该对象的状态基于前一个promise对象的状态
catch:它一般放在链式调用的末尾! 只写一次,catch可以捕获到它之前的所有promis的错误
promise实列对象上存在三个方法:then catch finally
promise的静态方法
静态方法: 只能由类自身调用的方法称为静态方法
1.Promise.resolve() 返回值 :是一个成功状态的promise实列对象
2.Promise.reject() 返回值 :是一个失败状态的promise实列对象
3.Promise.all([promises]):
all