• 面试题——网址 (url) 的组成、url模块、querystring模块、mime模块、各种路径、静态资源托管、网页的加载流程


    目录

    一、网址 (url) 的组成

    二、url模块

    三、querystring模块

    四、mime模块

    五、url querystring http fs mime模块的混合使用——静态网站

    六、各种路径

    1、本地相对路径:

    2、本地绝对路径:

    3、相对网络路径:

    4、绝对网络路径:

    5、本地相对根路径:

    6、网络相对根路径:

    七、静态资源托管

    八、网页的加载流程 ——面试题


    一、网址 (url) 的组成

    协议: //ip:port/pathname?querystring#hash

    http://192.168.5.10:8081/home/index.html?count=20&user=karen#top

    http:协议

    192.168.5.10:8081:IP

    8081:port

    ip:port: 域名

    home/index.html:pathname

    count=20&user=karen:queryString

    top:hash

    域名==>DNS解析:会把域名解析为一个 IP port

    二、url模块

    网址是一个字符串

    url模块 ==> 可以把url网址解析为一个对象

    var urlobj=url.parse(req.url) urlobj.pathname urlobj.query

    1. var url=require("url")
    2. var str="http://192.168.5.10:8081/home/index.html?count=20&user=karen"
    3. var urlobj=url.parse(str)
    4. console.log(urlobj)

     得到一个对象,里面有:protocol auth port hostname hash query path href 等等

     利用对象里面的来获取网址:

    1. var http=require("http")
    2. var fs=require("fs")
    3. var url=require("url")
    4. var app=http.createServer((req,res)=>{
    5. console.log(req.url) // /home/index.html?count=20&user=karen
    6. var path=url.parse(req.url).pathname ///home/index.html
    7. fs.readFile(__dirname+path,(err,data)=>{
    8. if(err){res.end("not 404")}
    9. else{
    10. //__dirname+path==> http://192.168.5.10:8081/home/index.html
    11. res,end(data)
    12. }
    13. })
    14. })
    15. app.listen(8081)

    三、querystring模块

    可以把querystring参数解析为一个对象

    var urlobj=url.parse(req.url)

    var queryobj=querystring.parse(urlobj.query)

    1. var querystring=require("querystring")
    2. var obj=querystring.parse("count=20&user=karen") // 字符串 转 对象
    3. var str2=querystring.stringify({name:"jack",age:20}) // 对象 转 字符串
    4. var str3=JSON.stringify({name:"jack",age:20}) //对象 转 字符串
    5. console.log(obj,str2,str3)
    6. //[Object: null prototype] { count: '20', user: 'karen' } name=jack&age=20 {"name":"jack","age":20}

    应用:

    1. // url querystring http fs一起使用
    2. var url=require("url")
    3. var querystring=require("querystring")
    4. var http=require("http")
    5. var fs=require("fs")
    6. var app=http.createServer((req,res)=>{
    7. let urlobj=url.parse(req.url) //将字符串转为对象
    8. let pathname=urlobj.pathname //获取pathname。也就是端口号后面的一部分
    9. if(pathname=="/"){pathname="/index.html"}
    10. let path=__dirname+"/src"+pathname
    11. fs.readFile(path,(err,data)=>{
    12. if(!err){
    13. res.setHeader("content-Type","text/html")
    14. res.end(data)
    15. }
    16. else if(pathname=="/login"){
    17. let queryobj=querystring.parse(urlobj.query)
    18. console.log(queryobj)
    19. //把前端传过来的数据 去处理
    20. res.end("hello")
    21. }
    22. else if(pathname=="/car"){
    23. res.end("666666car")
    24. }
    25. else {
    26. res.end("404 not found")
    27. }
    28. })
    29. })
    30. app.listen(8080)

    四、mime模块

    在小黑窗里下载:  npm i mime

    1. var mime=require("mime")
    2. mime.getType()
    3. var re=mime.getExtension("text/css")
    4. console.log(re) //css
    5. var re2=mime.getType("ckshf.jpg") //如果写hja.css 结果就是:text.css
    6. console.log(re2) // imge/jpg

    五、url querystring http fs mime模块的混合使用——静态网站

    1. var mime=require("mime")
    2. var url=require("url")
    3. var querystring=require("querystring")
    4. var http=require("http")
    5. var fs=require("fs")
    6. var app=http.createServer((req,res)=>{
    7. let urlobj=url.parse(req.url)
    8. let pathname=urlobj.pathname
    9. if(pathname=="/"){pathname="/index.html"}
    10. let path=__dirname+"/src"+pathname
    11. fs.readFile(path,(err,data)=>{
    12. if(!err){
    13. let type1=mime.getType(path) //检测文件的类型后缀
    14. res.setHeader("content-Type",type1)
    15. res.end(data)
    16. }
    17. })
    18. })
    19. app.listen(8080)

    六、各种路径

    1、本地相对路径:

     在这个页面中写路径: file://x1/x2/x2/index.html  

    "./src/18.jpg"  写这个路径的文件的页面是在本地打开的==> file://x1/x2/x2/src/18.jpg

    "src/18.jpg" 写这个路径的文件的页面是在本地打开的 ==> file://x1/x2/x2/src/18.jpg

    "file://c:/"

    本地打开:文件双击打开,open in broswe不算

    2、本地绝对路径:

    从根盘符开始写路径:   D/前端/代码/1.html

    3、相对网络路径:

    当前页面的网址:  "协议://ip:port /src/news / index.html  querystring hash"

    (pathname=/src/news/index.html)

    页面内部的路径:

     "./src/18.jpg" ==> 真实的网址:"协议://ip:port /src/news / src/18.jpg"

    "src/18.jpg" ==> "协议://ip:port /src/news / src/18.jpg"

     例子1:

    用户输入网址: "http://192.168.6.60:8080/user/20220728/newspage.html?n=20"

    打开了一个页面,在这个页面中有一个img的src是 : "./src/18.jpg"

    请问192.168.6.60:8080这个服务器会收到req.url是什么?

    答: "/user/20220728/src/18.jpg"

    例子2:

    用户输入网址:  "http://192.168.6.60:8080/user/20220728/newspage"

    打开了一个页面,在这个页面中有一个img的src是 : "./src/18.jpg"

    请问192.168.6.60:8080这个服务器会受到req.url是什么?

    答: "/user/20220728/src/18.jpg"

    它真正的网址:"http://192.168.6.60:8080/user/20220728/src/18.jpg"

    4、绝对网络路径:

    “协议://ip:port /src/news/src/18,jpg ”

    易错思考:

    用户输入网址: http://192.168.6.60:8080/user/20220728/newspage

    打开了一个页面,在这个页面中有一个img的src是 : "192.168.6.60:8080/src/18.jpg"

    请问192.168.6.60:8080这个服务器会受到req.url是什么?

    答: "/user/20220728/192.168.6.60:8080/src/18.jpg"

    它真正的网址:"http://192.168.6.60:8080/user/20220728/192.168.6.60:8080/src/18.jpg"

    5、本地相对根路径:

    例子:

    用户本地打开: "file:///c:/xx/xx2/index.html"

    页面中有一个img的src是 : "/src/18.jpg"

    它真正的路径:"file:///c:/src/18.jpg"

    6、网络相对根路径:

    "/src/18.jpg"   前面不加点

    思考:

    用户输入网址: http://192.168.6.60:8080/user/20220728/newspage

    打开了一个页面,在这个页面中有一个img的src是 : "/src/18.jpg"

    请问192.168.6.60:8080这个服务器会受到req.url是什么?

    答:"/src/18.jpg"

    它真正的网址:"http://192.168.6.60:8080/src/18.jpg"

    七、静态资源托管

    前端本地打开 本地相对路径 和 后端打开相对网络路径,都能打开那张img

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>title>
    6. head>
    7. <body>
    8. <img src="./img/18.jpg">
    9. <img src="C:\Users\Administrator\Desktop\代码\15-静态资源托管\img\18.jpg">
    10. body>
    11. html>

    八、网页的加载流程 ——面试题

    一个网页的渲染资源是一个个动态加载的数据组合而成的,不是一次就把整个渲染的页面加载了

    1.用户浏览器地址栏输入网址==>请求后端(请求一次服务器),后端传输一份html编码的文本文档(返回一个数据包),然后就断开连接了

    2.浏览器开始运行html文件的编码

    (这个时候图片、js、css、字体库资源等)

    解析时遇到了img-src属性 会异步的  再次请求另外一个网址(与上一次的是无关的,相互独立的)==>后端传输一份image编码的文件(一个数据包--图片编码),然后断开连接,浏览器把图片的编码按照CSS结构进行渲染

    解析时遇到了 link-href属性  会异步的  会再次请求另外一个网址==>后端传输一份对应编码的文件(css编码),然后断开连接

    解析时 xxxx-url会异步的 开始再次网络请求服务器 ,服务器返回数据包(对应编码) 然后加载

    解析时script-src会异步的 开始再次网络请求服务器 ,服务器返回数据包(js编码) 然后用js引擎去执行编码

    解析时遇到了 网络请求的代码等等....

    3.页面渲染

    页面按照解析好的  DOM模型 和 CSS层叠样式表 结合为renderTree,然后绘制页面

    (所有的资源加载完毕后,才会触发winodw.onload)

    经典面试题:用户从输入url到页面渲染过程发生了什么?

  • 相关阅读:
    SQL创建数据库
    【STM32单片机】贪吃蛇游戏设计
    仿制 Google Chrome 的恐龙小游戏
    您需要 “企业内容管理“(ECM)还是 “文档管理系统”(DMS)?
    docker 知识仓库
    代理IP如何助力社交媒体数据挖掘
    vue3源码分析——解密nextTick的实现
    最新ChatGPT程序源码+AI系统+详细图文部署教程/支持GPT4.0/支持Midjourney绘画/Prompt知识库
    精灵图和 base64 之间如何选择?
    常用web协议学习与抓包实战
  • 原文地址:https://blog.csdn.net/qq_52301431/article/details/126031549