浅谈node ---- (1)

今天,初学了一下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")

额熄灯了,所以偷个懒,上面的这一大块代码分开敲(敲完一部分运行一下)的话很容易理解其功能,我就不一一解释了,而且我也有注释在上面,那下篇再见,希望我的分享对您有所帮助

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值