Node.js简介
Node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境。 Node采用Google开发的V8引擎运行js代码,使用事件驱动、非阻塞和异步I/O模型等技术来提高性能,可优化应用程序的传输量和规模。 Node大部分基本模块都用JavaScript编写。在Node出现之前,JS通常作为客户端程序设计语言使用,以JS写出的程序常在用 户的浏览器上运行。 目前,Node已被IBM、Microsoft、Yahoo!、Walmart、 Groupon、SAP、 LinkedIn、Rakuten、PayPal、Voxer和 GoDaddy等企业采用。 Node主要用于编写像Web服务器一样的网络应用,这和PHP 和Python是类似的。 Node.js允许通过JS和一系列模块来编写服务器端应用和网络相关的应用。 核心模块包括文件系统I/O、网络(HTTP、TCP、UDP、DNS、TLS/SSL等)、二进制数据流、加密算法、数据流等。Node 模块的API形式简单,降低了编程的复杂度。
Node的用途
Web服务API,比如REST 实时多人游戏 后端的Web服务,例如跨域、服务器端的请求 基于Web的应用 多客户端的通信,如即时通信
安装Node.js
进入官网nodejs.org/en
选择你要安装的地址
通过cmd查看安装的版本
至此node已经安装完成了。
commonJs规范
CommonJS规范的提出,主要是为了弥补当 前JavaScript没有模块化标准的缺陷。 CommonJS规范为JS指定了一个美好的愿景, 希望JS能够在任何地方运行。 CommonJS对模块的定义十分简单: 模块引用 – 模块引用 – 模块定义 – 模块标识
模块引用
在规范中,定义了require()方法,这个方 法接手模块标识,以此将一个模块引入到 当前运行环境中。 模块引用的示例代码:
代码语言:javascript复制var aaa = require('aaa');
模块定义
在运行环境中,提供了exports对象用于导出当前模块的方法或者变量,并且它是唯一的导出的出口。 在模块中还存在一个module对象,它代表模块自身,而exports是module的属性。 在Node中一个文件就是一个模块。
代码语言:javascript复制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。
fs(文件系统)
在Node中,与文件系统的交互是非常重要的,服务器的本质就将本地的文件发送给远程的客户端 Node通过fs模块来和文件系统进行交互 该模块提供了一些标准文件访问API来打开、读取、写入文件,以及与其交互。 要使用fs模块,首先需要对其进行加载 – const fs = require("fs");
同步和异步调用
fs模块中所有的操作都有两种形式可供选择 同步和异步。 同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码。 异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回。
打开和关闭文件
打开文件 – fs.open(path, flags[, mode], callback) – fs.openSync(path, flags[, mode]) 关闭文件 – fs.close(fd, callback) – fs.closeSync(fd)
写入文件
fs中提供了四种不同的方式将数据写入文件 – 简单文件写入 – 同步文件写入 – 异步文件写入 – 流式文件写入
简单文件写入
fs.writeFile(file, data[, options], callback) fs.writeFileSync(file, data[, options]) 参数: – file 文件路径 – data 被写入的内容,可以是String或Buffer – options 对象,包含属性(encoding、mode、flag) – callback 回调函数
同步文件写入
fs.writeSync(fd, buffer, offset, length[, position]) fs.writeSync(fd, data[, position[, encoding]]) 要完成同步写入文件,先需要通过openSync()打开文件来获取一个文件描述符,然后在通过writeSync()写入文件。 参数 – fd 文件描述符,通过openSync()获取 – data 要写入的数据(String 或 Buffer) – offset buffer写入的偏移量 – length 写入的长度 – position 写入的起始位置 – encoding 写入编码
异步文件写入
fs.write(fd, buffer, offset, length[, position], callback) fs.write(fd, data[, position[, encoding]], callback) 要使用异步写入文件,先需要通过open()打开文件,然后在回 调函数中通过write()写入。 参数: – fd 文件描述符 – data 要写入的数据(String 或 Buffer) – offset buffer写入的偏移量 – length 写入的长度 – position 写入的起始位置 – encoding 写入编码
流式文件写入
往一个文件中写入大量数据时,最好的方法之一是使用流。 若要将数据异步传送到文件,首需要使用以下语法创建一个Writable对象: – fs.createWriteStream(path[, options]) path 文件路径 options {encoding:"",mode:"",flag:""} 一旦你打开了Writable文件流,就可以使用write()方法来写入它,写入完成后,在调用end()方法来关闭流。
读取文件
fs中提供了四种读取文件的方式 – 简单文件读取 – 同步文件读取 – 异步文件读取 – 流式文件读取
简单文件读取
fs.readFile(file[, options], callback) fs.readFileSync(file[, options]) – 参数: file 文件路径或文件描述符options | – encoding | 默认 = null – flag 默认 = 'r' callback 回调函数,有两个参数err 、data
同步文件读取
fs.readSync(fd, buffer, offset, length, position) – 参数: fd 文件描述符 buffer 读取文件的缓冲区 offset buffer的开始写入的位置 length 要读取的字节数 position 开始读取文件的位置
异步文件读取
代码语言:javascript复制fs.read(fd, buffer, offset, length, position, callback)
– 参数: fd 文件描述符 buffer 读取文件的缓冲区 offset buffer的开始写入的位置 length 要读取的字节数 position 开始读取文件的位置 callback 回调函数 参数err , bytesRead , buffer
流式文件读取
从一个文件中读取大量的数据时,最好的方法之一就是 流式读取,这样将把一个文件作为Readable流的形式打开。 要从异步从文件传输数据,首先需要通过以下语法创建 一个Readable流对象: – fs.createReadStream(path[, options]) path 文件路径 options {encoding:"",mode:"",flag:""} 当你打开Readable文件流以后,可以通过readable事件和read()请求,或通过data事件处理程序轻松地从它读出。
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:cloud.tencent.com/developer/s…