一、什么是NodeJS
(1)Node.js 是一个基于 Chrome V8 引擎的 JavaScript 的服务器端运行环境。
(2)Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
二、我们用NodeJS来干什么?
NodeJS可以构建服务器
(1)接收客户端对静态资源的请求,并返回结果
(2)接收客户端对动态资源的请求,进行业务处理后,返回结果
三、NodeJS的基础
-
构建服务器 (http模块)
const http = require("http")
const server = http.createServer(function(req,res){
console.log(req.url);res.writeHead(200,{"content-type":"text/html;charset=UTF-8"});
res.write('中文');
res.end("hello world");
})
server.listen(80) -
nodeJS的模块
(1)暴露模块: exports.fun = fun;
module.exports = {}
(2) 加载模块: (能够加载进来的其实是exports对象)
const a = require("*.js") -
fs模块 (文件系统)
(1) fs.readFile("文件地址",function(err,data){
console.log(data.toString());
})(2) fs.writeFile("文件地址","内容",function(){
})
流的概念: stream(3) const readerStream = fs.createReadStream("文件地址")
readerStream.on("data",function(chunk){
})
readerStream.on("end",function(){
})
readerStream.on('error', function(err){
console.log(err.stack);
});(4) 可读流和可写流通过管道操作连续执行
var readStream = fs.createReadStream('./1.txt');
var writeStream = fs.createWriteStream('output.txt');// 管道读写操作
// 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
readStream.pipe(writeStream);
-
path模块(对路径进行操作)
// __dirname 表示当前文件所在的目录
console.log(__dirname)
// __filename 表示 当前文件的完整路径
console.log(__filename)path.join()
path.normalize()
path.resolve
path.extname()
四、搭建静态资源服务器
var http = require("http");
var fs = require("fs");
var path = require("path");
var mime = require("mime"); // 自动获取文档类型,用在res.writeHead中
http.createServer(function (req, res) {
if (req.url == "/") {
fs.readFile(__dirname + "/app" + "/index.html", function (err, data) {
res.end(data);
})
}
var path_last = path.extname(req.url); // ".html" ".css"
if (path_last) {
res.writeHead(200, { "Content-type": mime.getType(path_last) });
//favicon.ico文件放在服务器根目录
var url = __dirname + (path_last == ".ico" ? "" : "/app") + req.url;
fs.readFile(url, function (err, data) {
res.end(data);
})
}
}).listen(3000)
五、NodeJS的事件循环
Event Loop(事件循环)是一个程序结构,用于等待和发送消息和事件
- Node.js是一个单进程单线程的应用。
- 单线程是指用户的代码始终运行在一个线程,即主线程
- Node.js还有另一个负责主线程与其他进程(主要是各种I/O操作)通信的线程,被称为"消息线程"(或事件队列)
- Event Loop: 当web server接收到请求,就把它关闭然后进行处理(执行I/O操作),然后去服务下一个web请求。
每当遇到I/O的时候,主线程就让Event Loop线程去通知相应的I/O程序,然后接着往后运行,所以不存在等待时间。等到I/O程序完成操作,Event Loop线程再把结果返回主线程。主线程就调用事先设定的回调函数,完成整个任务,这个执行过程不断循环。