记录青训营中Node方面的知识点
Node.js简介
Node.js是一个基于Google V8引擎,跨平台的Javascrpit运行环境
以下是推荐的版本管理工具
- n:npm全局的开源包,是依赖npm来全局安装,使用
- fnm:快速简单,兼容性支持 .node-version 和 .nvmrc文件
- nvm:独立的软件包,全程Node Version Manager
Node.js的特点
Node有3个特点
异步I/O
当Node.js执行I/O操作时,会在响应返回并恢复操作,而不是阻塞线程并浪费CPU循环等待 流程图如下
单线程
优点:
- 不用在意状态同步问题,不会发生**死锁**
- 没有线程上下文切换带来的性能开销
缺点:
- 无法利用多核CPU
- 错误会引起整个应用退出,健壮性不足
- 大量计算占用导致CPU,无法继续执行
跨平台
兼容Windows和(linux衍生)*nix平台,主要的得益于在操作系统和Node上层模块系统之间构建了一层平台架构
Node.js中的模块化机制
CommnJS规范
Node.js支持CommonJS模块规范,采用同步机制加载模块
//name.js
const Name = function(){
console.log('my name is yierya')
}
module.exports = {
Name
}
//index.js
const {name} require('./name.js')
name() //my name is yierya
expotts: 可以导出模块,是作为module的子方法require: 在当前模块引入其他模块,查看更多加载方式module: 包含当前模块的全部信息,创建模块等方法如module.exports__filename:当前模块的文件路径:解析后的绝对路径__dirname:存放当前模块的文件夹路径
npm包查询原则
//以引入一个lodash为例
require('lodash')
1.当前目录的 node_modules
2.如果没有,父级目录的node_modules
3.如果没有,沿着路径向上递归,直到根目录底下node_modules
4.找到之后会加载package.json main指向的文件,如果没有package.json则一次查找index.js,index.json,index.node
缓存机制
Node.js中存在缓存机制,会将读到的文件存放在require.cache中,缓存的原因是:同步加载
- 文件模块查找耗时,如果每次require都需要重新遍历查找,性能较差
- 在实际开发中,模块可能包含副作用代码
//有缓存
const mod1 = require('./foo');
const mod2 = require('./foo');
console.log(mod1 === mod2); //true
//无缓存
function requireUncached(module){
delete require.cache[require.resolve(module)];
return reuire(module);
}
const mod3 = requireUncached('./foo');
consolo.log(mod1 === mod3); false
其他模块化规范
AMD: 是RequireJS在推广过程中规范化产出,异步加载,推崇依赖前置CMD:是SeaJS在推广过程中规范化产出,异步加载,推崇就近依赖UMD:兼容AMD和CommonJS规范ES:语言层面的模块化规范,与环境无关,可借助babel编译,也就是俗称ES6中的ES
ES Modules
- ESM是在
ES6语言层面提出的一种模块化标准 - ESM中主要有
import,export两个关键字,不能console打印两个关键字
ES Modules和CommonJS的差别
-
CommonJS模块输出的是一个值的
拷贝,ESM模块输出的是值的引用 -
CommonJS模块是运行时加载,ESM模块是编译时输出(提前加载)
-
可以混用但是不建议(import commonjs||import中require)
部分常用模块介绍
npm介绍
NPM是Node.js中的包管理器,提供了安装,删除等其他命令来管理
输入npm init会在目录底下生产一个package.json文件
npm 设置源操作如下npm config set registry=你的源路径,推荐用nrm工具管理npm源
异步编程
callback
promise
Promise是一个具有四个状态的有限状态机,其中三个核心状态为Pending(挂起),Fulfilled(完成),Rejected(拒绝),以及还有一个未开始状态
Promise中的更多方法
async
它是基于Promise的语法糖,将 async 关键字加到函数申明中,可以告诉它们返回的是 promise,而不是直接返回值。此外,它避免了同步函数为支持使用 await 带来的任何潜在开销。
async function hello() {
return greeting = await Promise.resolve("Hello");
};
hello().then(alert);
event
发布订阅模式,Node.js内置evets模块 比如Htt server on('request')事件监听