1.模块的互不影响
02.js文件
exports.name="小庄";
exports.age=18;
03.js文件
let a=require("./02");
a.sex="女";
console.log(a);//{ name: '小庄', age: 18, sex: '女' }
2.关于重复引入相同的模块
05.js
module.exports={
name:"小庄",
age:18
}
06.js
let a=require("./05");
a.sex="woman";
console.log(a);//{ name: '小庄', age: 18, sex: 'woman' }
let b=require("./05");
console.log(b);//{ name: '小庄', age: 18, sex: 'woman' }
/*
* 在同一个文件重复引入是没有意义的,他不会重新读取05的数据。
* */
3.path模块
原生模块/npm 的引入
const path=require("path");
- .join() 传入路径,会返回拼接好的路径
console.log(path.join("./a", "./b"));//a\b
-
路径的拼接
__dirname 返回当前文件夹下的绝对路径
console.log(__dirname);
如果想要在当前文件夹下去寻找其他路径,则可以使用
console.log(path.join(__dirname,"./a"))//./a代表以当前文件夹为视角去寻找目标文件夹
-
.resolve() 前面会自动补上绝对路径
console.log(path.resolve("a","b")); //C:\Users\Administrator\Desktop\node\03模块系统\a\b
-
.relative(); 从前者目录到达后者路径的相对路径
console.log(path.relative("a/b/c","a/b"));//..
-
.parse() 分析路径
const path=require("path"); console.log(path.parse("C:/user/a/2.txt"));
输出
{ root: 'C:/',//根 dir: 'C:/user/a',//目录 base: '2.txt',//基础文件 ext: '.txt',//扩展名 name: '2'//文件名 }
-
path总结
- 拼接路径用的
- join
- resolve
- relative
- parse
- 拼接路径用的
4.url模块
url
模块用于处理与解析 URL。 使用方法如下:
const url = require('url');
const url = require('url');
//const {URL} = require('url');
const myURL =
new URL('https://user:pass@sub.host.com:8080/p/a/t/h?query=string#hash');
console.log(myURL);
输出
URL {
href: 'https://user:pass@sub.host.com:8080/p/a/t/h?query=string#hash',
origin: 'https://sub.host.com:8080',
protocol: 'https:',
username: 'user',
password: 'pass',
host: 'sub.host.com:8080',
hostname: 'sub.host.com',
port: '8080',
pathname: '/p/a/t/h',
search: '?query=string',
searchParams: URLSearchParams { 'query' => 'string' },
hash: '#hash'
}
5.querystring(查询字符串)
querystring
模块提供用于解析和格式化 URL 查询字符串的实用工具。 可以使用以下方式访问它:
const querystring = require('querystring');
-
querystring.parse()//将解析字符串分解成对象格式。
-
querystring.stringify();//把你所需的对象拼接成查询格式
let a=querystring.stringify({name:"小庄",age:18},";",":"); console.log(a);//name:%E5%B0%8F%E5%BA%84;age:18
6.es6补充-Set与Map
参考网站: https://es6.ruanyifeng.com/#docs/set-map
1.set结构
可以去重。但是set之后的不是数组,怎么变成数组呢
let arr=["a","b","c","d","b","a"];
let s=new Set(arr);
console.log(s);//{"a", "b", "c", "d"}
console.log([...s]);//["a", "b", "c", "d"]
s.add("e");//添加数据
s.delete("a");//删除数据
console.log(s.has("a"));//true 判断是否存在某一条数据
2.Map
存储的数据可以是Key value的对应
只不过key不仅仅可以是字符串了,可以是任意的数据类型
let x={};
let map=new Map();
map.set("name","小庄");
map.set(x,18);
console.log(map.get("name"));//
console.log(map.get(x));
map.forEach(v=>{//便利MAp中的值
console.log(v);//小庄 18
})
for(let [key,value] of map.entries()){//便利MAp中的值
console.log(key,value);
//name 小庄
//{} 18
}
7 fs读取文件
node.js所有异步操作api都必须有回调函数,并且回调函数的第一个形参表示的是错误对象
(没有错误是null,有错误执行)
const fs =require("fs");
fs.readFile("./1.txt",(err)=>{
if(err){
console.log("异步出错");
}else{
console.log("操作成功!");
}
})
文档流:BUFFER格式
1.readFile读取文件
三个参数:文件路径,文档格式,回调函数。
const fs =require("fs");
fs.readFile("./1.txt","utf8",(err,body)=>{
if(err)return;
console.log(body);//打印文件内容
})
2.writeFile修改文件
如果存在则修改,不存在则创建文件夹并书写内容
参数一:路径
参数二:内容
参数三:options 方式(“追加还是。。。”)
参数四:回调
const fs=require("fs");
fs.writeFile("index.html",
"曹佳乐真棒",
{
encoding:"utf8",
flag:"a",
},
(err)=>{
return;
})
wirteFile不能存在一个不存在的文件夹
只能创建一个不存在的文件
8.同步api
大部分的异步api都有对应的同步api
譬如:对于读取文件
const fs =require("fs");
fs.readFile("./1.txt","utf8",(err,body)=>{
if(err)return;
console.log(body);//打印文件内容
})
他的同步写取方式(不需要回调函数)
const fs =require("fs");
let a=fs.readFileSync("./02.txt","utf8");
console.log(a);
当同步出错的时候怎么处理
try catch
const fs =require("fs");
let a;
try{
a=fs.readFileSync("./022.txt","utf8");
}catch(err){
console.log(err);
throw err;
}
console.log(a);
console.log(2);
9.unlink
删除文件
文件不存在会报错
不能删除目录
可以删除当前文件夹
参数一:文件路径
参数二:回调函数
const fs=require("fs");
fs.unlink(
"./index.html",
(err)=> {
if (err) return;
}
)
const fs=require("fs");//同步代码
fs.unlinkSync(
"./index.html"
)
10.rename
重命名/移动 文件或者文件夹
可以操作文件或者文件夹都可以
参数一:原路径
参数二:新路径
参数三:回调函数
重命名:
const fs=require("fs");
fs.rename("./1.txt",
"./1.md",
(err)=>{
console.log(err);
}
)
移动:
const fs=require("fs");
fs.rename("./1.md",
"./js/index.dd",
(err)=>{
console.log(err);
}
)
文件夹的重命名:
const fs=require("fs");
fs.rename("./cs",
"./css",
(err)=>{
console.log(err);
}
)
文件夹的移动:
const fs=require("fs");
fs.rename("./jss",//把这个文件夹移动到另外一个文件夹里
"./cs/jss",
(err)=>{
console.log(err);
}
)
11.文件夹操作
readdir 读取文件夹:
const fs=require("fs");
fs.readdir(
"../03模块系统",
(err,data)=>{
console.log(err);
console.log(data);
}
)
循环输出文件夹中的字符串名称:
const fs=require("fs");
fs.readdir(
"../03模块系统",
(err,data)=>{
if(err)return;
data.forEach(item=>{
console.log(item);
})
}
)
mkdir 创建文件夹
const fs=require("fs");
fs.mkdir(
"./ds",
(err)=>{
console.log(err);
}
)
rmdir 删除文件夹
只能删除空文件夹
const fs=require("fs");
fs.rmdir(
"./ds",
(err)=>{
console.log(err);
}
)
stat
fs.stat{
"../01node.html",
(err,stats)=>{
if(err)return;
console.log(stats);
}
}
输出:
Stats {
dev: 2197447071,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: 4096,
ino: 1688849860288726,
size: 1909,
blocks: 8,
atimeMs: 1594556349273.6372,
mtimeMs: 1594556349273.6372,
ctimeMs: 1594558765143.9062,
birthtimeMs: 1594481726593.8186,
atime: 2020-07-12T12:19:09.274Z,//
mtime: 2020-07-12T12:19:09.274Z,//
ctime: 2020-07-12T12:59:25.144Z,//
birthtime: 2020-07-11T15:35:26.594Z
}
const fs=require("fs");
fs.stat(
"../01node.html",
(err,stats)=> {
if (err) return;
console.log(stats);
console.log(stats.isDirectory());//判断是否是文件夹
console.log(stats.isFile());//判断是否是文件
}
)
12.删除文件夹的封装
这里是一个同步方法
删除文件夹的封装.js
const fs=require("fs");
const path=require("path");
let fn=(Path)=>{
try{
let stat=fs.statSync(Path);//获取文件的详细信息
if(stat.isFile()){//如果是文件
fs.unlinkSync(Path);
}
if(stat.isDirectory()){//如果是文件夹
//先读取文件夹的操作
let dir=fs.readdirSync(Path);//为数组
if(dir.length){//文件夹里面有内容
dir.forEach(item=>{
let p=path.join(Path,item);//拼接好当前的路径
fn(p);//递归
});
}
fs.rmdirSync(Path);
}
}catch (e) {
console.log(e);
}
};
module.exports = fn;
04.js
const rmSync=require("./删除文件夹的封装.js");
const path=require("path");
rmSync("C:\\Users\\Administrator\\Desktop\\课堂代码");