命令行窗口

常用指令

  • dir 列出当前目录下的所有文件
  • cd 目录名进入到指定的目录
  • md创建文件夹
  • rd删除文件夹

目录

  • .表示当前目录
  • ..表示上一级目录

环境变量(windows系统中的变量)

  • 当我们在命令行窗口打开一个文件,或调用一个程序时

    系统会首先在当前目录下寻找文件程序,如果找到了则直接打开

    如果没有找到则会依次到环境变量path的路径中寻找,直到找到为止

    如果没有则报错

Node.js

  • 一个能够在服务器端运行JavaScript代码的运行环境。

模块化

  • 在node中,一个js文件就是一个模块

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

    • require()可以传递一个文件的路径作为参数,node将会自动根据该路径来引入外部模块
    • 这里路径,如果使用相对路径,必须以.或..开头
    • 使用require()引入模块后,该函数会返回一个对象,这个对象代表的是引入的模块
  • 每一个js文件中的js代码都是独立运行在一个函数中

    而不是全局作用域,所以一个模块中的变量和函数在其它模块中无法访问

导出变量和函数

  • 使用exports

    • exports.属性 = 属性值;
    • exports.方法 = 函数;
  • 使用module.exports

    • module.exports.属性 = 属性值;
    • module.exports.方法 = 函数;
    • module.exports = {};
  • 可以通过exports来向外部暴露变量和方法

    • 只需要将需要暴露给外部的变量或方法设置为exports的属性即可
    1
    2
    3
    4
    5
    6
    console.log("hello,我是test.js");
    exports.x = "我是test.js中的x";
    exports.y = "我是y";
    exports.fn = function(){

    }
    1
    2
    const test = require('./test');
    console.log(test);

    输出结果为:

    image-20210611164918970

  • 模块分为两大类:

    • 核心模块
      • 由node引擎提供的模块
      • 核心模块的标识就是模块的名字
    • 文件模块
      • 由用户自己创建的模块
      • 文件模块的标识就是文件的路径
  • 在node中有一个全局对象global,它的作用和网页中window类似

    • 在全局中创建的变量都会作为global的属性保存
    • 在全局中创建的函数都会作为global的方法保存
  • 实际上模块中的代码都是封装在一个函数中执行的,并且在函数执行时,同时传进了5个实参

    • exports
      • 该对象用来将变量或函数暴露到外部
    • require
      • 函数,用来引入外部的模块
    • module
      • 代表当前模块本身
      • exports就是module的属性
      • 既可以使用exports导出,也可以使用module.exports导出
    • _filename
      • 当前模块的完整路径
    • _dirname
      • 当前模块所在文件夹的路径

模块的标识

  • 对于核心模块(npm中下载的模块),直接使用模块的名字进行引入

    const math = require('math');

  • 对于自定义的文件模块,需要通过文件的路径来对模块进行引入

    • 路径可以是绝对路径,也可以是相对路径,必须以./../开头

      const test = require('./test');

包(package)

  • 包实际上就是一个压缩文件,解压后还原为目录
    • package.json 描述文件
    • bin 可执行的二进制文件
    • lib js代码
    • doc 文档
    • test 单元测试

npm

  • node包管理器
  • 通过npm下载的包都在node_modules文件夹中

image-20210611185309458

npm的命令

  • npm -v 查看npm的版本
  • npm version 查看所有模块的版本
  • npm search 包名搜索包
  • npm install / i 包名安装包
  • npm remove / r 包名删除包
  • npm install 包名 --save安装包并添加到依赖中(用得最多)
  • npm install下载当前项目所依赖的包
  • npm install 包名 -g全局安装包(全局安装的包一般都是一些工具)

指定文件作为包

  • 要先在这个文件夹中npm init初始化这个文件夹,使它有package.json,直接跳过初始化操作可以npm init -y

    这样才可以将包引入到指定文件中

cnpm

  • 淘宝镜像npm,解决npm服务器在国外造成的一系列问题,但是(只读)只能下载

Buffer(缓冲区)

  • 结构和数组很像,操作的方法也和数组类似

  • 数组中不能存储二进制文件,而buffer就是专门用来存储二进制的数据

  • 使用buffer不需要引入模块,直接使用即可

  • 在buffer中存储的数据都是二进制数据,但是在显示时都是以十六进制的形式展示

  • buffer中每一个元素的范围都是从00 - ff( 十进制:0-255)(二进制:00000000 - 11111111)

    计算机 一个0或1 我们称1位(bit)

    8bit = 1byte(字节)

    buffer中的每一个元素,占用内存一个字节

    1
    2
    3
    4
    var str = "hello Atguigu";
    var buf = Buffer.from(str);
    console.log(buf);
    console.log(buf.length);

    输出结果:

    image-20210611191440701

  • Buffer.from(str)将一个字符串转换为buffer

  • Buffer.alloc(size)创建一个指定大小的buffer

  • Buffer.allocUnsafe(size)创建一个指定大小的buffer,可能包含敏感数据

  • buf.toString()将缓冲区中的数据转换为字符串

创建指定大小的buffer

  • buffer构造函数都是不推荐使用的

    1
    2
    3
    4
    5
    6
    var buf = Buffer.alloc(10);
    console.log(buf);
    buf[0] = 88;
    buf[1] = 255;
    buf[2] = 0xaa;
    console.log(buf);

    输出结果:

    image-20210611192041110

  • buffer大小一旦确定,不能改变

  • 只要数字在控制台或页面中输出,一定是十进制

fs(文件系统)

文件系统(File System)

  • 文件系统简单来说就是通过Node来操作系统中的文件
  • 使用文件系统,需要先引入fs模块,fs是核心模块,直接引入不需要下载

image-20210611194040434

同步文件的写入

  1. 打开文件

    fs.openSync(path, flags[, mode])

    • path:要打开文件的路径
    • flags:打开文件要做的操作类型
      • r:只读
      • w:可写
    • mode:设置文件的操作权限,一般不传
    • 返回值
      • 该方法会返回一个文件描述符作为结果,我们可以通过该描述符来对文件名进行各种操作
  2. 向文件中写入内容

    fs.writeSync(fd, String[, position,[, encoding]])

    • fd 文件的描述符,需要传入要写入的文件的描述符
    • string 要写入的内容
    • position 写入的起始位置
    • encoding 写入的编码,默认UTF-8
  3. 保存并关闭文件

    fs.closeSync(fd);

    • fd 要关闭的文件的描述符
1
2
3
4
5
6
7
const fs = require('fs');
//打开文件
var fd = fs.openSync("hello.txt","w");
//向文件中写入内容
fs.writeSync(fd, "今天天气真不错!");
//关闭文件
fs.closeSync(fd);

异步文件写入

  1. 打开文件

    fs.open(path, flags[, mode], callback)

    • path:要打开文件的路径

    • 异步调用的方法,结果都是通过回调函数的参数返回的

    • 回调函数两个参数:

      • err 错误对象
      • fd 文件描述符
    • flags:打开文件要做的操作类型

      • r:只读
      • w:可写
    • mode:设置文件的操作权限,一般不传

  2. 向文件中写入内容

    fs.write(fd, String[, position,[, encoding]], callback)

    • 用来异步写入一个文件
  3. 关闭文件

    fs.close(fd, callback)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const fs = require('fs');
//打开文件
fs.open("hello.txt","w",function(err,fd){
if(!err){
//如果没有出错,写入操作
fs.write(fd,"这是异步写入的内容",function(err){
if(!err){
console.log("写入成功~~");
};
//关闭
fs.close(fd, function(err){
if(!err){
console.log("文件已关闭~~");
}
});
})
}else{
console.log(err);
}
});

console.log("程序向下执行~~~");

简单文件写入

  • 异步:fs.writeFile(file, data[, options], callback)
  • 同步:fs.writeFileSync(file, data[, options])
  • file 要操作的文件路径
  • data 要写入的数据
  • options 选项,可以对写入进行一些设置
  • callback 当写入完成以后执行的函数

image-20210924220220138

流式文件写入

  • 同步,异步,简单文件写入都不适合大文件的写入,性能较差,容易导致内存溢出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//创建一个输入流
var ws = fs.createWriteStream("hello3.text");

//可以通过监听流的open和close事件来监听流的打开和关闭
ws.once("open",function(){
console.log("流打开了~~~");
});

ws.once("close",function(){
console.log("流关闭了~~~");
});

ws.write("可写入文件的内容");
ws.write("可写入文件的内容");
ws.write("可写入文件的内容");
ws.write("可写入文件的内容");
ws.write("可写入文件的内容");

//关闭流
ws.end();
  • on(事件字符串,回调函数)
    • 可以为对象绑定一个事件
  • once(事件字符串,回调函数)
    • 可以为对象绑定一个一次性的事件,该事件会在触发一次后自动失效

同步文件读取

异步文件读取

简单文件读取

  • fs.readFile(path[, options], callback)

  • fs.readFileSync(path[, options])

流式文件读取

  • pipe()可以直接将可读流中的内容直接输入到可写流

image-20210924224751703

其他操作

  • 验证路径是否存在

    • fs.existsSync(path)
  • 获取文件信息

    • fs.stat(path,callback)
    • fs.statSync(path)
  • 删除文件

    • fs.unlink(path,callback)
    • fs.unlinkSync(path)
  • 列出文件

    • fs.readdir(path[, option], callback)
    • fs.readdirSync(path[, option])
  • 截断文件

    • fs.truncate(path, len, callback)
    • fs.truncateSync(path, len)
  • 建立目录

    • fs.mkdir(path[, mode], callback)
    • fs.mkdirSync(path[, mode])
  • 删除目录

    • fs.rmdir(path, callback)
    • fs.rmdir(path)
  • 重命名文件和目录

    • fs.rename(oldPath, newPath, callback)
    • fs.renameSync(oldPath, newPath)
  • 监视文件更改写入

    • fs.watchFile(filename[, option], listener)