前端Node.js(简单详细)

126 阅读6分钟

Node的用途

Web服务API,比如REST
实时多人游戏
后端的Web服务,例如跨域、服务器端的请求
基于Web的应用
多客户端的通信,如即时通信

安装Node.js

进入官网nodejs.org/en

image.png

image.png

image.png

选择你要安装的地址

image.png

image.png

image.png

image.png 通过cmd查看安装的版本

image.png 至此node已经安装完成了。

commonJs规范

CommonJS规范的提出,主要是为了弥补当 前JavaScript没有模块化标准的缺陷。
CommonJS规范为JS指定了一个美好的愿景, 希望JS能够在任何地方运行。
CommonJS对模块的定义十分简单:
模块引用
– 模块引用
– 模块定义
– 模块标识

模块引用

在规范中,定义了require()方法,这个方 法接手模块标识,以此将一个模块引入到 当前运行环境中。 模块引用的示例代码:

var aaa = require('aaa');

模块定义

在运行环境中,提供了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。

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 开始读取文件的位置

异步文件读取

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事件处理程序轻松地从它读出。