Bootstrap

nodejs - 模块化和文件系统


一、引入其他模块

在node中,通过required()函数来引入外部的模块

required()可以传递一个文件的路径作为参数,node将会自动根据该路径来引入模块
在这里插入图片描述
使用require()引入模块以后,该函数会返回一个对象,这个对象代表的是引入的模块
在这里插入图片描述
在Node中,一个js文件就是一个模块
在Node中,每一个js文件中的js代码都是独立运行在一个函数中的
所以一个模块中的变量和函数在其他模块中无法访问

二、向外部暴露属性或方法

我们可以通过exports来向外部暴露变量和方法
只需要将需要暴露给外部的变量或方法设置为exports的属性
在这里插入图片描述

三、定义文件模块

定义一个模块 math,该模块中提供两个方法:

  • add(a, b):求两个数的和
  • mul(a, b):求两个数的积
    在这里插入图片描述

四、全局对象global

在node中有一个全局对象 global,它的作用和网页中window类似
在全局中创建的变量, 都会作为global的属性保存
在全局中创建的函数, 都会作为global的方法保存

五、node执行模块时做的操作

当node在执行模块中的代码时, 它会首先在代码的最顶部添加如下代码

function(exports, require, module, __filename, __dirname){
}

参数详解

  • exports : 该对象用来将变量或函数暴露到外部
  • require : 函数, 用来引入外部的模块
  • module :代表的是当前模块本身
  • __filename :当前模块的完整路径
  • __dirname :当前模块所在的文件夹的路径

六、包

将一组相关的模块组合到一起,形参一组完整的工具,就称为包

包由两部分组成, 包结构和包描述文件

包结构 : 用于组织包中的各种文件
包描述文件 :描述包的相关信息,以供外部读取分析。

七、npm

  • npm init : 初始化, 创建package.json文件
  • npm install xxx : 安装xxx模块
  • npm remove 包名 :删除包
  • npm install : 下载当前项目所依赖的包
  • npm install 包名 --save : 安装包并添加到依赖中。

设置淘宝镜像

npm install -g cnpm --registry=https://registry.npm.taobao.org

八、Buffer缓冲区

Buffer的结构和数组很像
数组中不能存储二进制的文件,而Buffer就是专门用来存储二进制数据
在buffer中存储的都是二进制数据,但是在显示时都是以16紧追的形式显示的
buffer中的一个元素,占用内存的一个字节

1. 将一个字符串保存到Buffer中

var buf = Buffer.from(str);
consloe.log(buf.length) // 占用内存的大小

2. 创建一个指定大小的buffer

var buf2 = Buffer.alloc(1024)

3. 通过索引,来操作buf中的元素

buf2[0] = 88
console.log(buf2); // <Buffer 58 00 00 00 00 00 00 00 00 00>

九、文件系统

在这里插入图片描述

同步文件系统会阻塞程序的执行

1. 引入模块

fs是核心模块,直接引入不需要下载

var fs = require("fs")

2. 打开文件

fs.openSync(path, flags[, mode])
  • path : 要打开文件的路径
  • flags : 打开文件要做的操作类型
    • r : 只读
    • w :可写
  • model :设置文件的操作权限, 一般不传

返回值 : 该方法会返回一个文件的描述符作为结果

var fs = require("fs")

var fd = fs.openSync("hello.txt", "w")
console.log(fd);

3. 向文件中写入内容

fs.writeSync(fd, string[, position[, encoding]])
  • fd : 文件描述符
  • string :要写入的内容
var fs = require("fs")

var fd = fs.openSync("hello.txt", "w")

fs.writeSync(fd, "222")

4. 关闭文件

fs.closeSync(fd)

5. 异步文件写入

fs.open(path[, flags[, mode]], callback)
  • path : 要打开文件的路径
  • flags : 打开文件要做的操作类型
    • r : 只读
    • w :可写
  • model :设置文件的操作权限, 一般不传
  • callback : 回调函数,异步调用的方法,结果都是通过回调函数的参数返回的。
    • err :错误对象,如果没有错误则为null
    • fd : 文件的描述符
var fs = require("fs")

// 异步打开文件的方法
fs.open("hello.txt", "w", function(error, fd){
  console.log(fd); // 3
})

6. 简单文件写入*

fs.writeFile(file, data[, options], callback)
  • path : 要操作文件的路径
  • data : 要写入的数据
  • options |
    • encoding | 默认值: ‘utf8’
    • mode 默认值: 0o666
    • flag 默认值: ‘w’。
    • signal 允许中止正在进行的写入文件
  • callback : 回调函数,异步调用的方法,结果都是通过回调函数的参数返回的。
var fs = require("fs")
// 简单写入
fs.writeFile("hello1.txt", "w", function (error) {
  if(!error) {
    console.log("文件写入成功");
  }else {
    console.log("error");
  }
})

7. 流式文件写入

fs.createWriteStream(path[, options])
  • path : 文件路径
  • options : 配置的参数
var ws = fs.createWriteStream("hello.txt")

通过ws向文件中输出内容

ws.write("通过可写流写入文件的内容")

监听流的打开和关闭

可以通过监听流的open和close事件来监听流的打开和关闭

ws.on("open", function(){
	conslole.log("流打开了")
})

关闭流

ws.end()

8. 简单文件读取 *

fs.readFile(path[, options], callback)
var fw = fs.readFile("hello2.txt", function (error, data) {
  console.log(data.toString());
})

9. 将可读流中的内容,直接输出到可写流中

// 创建一个可读流
var rs = fs.createReadStream("hello.txt")

// 创建一个可写流
var ws = fs.createWriteStream("hello1.txt")

// 将可读流中的内容,直接输出到可写流中
rs.pipe(ws)
;