Node.js
归纳
是一个可以让JS代码在服务器端运行的开发平台。php
一开始只是用于写高性能Web服务器的。前端
可是越写越大造成了生态,因而更名为Node.js。node
- 他只是一个平台,而不是一种独立的语言。
- 轻量级架构,Java、php等须要运行在服务器上,而Node.js不须要架设在任何服务器软件之上。
特色
- 单线程
- 对服务器的要求低,这就限制了她只能作小型微型应用。
- 和事件驱动联合起来,使得在宏观上看起来是多线程。
- 一个8G内存的服务器能够同时处理超过4万用户的链接。
- 例如:张三和李四,张三先启动服务器,张三正在作某件事情,李四的请求来了,先把张三的语法终止,把李四的请求放到一个事件循环当中,放过以后,继续作张三的事情。
- 非阻塞I/O
- 当在访问数据库取得数据的时候,须要一段时间,在传统的单线程处理机制中,在返回了访问数据库代码以后,整个线程都将暂停下来,等待数据库返回结果。也就是说,I/O阻塞了代码的执行,极大地下降了程序的执行效率。
- 事件驱动
Node.js当中全部的I/O都是异步的,都是回调函数套用回调函数。web
适合作什么?
特色
- 善于I/O,不善于计算。
- Node.js适合与web socket配合,开发长链接的实时交互应用程序。
- 天生异步。
适用场景
- 网站开发
- IM即时通信
- API
- Http Proxy
- 前端构建工具(npm)
- 跨平台打包工具
- 写操做系统(NodeOS)
- 命令行工具
- 反向代理
- 。。。
Node.js不是全能的
- 不适合开发一些银行、证券、电信等一些刚并发场景的开发。
- 适合一些A轮、B轮的开发。
缩短发送请求到响应的时长
- 发送请求快一点(客户端网速决定)
- 响应快一点(服务器带宽、CDN加速…)
- 服务器请求任务快一点(多线程)
- 服务器从磁盘读取/写入数据到数据库快一点
- 磁盘的读取速度有上限
- 分布式
- 矩阵式
- 刀片式
- …式
V8引擎
一款专门对JS语言进行解释和执行的流程虚拟机数据库
只要V8引擎可以嵌入到不一样的宿主环境中,那么就能够用JS语言来写各类不一样领域的应用。npm
起初的做用:
用于Chrome浏览器解析JS脚本。json
引擎的优点:
- 强大的编译和快速执行效率
- 性能很是好
- 历史包袱轻,没有同步I/O
- 强大的事件驱动机制
Node模块化开发
CommonJS规范
- 从文件角度来看,每一个JS文件就是一个模块
- 从结构上来看,多个JS文件之间能够相互require
- 在Node.js中,一个模块中定义的变量、函数等,都只能在这个文件内部有效,当须要今后文件外部引用这些变量、函数时,必须使用exports进行暴露。使用者经过require引用。
模块标识
当咱们使用require()引入外部模块时,使用的就是模块标识浏览器
- 内建模块
- 文件模块
- 核心模块
- 由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