• 后端 ---- 面试题 / 笔试题


    目录

    1、node.js是单线程还是多线程,为何是单/多线程?

    2、为何是单线程,还能是非阻塞?

    3、commonJS 中的 require/exports  和  ES6 中 import/export 的区别是什么

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

    5、AJAX的理解和代码

    6、跨域的理解

    7、跨域解决方案----CORS的原理与理解

    8、跨域解决方案----JSONP的原理与理解

    9、跨域解决方案----Proxy的原理与理解


    1、node.js是单线程还是多线程,为何是单/多线程?

    答:

    1) 单线程

    2) 原因:因为node.js的主线程 是程序员写的这个线程 这个线程的代码是v8在运行 js代码,它提供的异步函数是底层c/c++在开启线程执行任务

    2、为何是单线程,还能是非阻塞?

    答:

    1) 因为node.js的主线程 是程序员写的这个线程 这个线程的代码是v8在运行 js代码,它提供的异步函数是底层c/c++在开启线程执行任务。

    2) 我们写的代码是js代码,是单线程。但是有一些异步函数是nodejs底层在开线程运行。
     

    3、commonJS 中的 require/exports  和  ES6 中 import/export 的区别是什么

    commonJS 中的 require/exports:

    commonJS 模块的重要特性是 加载时执行,及脚本代码在 require 的时候,就会全部执

    行。一 旦出现某个模块被“循环加载”就只输出已经执行的部分,还没有执行的部分是不输

    出的。require可以用在函数、事件里面,跟懒加载相似

    ES6 中 import/export:

    ES6 模块是动态引用,如果使用 import 从一个模块加载变量,那些变量不会缓存,而

    是成 为 一个指向被加载模块的引用,import/export 最终都是编译为 require/exports 来执

    行的。 import它只能写在顶部、开始部分。

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

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

    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到页面渲染过程发生了什么?

    5、AJAX的理解和代码

    1) AJAX是在不刷新页面的情况下去请求数据,然后把这个数据局部刷新的页面上(DOM)的技术       

    2) 原生代码的大致步骤:

    1.创建ajax对象 (创建一个能做网络请求的对象) 兼容性写法,前面是现代浏览器的写法,后面是低版本的IE浏览器  

                let xhr = new XMLHttpRequest() || new ActiveXObject("Microsoft.XMLHTTP")

    2.配置连接信息 ==> 请求方式是GET还是POST,以及要请求公司的网址url(绝对网络路径、相对网络路径(常用)都可以)和 是否异步请求,默认是true

                xhr.open("GET", `http://192.168.6.60:8080/ajax1?name=karen&count=20`, true)

    3.配置其他选项:xhr 还有很多方法和属性可以配置,也有默认配置

    4.发送网络请求send  括号里只能填字符串,字符串不会发给后端,只有上面是POST的时候,才发给后端

                xhr.send()

    5.监听网络请求状态 ==> xhr对象里有一个readyState属性,用来监听管道

                    1:与其它电脑连接,并且连上了,建立了连接

                    2:后端正在处理信息

                    3:重新连另外一个管道了

                    4:后端将数据发过来了,我可以收了

    6.判断如果网络状态为4  也就是后端返回数据包了  如果数据包中状态码为200说明数据正确

               xhr.onreadystatechange=function(){

                   if(xhr.readyState == 4 && xhr.status == 200) {console.log(xhr.responseText) }

                }

    7.处理数据  操作页面

    6、跨域的理解

    浏览器为了用户的信息安全,网页中有一个网络请求技术:AJAX 在网络请求时,请求的网址和当前页面的网址,不是同一台服务器,就会被拒绝接受服务器发送的数据

    如果用户访问我们的A服务器的网页,网页内部的AJAX 去请求B服务器的数据接口

    就算是B服务器把json数据发送给了用户的浏览器,但是浏览器因为同源策略的原因 会阻止数据使用

    这种现象就是跨域了,具体的跨域的两个服务器的标识是: 协议 ip port  

    同源策略:

    为了网络安全,浏览器有一个同源策略

    两个网址的 协议、ip、port三者一样就代表同源,后面的pathname、query可以不一样

    协议 ip 端口 三者只要有一个不一样 就不允许用ajax跨域访问数据异源资源

    在这两个条件下,才会跨域:非同源、AJAX

    7、跨域解决方案----CORS的原理与理解

    在实际生产或者项目的开发阶段 有时候真的需要跨域访问资源

    可以在后端发送数据包时  在数据包的头部配置 这个数据包被跨域请求时的 跨域资源共享 白名单,也就是:

    res.setHeader("Access-Contrl-Allow-Origin","具体的白名单域,可以配置*")

    res.setHeader( 'Access-Control-Allow-Origin' , 'http://192.168.1.10/8081')

    res.setHeader( 'Access-Control-Allow-Origin' , '*')

    Origin也可以写其它的,比如method

    8、跨域解决方案----JSONP的原理与理解

    前端提前设置一个函数假设函数名为fn1,然后把fn1这个字符串用script标签的src属性发送给后端

    后端解析出参数querystring中的fn1字符串 把后端的json数据 拼接成 'fn1(json数据)' 这个字符串发送给前端

    前端因为是用的script请求的资源因此:不会有跨域限制,并且会把得到的资源用v8去运行  然后就会执行fn1这个函数

    提前设定好的函数fn1就可以接受到网络请的数据  这种利用了script去跨域请求的设计就是JSONP

    9、跨域解决方案----Proxy的原理与理解

    1)原理与理解

    在开发阶段 最常用的手段,比如Vue,React,等前端框架中,常常有一个自己的开发服务器  

    如果用户访问我们的A服务器的网页,

    网页内部的AJAX 去请求A服务器的数据接口,是不会跨域的

    然后A服务器去请求B服务器的数据,再把返回给A服务器的数据 返回的用户

    A服务器就是一个代理服务器

    2)代理的常见的配置:

     

  • 相关阅读:
    DP53 取数游戏
    mac 本地搭建go-admin
    帆软报表决策系统 上传excel文件
    React - Ant Design3.x版本安装使用,并按需引入和自定义主题
    Linux网络编程|TCP编程
    9.Linux实操指令(压缩和解压缩指令)
    docker安装filebeat 进行日志收集
    Linux网络编程(socket的udp通信)
    List集合对象去重及按属性去重的8种方法
    基于MATLAB的无人机路径规划设计
  • 原文地址:https://blog.csdn.net/qq_52301431/article/details/126115765