node.js模块化
之前已经探讨了jquery,现在轮到了Node了,node是一门后端开发语言,比较适合开发高并发式。
1. global模块
require():引入js文件,本地文件要加./,不然他就会去自己的文件库里找的。
require("./02");
如果本地js文件有个变量,那么用require要怎样使用呢,直接引入是没用的。有两个方法:a:挂在全局global(是node的顶层对象)
let a = "hello";
global.a = a;
require("./02");
console.log(a);//打印hello
b:可以使用exports(不会污染全局。还可以根据文件不同可以取不同的名字,避免了重复)返回的是一个对象。
let a = "hello";
exports.a = a;
let a = require("./02");
console.log(a)
__dirname:文件的目录的绝对路径
console.log(__dirname);
__filename:文件的绝对路径包括文件名
console.log(__filename);
2. path模块
path.join():拼接路径(不识别根目录)
const path = require("path");
let p =path.join("./a","../b","3.txt");
console.log(p)// b\3.txt
path.resolve():拼接路径(识别根目录)
const path = require("path");
let p =path.resolve("./a","/c","3.txt");
console.log(p)// \c\3.txt
path.relative():返回两个路径之间的相对路径
const path = require("path");
let p = path.relative("c:/a/b","c:/d/c")
console.log(p)// ..\..\d\c
path.parse():解析路径,返回的是一个对象
const path = require("path");
let p = path.parse("/user/3.txt")
console.log(p)// { root: '/', dir: '/user', base: '3.txt', ext: '.txt', name: '3' }
3.url模块
URL类:用来解析所以的路径,返回的是一个对象
const URL = require("url").URL;
let u = new URL("https://editor.csdn.net/md?articleId=107644319");
console.log(u);
4.querystring查询字符串模块
querystring.parse():要解析的url的查询字符串,返回的是一个对象
const querystring = require("querystring");
let q = querystring.parse("articleId=107644319")
console.log(q);// { articleId: '107644319' }
querystring.stringify():要序列化的url对象,返回字符串
const querystring = require("querystring");
let q = querystring.stringify({articleId:"107644319"});
console.log(q);//articleId=107644319
5. events:事件触发器
EventEmitter类:EventEmitter .on():仅处理事件一次,EventEmitter.emit():触发事件
const EventEmitter = require("events").EventEmitter;
let ceshi = new EventEmitter();
let fn = function(){
console.log("我叫狗蛋");
}
//绑定事件
ceshi.on("goudan",fn);//这个时候是不能执行的,因为还没有触发
//触发事件
ceshi.emit("goudan");//我叫狗蛋
补充:**EventEmitter .on(),EventEmitter.emit()**里面也可以传参数
ceshi.on("dachui",(a,b,c)=>{
console.log(a + b + c);
});
ceshi.emit("dachui",1,2,3);//6
EventEmitter.off():解绑事件
const EventEmitter = require("events").EventEmitter;
let ceshi = new EventEmitter();
let fn = function(){
console.log("我叫狗蛋");
}
//绑定事件
ceshi.on("goudan",fn);
//解绑事件
ceshi.off("goudan",fn);
//触发事件
ceshi.emit("goudan");//这个时候触发是没有任何东西的
newListener事件:自动触发,不需要emit触发
const EventEmitter = require("events").EventEmitter;
let ceshi = new EventEmitter();
ceshi.on("newListener",()=>{
console.log("我自己执行了");//打印:我自己执行了
})
removeListener事件:移除事件
const EventEmitter = require("events").EventEmitter;
let ceshi = new EventEmitter();
ceshi.on("removeListener",()=>{
console.log("我没有触发");//没有任何东西
})
6. fs文件系统
fs.readFile():读文件:有三个参数,1. 读文件的路径,2.文件格式,3.回调函数
const fs = require("fs");
const path = require("path");
let p = path.join(__dirname,"ceshi")
fs.readFile(p,"utf-8",(err,data)=>{
console.log(data);
});
注意:fs读写文件是异步操作,那要写同步怎么办呢?别担心,小生代码奉上
const fs = require("fs");
const path = require("path");
let p = path.join(__dirname,"ceshi")
console.log(fs.readFileSync(p, "utf-8"));//同步是没有回调函数的
fs.writeFile():写文件:有4个参数。1.写文件的路径,2.写的内容,3.flag(默认w没有则创建文件,有则阻截。不能创建文件夹),4.回调函数(err的处理)
const fs = require("fs");
let str = "hello";
fs.writeFile("4.txt",str,{flag:"a"},(err)=>{
console.log(err);
});
提示:要是想在文件的后面追加内容,则把flag的w改成a就行了。详情见flag,这个也是异步操作。同步操作我就不撸代码了,毕竟nod.js强大的一点就是异步
fs.unlink():删除文件,不能删除文件夹和目录,2个参数:1.要删除文件的路径,2.回调函数(err的处理)
const fs = require("fs");
fs.unlink("./1.txt",(err)=>{
console.log(err);
});
fs.mkdir():创建文件夹:3个参数,1.你要创建文件夹的目录,2.recursive参数为true就可以在不存在的文件夹里在创建一个文件夹,3.回调函数(err)
const fs = require("fs");
fs.mkdir("../img/fs/text",{recursive:true},err => {});
fs.rmdir():删除文件夹:2个参数,1.要删除文件夹的路径,2.err回调函数
const fs = require("fs");
fs.rmdir("../img/fs/text",err => {});
fs.rename():重命名:3个参数,1.旧文件夹的名字,2.新文件夹的名字,err回调函数
const fs = require("fs");
fs.rename("../img/fs","../img/text",err => {});
fs.open():打开文件。3个参数,1.要打开文件的路径,2.flags是否可读写,3.回调函数
const fs = require("fs");
fs.open("../fs/2.txt","r",(err,fd) => {
});
fs.read():读文件。6个参数,1.读的文件,2.把文件先放进一个缓冲区里,3.从缓冲区的第几个开始读,4.要读文件的长度,5.从文件的那个位置开始读,6.回调函数
const fs = require("fs");
fs.open("../fs/2.txt","r",(err,fd) => {
let buf = new Buffer(255);
fs.read(fd,buf,0,9,0,(err,bytesRead,buffer)=>{
console.log(err);
console.log(bytesRead);
console.log(buffer.toString());
fs.close(fd);//每次读完都要关闭
});
});
fs.createReadStream():创建可读流:2个参数。1.要读文件的路径,2.编码格式
const fs = require("fs");
let rs = fs.createReadStream("ceshi","utf-8")
rs.on("data",(d)=>{
console.log(d);
})
fs.createReadStream():创建写流
const fs = require("fs");
let ws = fs.createWriteStream("6.txt");
pipe事件:创建管道流,把读到的文件写入
const fs = require("fs");
let rs = fs.createReadStream("ceshi","utf-8")
let ws = fs.createWriteStream("6.txt");
rs.pipe(ws);
7. http模块
createServer():创建服务。回调函数有2个参数。1.request请求数据,2.response响应结果
const http = require("http");
http.createServer((request,response)=>{
response.writeHead(200,{//请求头的设置
"content-type":"text/html;charset=utf-8",//内容的类型,字符集编码
"Access-Control-Allow-Origin":"*"//跨域的问题解决
})
response.write("hello world");//响应的内容
response.write("<h1>请求响应</h1>")
response.end();//end代表一个响应结束
}).listen(3388)//所要监听的端口