在node.js环境中,有两个全局变量 __dirname ,__filename,他们保存的是字符串
__dirname是当前js文件所在的目录:绝对路径
__filename是当前js文件的目录:绝对路径
1、http模块
写一个简单的http服务器
var http=require("http") //引入node自带的模块,http这个模块可以调用函数来创建后端服务器
var app=http.createServer((req,res)=>{ //创建一个服务器对象,回调函数不会直接运行,会在用户每次访问当前计算机的ip端口运行
console.log(req.url)
if(req.url=="/999"){
res.end("hello world") //给前端最后一次发送数据包
}else{
res.end("not found")
}}
app.listen("8090") //监听计算机端口
用户在浏览器地址栏输入:http://服务器电脑的ip:端口号/999(网址)
2、fs模块
用于读取文件
fs.readFile(path,(err,data)=>{})
path 填路径 可以绝对可以相对
err代表读取失败
data代表读取成功,它是一个buffer类型的数据(二进制数据流) 可以通过toString()转化为字符串
var http=require("http")
var fs=require("fs")
var app=http.createServer((req,res)=>{
if(req.url=="/home"){
fs.readFile("./src/22.jpg",(err,data)=>{ //读取图片发送给前端
if(!err){
res.end(data)
}
})
}else{
res.end("not found")
})
app.listen(8090)
fs模块的一些操作:
//写入文件(创建文件)==>当文件不存在就会创建
fs.writeFile(__dirname+"/src/a.txt","hello world",function(err){
console.lopg(err)
}
//删除文件:如果遇到删除权限问题会删除失败
fs.unlink(__dirname+"/src/a.txt",(err)=>{
console.log(err)
}
//拼接内容到文件
fs.appendFile(__dirname+"/src/a.txt","hello world",(err)=>{
console.log(err)
}
//创建目录
fs.mkdir(__dirname+"/b",(err)=>{
console.log(err)
}
//移动/重命名文件或目录:整个功能相当于重命名一个文件/文件夹路径
//移动文件有一个bug:新路径和旧路径必须是同一个根盘
var oldpath=__dirname+"/src/a/b"
var newpath=__dirname+"/src/c/b"
fs.rename(oldpath,newpath,(err)=>{
console.log(err)
}
//拷贝文件(拷贝文件以后两个文件都会存在磁盘中)
var oldpath=__dirname+"/src/a/b"
var newpath=__dirname+"/src/c/b"
fs.copyFile(oldpath,newpath,(err)=>{
console.log(err)
}
//读取目录
fs.readdir(__dirname+"/src",(err,arr)=>{
console.log(err,arr)
}
3、url模块
可以把url网址解析为一个对象
var http=require("http")
var fs=require("fs")
var url=require("url")
var app=http.createServer((req,res)=>{
console.log(req.url)
var path=url.parse(req.url).pathname
fs.readFile(__dirname+path,(err,data)=>{
res.end(data)
})
})
app.listen(8090)
4、querystring模块
可以把querystring参数解析为一个对象
var url=require("url")
var querystring=require("querystring")
var http=quire("http")
var fs=require("fs")
var app=http.createServer((req,res)=>{
let urlobj=url.parse(req.url)
let pathname=urlobj.pathname
let path=__dirname+"/src"+pathname
console.log(path)
if(pathname=="/"){path=__dirname+"/index.html"}
fs.readFile(path,(err,data)=>{
if(!err){
res.end(data)
}else if(pathname=="/login"){
let queryobj=querystring.parse(urlobj.query)
console.log(queryobj)
res.end("hello")
}else if(pathname=="/car"){
res.end("89988car")
}
else{
res.end("404 not found")
}
})
})
app.listen(8090)
5、mime模块
var mime=require("mime")
var url=require("url")
var querystring=require("querystring")
var http=require("http")
var fs=require("fs")
var app=http.createServer((req,res)=>{
let urlobj=url.parse(req.url)
let pathname=urlobj.pathname
if(pathname=="/"){pathname="/index.html"}
let path=__dirname+"/src"+pathname
console.log(999,path)
fs.readFile(path,(err,data)=>{
if(!err){
let type1=mime.getType(path)
res.setHeader("content-Type",type1)
res.end(data)
}else if(pathname=="/login"){
let queryobj=querystring.parse(urlobj.query)
console.log(queryobj)
res.end("hello")
}else if(pathname=="/car"){
res.end("666666car")
}else{
res.end("404 not found")
}
})
})
app.listen(8080)
6、各种路径
(1)本地相对路径
在这个页面中写路径: file://x1/x2/x2/index.html
"./src/22.jpg" 写这个路径的文件的页面是在本地打开的==> file://x1/x2/x2/src/22.jpg
(2)本地绝对路径
从根盘符开始写路径:"F:\H5\课堂练习\day55\src\b\dirname.html"
(3)相对网络路径
当前页面的网址:"协议://ip:port /src/news/index.html querystring hash"
页面内部的路径:"./src/22.jpg" ==> "协议://ip:port /src/news/src/22.jpg"
(4)绝对网络路径
"协议://ip:port /src/news/src/22.jpg"
(5)网络相对根路径
"/src/22.jpg"
(6)本地相对根路径
"file:///c:/src/22.jpg"
7、网页加载流程
(1)浏览器的地址栏输入的网址,敲回车,会请求一次服务器服务器会返回一个数据包,就是网页代码(html格式的文本文档)
(2)浏览器开始去运行解析html文本(此时还没有外部,图片,js,css,字体库资源)
(3)解析时遇到了img标签的src属性会异步,开始再次网络请求服务器 ,服务器返回数据包(图片编码) 然后渲染出来
(4)解析时遇到了link-href 会异步,开始再次网络请求服务器 ,服务器返回数据包(css编码) 然后加载
(5)解析时 xxxx-url会异步,开始再次网络请求服务器 ,服务器返回数据包(对应编码) 然后加载
(6)解析时script-src会异步,开始再次网络请求服务器 ,服务器返回数据包(js编码) 然后用js引擎去执行编码
(7)所有资源加载完毕了,才会触发window.onload