今天,初学了一下node,node是一门基于JavaScript的一门后台语言(这么说好像不太严谨,其实大家都懂,node就是配套前端的后台嘛~),那闲话就不多说了,毕竟想要看介绍的话,有很多大神总结了node的特点啊,优缺点啊什么的,我今天就简单学了一点node里面的一些基本功能,那么直接上干货吧!!!
模块化
首先,先说一下,JavaScript这么语言最初其实是为了验证表单而开发出来的,说白了其实就是当时,浏览器登录时为了实现当用户输入不符合标准的登录信息时,不用访问后台,直接验证的简单功能的语言。但由于现在的js发展的迅速,更多的功能也需要用JavaScript实现,所以模块化的功能就出现了
reuqire就是引入某个模块的借口(node中自带有http模块),模块的接口通过module.export暴露出来。
var http = require("http");var fs = require("fs");
var server = http.createServer(function (req, res) { fs.readFile("./tianmao.html" , "utf-8" , function (err , data) { res.end(data);
})
})
server.listen(8081);
这段代码是在本地自建一个服务器,监听8081端口,访问localhost:8081就能看到拷贝的网站代码(tianmao.html)
export 和module.export的区别
简单来说module.export是标准的,建议大家只用module.export,那么export其实就相当于module.export的引用,但是export不能导出{}包裹的接口,原因如下:
我们可以理解成这样(虽然不是很正确,但很形象)
module.exports = { name : "hr"}
var export = module.export;
node支持module.export为暴露模块接口的标准,如果 export = { } 的话就相当于export不再引用module.export,而是重新引用了一个新的对象,那么export就失去了意义。
事件(event模块)
首先我们要现在文件里引入node的event模块
var events = require("events")
var event = new event();
on方式:第一个参数为事件名,第二个参数为处理函数,
//event.on放置回调数组的最后一位,调用时for循环一遍回调数组
event1.on("call" , function (name , age) {
console.log("calling 1");
console.log(name , age);
});
event1.on("call" , function (name , age) {
console.log("calling 2");
console.log(name , age);
})
注释的意思是事件的处理函数其实是一个数组,里面有用户添加同一事件的所有处理函数我们用on方法添加的函数是把函数添加到数组的最后一位。
prependListener方式:
//event.prependListener将回调函数放置回调数组的最前一位
var fn = function (name , age) {
console.log("calling3");
console.log(name , age);
}
event1.prependListener("call" , fn)
用prepend方法添加的函数是把函数添加到数组的最后一位。
once方式:
//只触发一回
event1.once("once" , function () {
console.log("once");
})
删除事件:
//删除某一事件
event1.removeListener("call" , fn);
//删除所有事件
event1.removeAllListeners("call");
触发事件:
想要触发事件必须要用emit方法
//触发事件,将回调数组循环遍历,执行回调函数
event1.emit("call", "fhr" , 10);
event1.emit("once");
event1.emit("once");
event1.emit("once");
event1.emit("once");
方法的实现:
var eventEmitter = function () {
this.eventList = {};
}
eventEmitter.prototype.on = function (eventName , callBack) {
if (!this.eventList[eventName]) {
this.eventList[eventName] = []
this.eventList[eventName].push(callBack);
} else {
this.eventList[eventName].push(eventName);
}
}
eventEmitter.prototype.prependListener = function (eventName , callBack) {
if (!this.eventList[eventName]) {
this.eventList[eventName] = [];
this.eventList[eventName].unshift(callBack);
}
this.eventList[eventName].unshift(callBack);
}
eventEmitter.prototype.emit = function (eventName , ...arg) {
var eventArr = this.eventList[eventName] || [];
eventArr.forEach((item , index) => {
item.apply(this , arg);
})
};
eventEmitter.prototype.remove = function (eventName , fnName) {
var eventArr = this.eventList[eventName] || [];
eventArr.forEach((item , index) => {
if(item == fnName) {
eventArr.splice(index , 1);
}
})
}
eventEmitter.prototype.removeAllListener = function (eventName) {
var eventArr = this.eventList[eventName] || [];
eventArr.splice(0);
}
var event = new eventEmitter();
var fn0 = function (name , age) {
console.log("call 0");
console.log(name , age)
}
var fn1 = function (name , age) {
console.log("call 1");
console.log(name , age);
}
var fn2 = function () {
console.log("call 2")
}
这是我写的一些简单的功能的实现,就是方法的简单模拟
fs模块
这里写代码片const fs = require("fs");
const path = require("path");
//读取文件
fs.readFile("./data.txt" , "utf-8" , function (err , data) {
if (err) {
return;
}
//创建文件,同步的为fs.writeFileSync()
fs.writeFile("./test.txt" , 123 , "utf-8" , function () {
// console.log("file success created")
})
})
//同步读取文件
var data = fs.readFileSync("./data.txt" , "utf-8");
//返回所选文件的一些属性,同步操作
let statSync = fs.statSync("./data.txt");
fs.stat("./data.txt" , function (err , data) {
console.log(data)
})
console.log(statSync);
console.log(statSync.isDirectory())//判断是否是文件夹
console.log(statSync.isFile())//判断是否是文件
//异步的
let stat = fs.stat("./data.txt", function () {
// console.log("sync success");
});
//创建文件夹,异步操作。同步方法为fs.mkdirSync("./dir1" )
fs.mkdir("./dir1", function () {
// console.log("dir1 is created")
fs.writeFile("file1.txt" , "this is file1" , "utf-8" , function () {
// console.log("file1 is created")
})
})
fs.readdir("./dir1" , function (err , data) {
data.forEach(function (item) {
fs.stat(path.resolve(__dirname , "dir1" , item) , function (err , data) {
if (data.isFile()) {
console.log(item + " is a file")
} else {
console.log(item + " is not a file")
}
})
})
})
var readFile = function (url) {
fs.writeFileSync(url , 123 , "utf-8");
fs.readFile(url , "utf-8" , function (err , data) {
if (err)
return;
let thisFile = fs.statSync(url);
if (thisFile.isFile(url)) {
console.log("success");
} else {
console.log("failed");
}
})
}
readFile("./test.txt")
额熄灯了,所以偷个懒,上面的这一大块代码分开敲(敲完一部分运行一下)的话很容易理解其功能,我就不一一解释了,而且我也有注释在上面,那下篇再见,希望我的分享对您有所帮助