深入浅出nodeJs笔记前三章 下载本文

内容发布更新时间 : 2024/11/19 5:30:12星期一 下面是文章的全部内容请认真阅读。

第一章 node简介

诞生:Ryan Dahl 2009年3月宣布创建基于v8的轻量级库,5月发布初版 最初基于linux系统,2011年7月发布windows版本

选择javascript:设计高性能web服务器的要点:事件驱动、非阻塞I/O

事件驱动:javascript做两件事:操作DOM和操作BOM,什么时候干?需要干的时候干。什么时候需要干?事件被触发的时候。即在事件被触发之前,所有的结构被静态的呈现出来,在事件触发之后,动态的行为发生,重新产生新的静态结构,事件与状态构成了事件驱动开发的基本要素。

非阻塞I/O:js单线程,通过回掉函数达到非阻塞的目的,非阻塞就是程序会一直按顺序执行,直到所有代码执行完毕,当遇到需要等待即异步函数的时候,直接跳过,等同步队列执行完,再来执行。

为什么叫node:开始起名为web.js,单纯作为web服务器使用,随着发展,构建了服务器,客户端,命令行工具等,发展为一个强制不共享任何资源的单线程、单进程的系统,为构建大型分布式应用提供基础设施,目标是构建快速的可伸缩的网络应用平台。通过通信协议构建许多node,每个node进程都是构建这个网络应用的一个节点。 对javascript的意义:

Node与浏览器对比

Chrome Node JavaScript HTML JavaScript 解释 / 编译 V8引擎 Webkit引擎 V8引擎 中间层(libuv) 中间层 …….. …….. 硬盘 显卡 硬盘 显卡 网卡 网卡 Node与浏览器运行机理相同,是浏览器在协议栈另一边的倒影。Node打破了javascript只能在浏览器中运行的局面,前后端环境统一,降低了前后端转换的代价。 特点: 异步的I/O;同步io任务耗时是所有任务耗时之和,异步优势显而易见。

事件与回掉函数;事件编程轻量级,松耦合,只关注事物点。 单线程;不需要向多线程那样在意状态同步问题,不会有死锁存在 缺点:无法利用多核cpu,错误引起整个应用退出,

大量计算调用cpu会导致无法异步调用io(child_process)

跨平台:基于libuv实现跨平台

第二章 模块机制

1. B/S与C/S

C/S:即Client/Server,客户机/服务器模式。

两层:客户机和服务器两层,第一层,在客户机系统上结合了界面显示

与业务逻辑;第二层,通过网络结合了数据库服务器。

服务器 客户机 数据请求 数据库管理系统 特 点:如果用户要使用的话,需要下载客户端,安装后就可以使用 优缺点:界面和操作可以很丰富;两层传输,安全性高;只有一层交互,

响应速度快。一般在局域网中,适用面窄;需安装,用户群固定;升级成本高,发生一次升级,所有程序都需要更新。

B/S:全称为Browser/Server,即浏览器/服务器结构。

三层:表现层主要完成用户和后台的交互及最终查询结果的输出功能;

逻辑层主要是利用服务器完成客户端的应用逻辑功能;

数据层主要是接受客户端请求后独立进行各种运算。

表 现 层

业 务 逻 辑 层

数 据 访 问 层

My SQL oracle SQL 优缺点:无需安装客户端,有浏览器即可; 架构在广域网上,交互性强;

更新迭代方便,只需更新服务器即可。跨浏览器适配问题;中间层较多,速度和安全性问题;请求响应的交互模式,需要刷新页面,不友好。

架构形式:

客户端-服务器-数据库;

客户端-web服务器-应用服务器-数据库

客户端-负载均衡器(Nginx)-中间服务器(Node)-应用服务器-数据库

2. JavaScript发展历程

工具类库-〉组件库-〉前端框架-〉前端应用(不断抽象类化的过程) 暴露的问题:缺乏模块。通过script方式引入代码杂乱无章。 Javascript规范:CommomJs

3. CommonJs规范

Javascript缺陷:没有模块系统;标准库较少;没有统一标准接口;缺乏包

管理系统。

CommonJs目的:希望javascript能够在任何地方运行。使javascript能编

写服务端应用程序,命令行工具,桌面应用程序,混合应用。

Node借鉴了commonJs的modules规范。 规范:引用:require();定义:exports;模块标识:小驼峰命名的字符患/路径; 导出:在node中,一个文件就是一个模块,模块中存在module对象,它代表模块本身,exports是module的属性。 Require module module Exports var math = require (‘math’) exports.add = function(){ exports.increment = (val) =>{ var sum=0, i=0, args= arguments, Math.add() l = args.length; } while(i

4. Node模块实现

node加载模块三步骤:路径分析 文件定位 编译执行 node模块分类:核心模块 文件模块

核心模块:node提供,在node源码编译中编译进了二进制执行文件,在node启动时,部分加载到内存中,不需要文件定位和编译执行,并且在路径分析中优先判断,加载速度最快

文件模块:运行时动态加载,需完成三步骤,速度比核心模块慢

模块缓存加载策略:node对引入过的模块进行缓存,缓存的是编译和执行之后的对象。

路径分析与模块定位:modules.paths,与js作用域链查找方式相似,逐级查找直到查找到文件。文件标示符不包含扩展名,按照.js 、.json、.node的顺序依次补足扩展名尝试。

模块编译:按照不同扩展名采用不同载入方式

.js 通过fs模块同步读取后编译执行。

.node,c++编写的扩展文件,通过dlopen()加载后编译生成文件 .json,通过fs模块同步读取后,用json.parse()返回结果 其余文件按js文件载入 5. 核心模块

编译成可执行文件过程中被编译进了二进制文件。分为javascript编写和c++编写两部分。C++编写的放在node项目src文件夹下,javascript编写的放在lib目录下。

Javascript核心模块的编译:转存为c/c++代码(v8附带的js2c.py工