什么是NodeJS
1.Node.js官网地址:https://nodejs.org/en/中文:http://nodejs.cn/api/1.Node 是一个构建于 Chrome V8引擎(编译器)之上的一个Javascript 运行环境
Node是一个运行环境,作用是让js拥有开发服务端的功能 2.Node使用事件驱动、非阻塞IO模型(异步读写)使得它非常的轻量级和高效
Node中绝大多数API都是异步(类似于ajax),目的是提高性能 3.Node中的NPM是世界上最大的开源库生态系统(类似于github)
NMP官网:https://www.npmjs.com 4.Node运行环境的另一种叫法,作用是解析执行js代码(Node.exe工作环境称之为REPL环境)5 .nodemon
node开发之友,当你的js文件发生变化的时候,nodemon会自动帮你启动node程序 安装: npm install -g nodemon
使用:nodemon [js文件名]
NodeJS模块化
模块:其实就是前端的第三方库(别人写的js文件)
内置模块/核心模块:nodejs作者自己写的模块
第三方模块:热心网友写的模块
核心模块
nodejs模块的使用方法:
1.导包(下载):得到一个对象,存储框架中的API
require('模块路径'); 2.用包:调用对象的方法
fs文件读取模块
readFile读取文件 1.导入模块 (1)参数: 模块路径 (2)返回值: 对象 , 存储模块所有的api
const fs
= require('fs');
使用模块
fs
.readFile('./a.txt','utf-8',function(err
,data
){
if(err
){
throw err
;
}else{
console
.log('读取成功');
console
.log(data
);
}
});
writeFile写入文件
const fs
= require('fs');
fs
.writeFile('./b.txt','helloworld',err
=>{
if(err
){
throw err
;
}else{
console
.log('写入成功');
}
})
同步与异步的区别
编译器执行代码流程
从上往下解析代码判断代码是同步还是异步 同步:立即执行 异步:不执行,放入一个事件队列池(EventLoop) 同步与异步的区别
API不同,异步有回调函数,同步一般没有(前端有两个API是异步,定时器和ajax)执行顺序不同,同步有序且优先执行,异步是无序执行性能不同,异步性能高(不能阻塞线程),同步阻塞线程
const fs
= require('fs');
fs
.readFile('./a.txt', 'utf-8', (err
,data
)=> {
console
.log(11111);
});
fs
.readFile('./a.txt', 'utf-8', (err
,data
)=> {
console
.log(22222);
});
fs
.readFile('./a.txt', 'utf-8', (err
,data
)=> {
console
.log(33333);
});
fs
.readFile('./a.txt', 'utf-8', (err
,data
)=> {
console
.log(44444);
});
let data1
= fs
.readFileSync('./b.txt','utf-8');
console
.log('55555');
let data2
= fs
.readFileSync('./b.txt','utf-8');
console
.log('666666');
let data3
= fs
.readFileSync('./b.txt','utf-8');
console
.log('777777');
let data4
= fs
.readFileSync('./b.txt','utf-8');
console
.log('8888888');
path路径模块
NodeJS中的相对路径与绝对路径
前端相对路径 ./ :相当于当前文件所在的文件夹nodejs相对路径 ./:相对于执行node命令所在的文件夹在node中,每个js文件都有两个全局变量
__dirname:当前js文件所在的文件夹绝对路径__filename:当前文件本身的绝对路径 path路径模块作用 作用和自己拼接差不多,但是容错率更高
自动识别当前操作系统的磁盘分隔符,会自动添加纠错功能:如果磁盘分隔符写错了,path模块会自动纠正
const path
= require('path');
let aPath
= `${__dirname}/a.txt`;
console
.log(aPath
);
let bPath
= path
.join(__dirname
, '\\/data', '///\\a.txt');
console
.log(bPath
);
const fs
= require('fs');
fs
.readFile(aPath
, 'utf-8', (err
, data
)=> {
if (err
) throw err
;
console
.log(data
);
});
http服务器模块
http模块搭建服务器
导入模块创建服务器打开服务器
const http
= require('http')
let server
= http
.createServer((req
,res
)=>{
console
.log(req
.url
);
console
.log(decodeURI(req
.url
));
});
server
.listen(3000,()=>{
console
.log('服务器开启成功');
});
http模块响应请求 注意:
end()参数只能是两种类型 字符串 和二进制如果想要响应对象,需要转成json格式字符串
const http
= require('http');
let server
= http
.createServer((req
, res
) => {
console
.log(req
.url
);
res
.writeHead(200, {
'Content-Type': 'text/html;charset=utf8',
});
res
.end(JSON.stringify({ name
: '二傻子', age
: 20 }));
});
server
.listen(3000, () => {
console
.log('服务器开启成功');
});
http模块根据不同的请求响应不同的数据http模块响应html文件 需求: (1)请求路径为首页 : / . 响应:index.html (2)请求路径为: /login 响应: login.html (3)请求路径为: /list 响应: list.html (4)其他路径 : 响应: 404.html
const http
= require('http');
const fs
= require('fs');
const path
= require('path');
let server
= http
.createServer((req
, res
) => {
console
.log(req
.url
);
if (req
.url
== '/') {
fs
.readFile(
path
.join(__dirname
, 'www', 'index.html', (err
, data
) => {
if (err
) throw err
;
res
.end(data
);
})
);
} else if (req
.url
== '/login') {
fs
.readFile(
path
.join(__dirname
, 'www', 'login.html', (err
, data
) => {
if (err
) throw err
;
res
.end(data
);
})
);
} else if (req
.url
== '/list') {
fs
.readFile(
path
.join(__dirname
, 'www', (err
, data
) => {
if (err
) throw err
;
res
.end(data
);
})
);
} else {
fs
.readFile(
path
.join(__dirname
, 'www', '/404.html', (err
, data
) => {
if (err
) throw err
;
res
.end(data
);
})
);
}
server
.listen(3000,()=>{
console
.log('服务器成功开启');
})
});