Node.js
概括
是一个能够让JS代码在服务器端运行的开发平台。
一开始只是用于写高性能Web服务器的。
但是越写越大形成了生态,于是改名为Node.js。
- 他只是一个平台,而不是一种独立的语言。
- 轻量级架构,Java、php等需要运行在服务器上,而Node.js不需要架设在任何服务器软件之上。
特点
- 单线程
- 对服务器的要求低,这就限制了她只能做小型微型应用。
- 和事件驱动联合起来,使得在宏观上看起来是多线程。
- 一个8G内存的服务器可以同时处理超过4万用户的连接。
- 例如:张三和李四,张三先启动服务器,张三正在做某件事情,李四的请求来了,先把张三的语法终止,把李四的请求放到一个事件循环当中,放过之后,继续做张三的事情。
- 非阻塞I/O
- 当在访问数据库取得数据的时候,需要一段时间,在传统的单线程处理机制中,在返回了访问数据库代码之后,整个线程都将暂停下来,等待数据库返回结果。也就是说,I/O阻塞了代码的执行,极大地降低了程序的执行效率。
- 事件驱动
Node.js当中所有的I/O都是异步的,都是回调函数套用回调函数。
适合做什么?
特点
- 善于I/O,不善于计算。
- Node.js适合与web socket配合,开发长连接的实时交互应用程序。
- 天生异步。
适用场景
- 网站开发
- IM即时通讯
- API
- Http Proxy
- 前端构建工具(npm)
- 跨平台打包工具
- 写操作系统(NodeOS)
- 命令行工具
- 反向代理
- 。。。
Node.js不是全能的
- 不适合开发一些银行、证券、电信等一些刚并发场景的开发。
- 适合一些A轮、B轮的开发。
缩短发送请求到响应的时长
- 发送请求快一点(客户端网速决定)
- 响应快一点(服务器带宽、CDN加速…)
- 服务器请求任务快一点(多线程)
- 服务器从磁盘读取/写入数据到数据库快一点
- 磁盘的读取速度有上限
- 分布式
- 矩阵式
- 刀片式
- …式
V8引擎
一款专门对JS语言进行解释和执行的流程虚拟机
只要V8引擎能够嵌入到不同的宿主环境中,那么就可以用JS语言来写各种不同领域的应用。
起初的作用:
用于Chrome浏览器解析JS脚本。
引擎的优势:
- 强大的编译和快速执行效率
- 性能非常好
- 历史包袱轻,没有同步I/O
- 强大的事件驱动机制
Node模块化开发
CommonJS规范
- 从文件角度来看,每个JS文件就是一个模块
- 从结构上来看,多个JS文件之间可以相互require
- 在Node.js中,一个模块中定义的变量、函数等,都只能在这个文件内部有效,当需要从此文件外部引用这些变量、函数时,必须使用exports进行暴露。使用者通过require引用。
模块标识
当我们使用require()引入外部模块时,使用的就是模块标识
- 内建模块
- 底层是由C++编写
- 文件模块
- 由用户自己创建的模块
- 核心模块
- 由node引擎提供的模块
- 由node_modules提供的模块
exports和require怎么来的?
函数参数
每一个js文件都是一个node模块,同时也是一个匿名自调函数。
当node在执行模块中的代码时,他会首先在代码的最顶部,添加如下代码:
function (exports, require, module, __filename, __dirname){}
然后在最低端,添加}
。
So:
模块中的代码都是包装在一个函数中执行的,并且在函数执行的同时传递了5个实参。
5个实参
- exports
- 该对象用来将函数内部的局部变量或局部函数暴露到外部。
- requires
- 用来引入外部的模块。
- module
- 代表的是当前模块本身,exports就是module的属性;
- 我们既可以用exports导出,也可以用module.exports导出
- __filename
- 当前模块的完整路径
- __dirname
- 当前模块所在文件夹的完整路径。
exports和module.exports的区别
值类型和引用类型
两者区别
exports只能使用.语法来向外暴露内部变量。exports.xxx = xxx;
module.exports既可以通过.
语法,也可以直接赋值一个对象。
包和包管理器
package
概念:
Common.JS的报规范允许我们将一组相关的模块组合到一起,形成一组完整的工具,这组工具就叫做包。
组成
实际上就是一个压缩文件,解压之后还原为目录
- package.json包描述文件
- bin 可执行二进制
- lib js代码
- doc 文档
- test 单元测试
package.json
描述包的相关信息,以供外部读取分析。
它是一个JSON格式的文件。
PS:该文件禁止添加注释。
NPM包管理工具
Node Package Manager
如果页面中引入node_modules中某个模块,有先从当前目录引入,如果没有,则往上级查找,直到根目录。
CNPM
淘宝镜像官网
在官网可以找到使用方式:
https://npm.taobao.org