Node.js简介
• Node.js是一个能够在服务器端运行JavaScript的开放源代码、 跨平台JavaScript运行环境。
• Node采用Google开发的V8引擎运行js代码,使用事件驱动、 非阻塞和异步I/O模型等技术来提高性能,可优化应用程序的传输量和规模。
• Node大部分基本模块都用JavaScript编写。在Node出现之前, JS通常作为客户端程序设计语言使用,以JS写出的程序常在用户的浏览器上运行。
• Node主要用于编写像Web服务器一样的网络应用,这和PHP 和Python是类似的。
• 但是Node与其他语言最大的不同之处在于,PHP等语言是阻 塞的而Node是非阻塞的。
• Node是事件驱动的。开发者可以在不使用线程的情况下开发 出一个能够承载高并发的服务器。其他服务器端语言难以开发 高并发应用,而且即使开发出来,性能也不尽人意。
• Node正是在这个前提下被创造出来。
• Node把JS的易学易用和Unix网络编程的强大结合到了一起。
• Node.js允许通过JS和一系列模块来编写服务器端应用和网络 相关的应用。
• 核心模块包括文件系统I/O、网络(HTTP、TCP、UDP、DNS、 TLS/SSL等)、二进制数据流、加密算法、数据流等等。Node 模块的API形式简单,降低了编程的复杂度。
• 使用框架可以加速开发。常用的框架有Express.js、Socket.IO 和Connect等。Node.js的程序可以在Microsoft Windows、 Linux、Unix、Mac OS X等服务器上运行。
• Node.js也可以使用CoffeeScript、TypeScript、Dart语言,以 及其他能够编译成JavaScript的语言编程。
模块引用
• 在规范中,定义了require()方法,这个方 法接手模块标识,以此将一个模块引入到 当前运行环境中。
• 模块引用的示例代码: – var math = require('math');
模块定义
• 在运行环境中,提供了exports对象用于导 出当前模块的方法或者变量,并且它是唯 一的导出的出口。
• 在模块中还存在一个module对象,它代表 模块自身,而exports是module的属性。
• 在Node中一个文件就是一个模块。
exports.xxx = function() {};
module.exports = {};
模块标识
• 模块标识其实就是模块的名字,也就是传 递给require()方法的参数,它必须是符合 驼峰命名法的字符串,或者是以.、..开头的 相对路径、或者绝对路径。
• 模块的定义十分简单,接口也十分简洁。 每个模块具有独立的空间,它们互不干扰, 在引用时也显得干净利落。
Node的模块实现
• Node中虽然使用的是CommonJS规范,但是 其自身也对规范做了一些取舍。
• 在Node中引入模块,需要经历如下3个步骤: – 路径分析 – 文件定位 – 编译执行
• 在Node中,模块分为三类:一类是底层由 C++编写的内建模块,一类是Node提供的核 心模块;还有一类是用户编写的模块,称为文 件模块。
包 package
• CommonJS的包规范允许我们将一组相关 的模块组合到一起,形成一组完整的工具。
• CommonJS的包规范由包结构和包描述文 件两个部分组成。
• 包结构 – 用于组织包中的各种文件
• 包描述文件 – 描述包的相关信息,以供外部读取分析
包结构
• 包实际上就是一个压缩文件,解压以后还 原为目录。符合规范的目录,应该包含如 下文件:
– package.json 描述文件
– bin 可执行二进制文件
– lib js代码
– doc 文档
– test 单元测试
包描述文件
• 包描述文件用于表达非代码相关的信息, 它是一个JSON格式的文件 – package.json, 位于包的根目录下,是包的重要组成部分。
• package.json中的字段
– name、description、version、keywords、 maintainers、contributors、bugs、 licenses、repositories、dependencies、 homepage、os、cpu、engine、builtin、 directories、implements、scripts、author、 bin、main、devDependencies。
NPM(Node Package Manager)
• CommonJS包规范是理论,NPM是其中一 种实践。
• 对于Node而言,NPM帮助其完成了第三 方模块的发布、安装和依赖等。借助NPM, Node与第三方模块之间形成了很好的一个 生态系统。
NPM命令
• npm –v
– 查看版本
• npm
– 帮助说明
• npm search 包名
– 搜索模块包
• npm install 包名
– 在当前目录安装包
• npm install 包名 –g
– 全局模式安装包
• npm remove 包名
– 删除一个模块
• npm install 文件路径
– 从本地安装
• npm install 包名 –registry=地址
– 从镜像源安装
• npm config set registry 地址
– 设置镜像源
Buffer(缓冲区)
• 从结构上看Buffer非常像一个数组,它的元 素为16进制的两位数。
• 实际上一个元素就表示内存中的一个字节。
• 实际上Buffer中的内存不是通过JavaScript 分配的,而是在底层通过C++申请的。
• 也就是我们可以直接通过Buffer来创建内存中的空间。
Buffer的操作
• 使用Buffer保存字符串
let str = "你好 nodejs";
let buf = Buffer.from(str , "utf-8");
• 创建指定大小的Buffer对象
let buf3 = Buffer.alloc(1024*8)
Buffer的转换
• Buffer与字符串间的转换
– 支持的编码:
• ASCII、UTF-8、UTF-16LE/UCS-2、Base64、 Binary、Hex
– 字符串转Buffer
• Buffer.from(str , [encoding]);
– Buffer转字符串
• buf.toString([encoding] , [start] , [end]);
写入操作
• 向缓冲区中写入字符串
– buf.write(string[, offset[, length]][, encoding])
• 替换指定索引位置的数据
– buf[index]
• 将指定值填入到缓冲区的指定位置
– buf.fill(value[, offset[, end]][, encoding])
读取操作
• 将缓冲区中的内容,转换为一个字符串返回
– buf.toString([encoding[, start[, end]]])
• 读取缓冲区指定索引的内容
– buf[index]
其他操作
• 复制缓冲区
– buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])
• 对缓冲区切片
– buf.slice([start[, end]])
• 拼接缓冲区
– Buffer.concat(list[, totalLength])
fs(文件系统)
• 在Node中,与文件系统的交互是非常重要 的,服务器的本质就将本地的文件发送给 远程的客户端
• Node通过fs模块来和文件系统进行交互
• 该模块提供了一些标准文件访问API来打开、 读取、写入文件,以及与其交互。
• 要使用fs模块,首先需要对其进行加载 – const fs = require("fs");
同步和异步调用
• fs模块中所有的操作都有两种形式可供选择 同步和异步。
• 同步文件系统会阻塞程序的执行,也就是 除非操作完毕,否则不会向下执行代码。
• 异步文件系统不会阻塞程序的执行,而是 在操作完成时,通过回调函数将结果返回。