模块化
- 内置模块不需要安装,外置模块需要安装;
这个文件放的是自定义模块
require("./home");//自定义模块 同级目录需要加./
下面这个文件的文件名内置模块
require(“tt”); //存放在node_modules,按照内置模块的规则来执行。
npm包管理器 (别名:模块管理器)
npm常用指令:
- npm init:引导创建一个package.json文件
- npm root 查看当前包安装的路径 或者通过 npm root -g 来查看全局安装路径;
- npm -v 查看版本
- node -v node版本
- npm i jquery --save
- npm i cookie 客户端
- npm i axios --save-dev
npm i axios --save-dev 这是放在开发依赖
package.json 中
“dependencies”: { //运行依赖
“jquery”: “^3.6.0” //npm i jquery --save
},
“devDependencies”: {}, //开发依赖
npm install module_name -S 或者–save 即 npm install module_name --save 写入dependencies
npm install module_name -D 或者 —save-dev 即 npm install module_name --save-dev 写入devDependencies
fs模块
- fs是文件操作模块,所有文件操作都是有同步和异步之分,特点是同步会加上 “Sync” 如:异步读取文件 “readFile”,同步读取文件 “readFileSync”;
初步了解fs模块
//fs:操作文件的模块 内置模块
const fs = require("fs");
> 增删改查
1. 文件操作 2. 目录操作
1.文件的操作
- 写入文件
writeFile(): 写入文件
参数1 : 文件名称,包括文件格式
参数2: 文件中,需要写入的内容
fs.writeFile("1.txt", "我是需要写入的文件", function(err) {
if (err) {
return console.log(err); //输出报错信息
}
console.log("写入成功");
});
当写入的文件存在时,会覆盖掉原来的文件 内容也会
{flag:“a”}
参数3. 配置对象{}:flag属性:a是追加写入
w:写入(默认值)
r: 读取
fs.writeFile("1.txt", "我是追加进来的内容", { flag: "w" }, function(err) {
if (err) {
return console.log(err); //输出报错信息
}
console.log("写入成功");
});
文件读取 fs.readFile
冷门方式
fs.readFile("1.txt",(err,data)=>{
if(err){
return console.log(err);
}
console.log(data.toString());
})
fs.readFile():
回调函数中 参数1:错误的信息
"utf-8"
fs.readFile("1.txt", "utf-8", (err, data) => {
if (err) {
return console.log(err);
}
console.log(data);
})
所有的文件操作,默认都有同步和异步;
默认是同步的,需要异步的话,在方法名前加Sync
例如:readFileSync();
fs.readFileSync("1.txt", "utf-8");
console.log(data);
// let data = fs.readFileSync("1.xtx").toString();
// console.log(data);
/改文件名:重命名
//参数1:原文件名
//参数2:新的文件名
fs.rename("1.txt", "11.txt", err => {
if (err) {
return console.log(err);
}
console.log("修改成功");
});
删除文件 – fs.unlink("")
fs.unlink("2.txt", err => {
if (err) {
return console.log(err);
}
console.log("删除成功");
})
复制文件
fs.copyFile();
1.本质是先读取,再写入
fs.copyFile("11.txt", "aa.txt", err => {
if (err) {
return console.log(err);
}
console.log("复制成功");
})
2.封装复制
function myCopyFile(src, dest) {
fs.writeFileSync(dest, fs.readFileSync(src));
}
myCopyFile("11.txt", "4.txt");
2 : 目录操作
操作目录时,不需要后缀格式
创建目录
fs.mkdir("ding", err => {
if (err) {
return console.log(err);
}
console.log("创建成功");
})
修改目录名称
fs.rename("ding", "da", err => {
if (err) {
return console.log(err);
}
console.log("修改成功");
})
读取目录
fs.readdir("da", (err, data) => {
if (err) {
return console.log(err);
}
console.log(data);//读出来的是一个数组
})
删除目录(空目录/空文件夹)
fs.rmdir("da", err => {
if (err) {
return console.log(err);
}
console.log("删除成功");
})
判断文件或目录是否存在
fs.exists("5.txt", function(exists) {
console.log(exists); //是否找到指定内容 找到就是true找不到就是false
})
//获取文件或目录的详细信息
fs.stat("http.html", (err, data) => {
if (err) {
return console.log(err);
}
console.log(data);
// //是否是文件
// let res = data.isFile();
// console.log(res);
// //是否是目录
// data.isDirectory();
})
删除非空目录
思路:1.先把目录里的文件删除
2.知道该目录为空目录时,直接删除该目录
function removerDir(path) {
//获取目录
let data = fs.readdirSync(path);
//["a",2.html","3.txt","4.txt"]
// console.log(data)
//总体思路
for (let i = 0; i < data.length; i++) {
//循环判断目录中的每一个内容
//处理子目录的路径
let url = path + "/" + data[i];
/*
循环1: url = "22/a"
循环2:下来就是a文件 然后时a文件下面的所有内容
*/
//获取详细信息
let stat = fs.statSync(url);
console.log(stat.isDirectory());
if (stat.isDirectory()) { //如果是目录 继续查找
removerDir(url);
} else { //文件,删除
fs.unlinkSync(url); // path = 22
}
}
//当循环结束后,目录成为空目录
fs.rmdirSync(path);
}
//注意事项:在使用node.js删除文件时,不会经过回收站
// 在删除前, 切记备份
// 一面删除错误,发生不可挽救的损失
removerDir("22");
这两个地方要尤为注意
buffer缓冲区 数据的缓冲区,也是一个类,不是模块
- 现在的创建方式
- 参数:是内容的大小,单位是字节
let buffer = Buffer.alloc(10); console.log(buffer);
- buffer会把数据转换为二进制,然后以十六进制的方式展示出来
let buffer = Buffer.from(“大家好”); console.log(buffer);
let buffer1 = Buffer.from([0xe5, 0xa4, 0xa7, 0xe5, 0xae, 0xb6, 0xe5, 0xa5, 0xbd]);
这里要注意的是上面的参数要以这种0xe5, 才会转换为字符串
console.log(buffer1); <Buffer e5 a4 a7 e5 ae b6 e5 a5 bd>
console.log(buffer1.toString())大家好
let buffer2 = Buffer.from("大家好");
console.log(buffer2)
/字符串创建
//StringDecoder: 固定名称
let { StringDecoder } = require("string_decoder");
let decoder = new StringDecoder();
let res1 = decoder.write(buffer1);
let res2 = decoder.write(buffer2);
console.log(res1 + res2);
stream 流
- stream流:流与数据处理方面密不可分
//stream 流
const fs = require("fs");
//读取了数据
let rs = fs.createReadStream("11.txt");
//将数据写入
let ws = fs.createReadStream("aa.txt");
//管道
rs.pipe(ws);
console.log(rs);
//流 ,会把数据分成64kb的小文件传输
let num = 0;
let str = "";
//数据传输时,触发的方法
rs.on("data", chunk => {
console.log(chunk);
num++;
str += chunk;
console.log(chunk);
console.log(num)
})
//数据传递完成后
rs.on("end", () => {
console.log(str)
})