Node.js是什么?
Node.js,或者 Node,是一个可以让 JavaScript 运行在服务器端的平台。它可以让 JavaScript 脱离浏览器的束缚运行在一般的服务器环境下,就像运行 Python、Perl、PHP、Ruby 程序一样。你可以用 Node.js 轻松地进行服务器端应用开发,Python、Perl、PHP、Ruby 能 做的事情 Node.js 几乎都能做,而且可以做得更好。
Node.js 是一个为实时Web(Real-time Web)应用开发而诞生的平台,它从诞生之初就充分 考虑了在实时响应、超大规模数据要求下架构的可扩展性。这使得它摒弃了传统平台依靠多线 程来实现高并发的设计思路,而采用了单线程、异步式I/O、事件驱动式的程序设计模型。这些 特性不仅带来了巨大的性能提升,还减少了多线程程序设计的复杂性,进而提高了开发效率。
Node.js 有着强大而灵活的包管 理器(node package manager,npm),目前已经有上万个第三方模块,其中有网站开发框架, 有 MySQL、PostgreSQL、MongoDB 数据库接口,有模板语言解析、CSS 生成工具、邮件、 加密、图形、调试支持,甚至还有图形用户界面和操作系统 API工具。
Node.js 不是一种独立的语言,与 PHP、Python、Perl、Ruby 的“既是语言也是平台” 不同。Node.js 也不是一个 JavaScript 框架,不同于 CakePHP、Django、Rails。Node.js 更不 是浏览器端的库,不能与 jQuery、ExtJS 相提并论。Node.js 是一个让 JavaScript 运行在服务 端的开发平台,它让 JavaScript 成为脚本语言世界的一等公民,在服务端堪与 PHP、Python、 Perl、Ruby 平起平坐。
Node.js 的 JavaScript 引擎是 V8,来自 Google Chrome 项目。V8 号称是目前世界上最快 的 JavaScript 引擎,经历了数次引擎革命,它的 JIT(Just-in-time Compilation,即时编译) 执行速度已经快到了接近本地代码的执行速度。Node.js 不运行在浏览器中,所以也就不存 在 JavaScript 的浏览器兼容性问题,你可以放心地使用 JavaScript 语言的所有特性。
Node.js 内建了 HTTP 服务器支持,也就是说你可以轻而易举地实现一个网站和服务器
的组合。
安装 Node.js
可以安装 node安装包
因为Node.js版本迭代特别快 采用nvm处理
安装nvm
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
查看Node.js版本 因为版本众多,只查看稳定版本
nvm ls-remote –lts
直接安装最新版的
nvm install node
安装指定版本
nvm isntall v6.9.4
安装node的过程已经安装包管理器 npm了
开始用Node.js编程
console.log(‘hello’); //保存为js格式 进入相关目录 node hello.js
命令行直接执行语句 node -e “语句”
直接node 进入 js的交互式shell
建立http服务器
Node.js 将“HTTP服务器”这一层抽离,直接面向浏览器用户
$ npm install -g supervisor
异步式I/O(非阻塞式I/O)与事件式编程
Node.js 最大的特点就是异步式 I/O(或者非阻塞 I/O)与事件紧密结合的编程模式。这 种模式与传统的同步式 I/O 线性的编程思路有很大的不同,因为控制流很大程度上要靠事件 和回调函数来组织,一个逻辑要拆分为若干个单元。
什么是阻塞(block)呢?线程在执行中如果遇到磁盘读写或网络通信(统称为 I/O 操作), 通常要耗费较长的时间,这时操作系统会剥夺这个线程的 CPU 控制权,使其暂停执行,同 时将资源让给其他的工作线程,这种线程调度方式称为 阻塞。当 I/O 操作完毕时,操作系统 将这个线程的阻塞状态解除,恢复其对CPU的控制权,令其继续执行。这种 I/O 模式就是通 常的同步式 I/O(Synchronous I/O)或阻塞式 I/O (Blocking I/O)。
异步式 I/O (Asynchronous I/O)或非阻塞式 I/O (Non-blocking I/O)则针对 所有 I/O 操作不采用阻塞的策略。当线程遇到 I/O 操作时,不会以阻塞的方式等待 I/O 操作 的完成或数据的返回,而只是将 I/O 请求发送给操作系统,继续执行下一条语句。当操作 系统完成 I/O 操作时,以事件的形式通知执行 I/O 操作的线程,线程会在特定时候处理这个 事件。为了处理异步 I/O,线程必须有事件循环,不断地检查有没有未处理的事件,依次予 以处理。
阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须通过多线程。而非阻塞 模式下,一个线程永远在执行计算操作,这个线程所使用的 CPU 核心利用率永远是 100%, I/O 以事件的方式通知。
模块module 和包 package
可以把包理解为实现某个功能模块的集合
创建和加载模块
文件和模块是一一对应的,换言之,一个 Node.js 文件就是一个模块,这个文件可能是 JavaScript 代码、JSON 或者编译过的 C/C++ 扩展
Node.js 提供了 exports 和 require 两个对 象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获 取模块的 exports 对象。
和创建对象的区别:require 不会重复加载模块,也就是说无论调用多少次 require,获得的模块都是同一个
覆盖exports
exports 本身仅仅是一个普通的空对象,即 {},它专门用来声明接口,本 质上是通过它为模块闭包1的内部建立了一个有限的访问接口。因为它没有任何特殊的地方, 所以可以用其他东西来代替,譬如我们上面例子中的 Hello 对象
创建包
包是在模块基础上更深一步的抽象,Node.js 的包类似于 C/C++ 的函数库或者 Java/.Net 的类库。它将某个独立的功能封装起来,用于发布、更新、依赖管理和版本控制。Node.js 根 据 CommonJS 规范实现了包机制,开发了 npm来解决包的发布和获取需求。
Node.js核心模块
全局对象与全局变量
JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可 以在程序的任何地方访问,即全局变量。在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性。
process
process 是一个全局变量,即 global 对象的属性。它用于描述当前 Node.js 进程状态 的对象,提供了一个与操作系统的简单接口
console
console 用于提供控制台标准输出,它是由 Internet Explorer 的 JScript 引擎提供的调试 工具,后来逐渐成为浏览器的事实标准。
常用工具util
util.inherits
util.inspect
事件驱动 events
events 是 Node.js 最重要的模块,没有“之一”,原因是 Node.js 本身架构就是事件式 的,而它提供了唯一的接口,所以堪称 Node.js 事件编程的基石
事件发射器
events.EventEmitter
error事件
继承 EventEmitter
文件系统 fs file system
fs.readFile
fs.readFileSync
fs.open
fs.read
HTTP服务器与客户端
HTTP 服务器
http.Server 是 http 模块中的 HTTP 服务器对象,用 Node.js 做的所有基于 HTTP 协 议的系统,如网站、社交应用甚至代理服务器,都是基于 http.Server 实现的。它提供了 一套封装级别很低的 API,仅仅是流控制和简单的消息解析,所有的高层功能都要通过它的 接口来实现。
http.ServerRequest
http.ServerResponse
HTTP 客户端
http.ClientRequest
http.ClientResponse
使用Node.js进行web开发
Express 框架
安装 npm install -g express
Node.js进阶
模块加载机制
- 核心模块
- 文件模块
异步编程模式下的控制流
Node.js的应用部署
Node.js的一些劣势
JavaScript高级特性
作用域 scope
闭包
对象
Node.js编程规范
缩进
行宽
语句分隔符
变量定义
变量名与属性名
函数
引号
关联数组的初始化
等号
命名函数
对象定义
继承