web APIs——第一天(上)

news2024/11/17 10:02:48

变量声明的时候建议 const优先,尽量使用const

原因:

  • const语义化更好
  • 很多变量我们声明的时候就知道他不会被更改了,那为什么不用const呢?
  • 实际开发中也是,比如react框架,基本const
  • 如果你有纠结的时候,建议:
    • 有了变量先给const,如果发现它后面是要被修改的,再改为let
  • const声明的值不能更改,而且const声明变量的时候需要里面进行初始化
  • 但是对于引用数据类型,const声明的变量,里面存的不是值,不是值,是地址
  • 数组和对象使用const来声明

以下的可不可以把let改为const

因为const并不表示定义的值是不可变的,它表示的是变量本身不可被重新赋值。当你用const定义一个数组或对象时,该数组或对象本身仍然是可变的,你可以对其进行修改或添加新的属性。地址没有改变。就比如拿你自己来说,你昨天穿了三件衣服,今天穿了两件,但是你还是你地址。

1、Web API基本认知

1.1 作用和分类

作用:就是使用JS去操作html和浏览器

分类:DOM(文档对象模型)、BOM(浏览器对象模型)

1.2 什么是DOM

DOM(Document Object Model——文档对象模型)是用来呈现以及与任意HTML或XML文档交互的API

白话文:DOM是浏览器提供的一套专门用来操作网页内容的功能

DOM作用:

  • 开发网页内容特性和实现用户交互

1.3 DOM树

将HTML文档以树状结构直观的表现出来,称为文档树或DOM树

描述网页内容关系的名词

作用:文档树直观的体现了标签与标签之间的关系

1.4 DOM对象

DOM对象:浏览器根据html标签生成的JS对象(DOM对象)

  • 所有的标签属性都可以在这个对象上面找到
  • 修改这个对象的属性会自动映射到标签身上

DOM的核心思想

  • 把网页内容当做对象来处理

document对象

  • 是DOM里提供的一个对象
  • 所以它提供的属性和方法都是用来访问和操作网页内容的
    • 例:document.write()
  • 网页所有内容都在document里面

2、获取DOM对象

2.1 根据CSS选择器来获取DOM元素(重点)

查找元素DOM元素就是利用JS选择页面中标签元素

2.1.1 选择匹配的第一个元素

语法:document.querySelector('css选择器')

参数:包含一个或多个有效的CSS选择器 字符串

返回值:

        CSS选择器匹配的第一个元素,一个HTMLElement对象。

        如果没有匹配到,则返回null。

获取一个DOM元素可以直接操作修改。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            width: 100px;
            height: 200px;
        }
    </style>
</head>
<body>
    <div class="box">123</div>
    <div class="box">abc</div>
    <p id="nav">导航栏</p>
    <ul>
        <li>测试1</li>
        <li>测试2</li>
        <li>测试3</li>
    </ul>
    <script>
        // 1.获取匹配的第一个元素
        // const box = document.querySelector('div')
        const box = document.querySelector('.box')
        console.log(box) // 都是显示123,不会显示abc,因为只选第一个

        // 获取p
        const nav = document.querySelector('#nav')
        console.log('nav'); // nav
        //nav.style.color = 'red' // 可以修改
        
        // 获取第一个小ulli
        const li = document.querySelector('ul li:first-child')
        console.log(li);

    </script>
</body>
</html>

2.1.2 选择匹配的多个元素 

语法:document.querySelectorAll('css选择器')

参数:包含一个或多个有效的CSS选择器 字符串

返回值:CSS选择器匹配的NodeList 对象集合

获取多个DOM元素不可以修改,只能通过遍历的方式一次给里面的元素做修改

// 根据2.1.1的选择所有的小li
document.querySelectorAll('ul li')

使用 document.querySelectorAll('css选择器')

得到的是一个伪数组:

  • 有长度有索引的数组
  • 但是没有pop()、push()等数组方法

想要等到里面的每个对象,则需要遍历(for)的方式获得。

2.1.3 练习 

请控制台依次输出3个li的DOM对象

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <ul class="nav">
        <li>我的首页</li>
        <li>产品介绍</li>
        <li>联系方式</li>
    </ul>

    <script>
        // 1.获取元素
        const lis = document.querySelectorAll('.nav li')
        // console.log(lis);
        for(let i = 0; i < lis.length; i++){
            console.log(lis[i]); // 每一个小li对象
        }
    </script>
</body>
</html>

 注意:哪怕只有一个元素,通过querySelectAll()获取过来的也是一个伪数组,里面只有一个元素而已

2.2 其他获取DOM元素方法(了解)

    <script>
        // 其他获取DOM元素方法(了解)
        // 根据id获取一个元素
        document.getElementById('nav')
        // 根据标签获取一类元素 获取页面 所有div
        document.getElementsByTagName('div')
        // 根据 类名获取元素 获取页面 所有类名为 w的
        document.getElementsByClassName('w')
    </script>

3、操作元素内容

DOM对象都是根据标签生成的,所以操作标签,本质上就是操作DOM对象。

就是操作对象使用的点语法。

如果想要修改标签元素的里面的内容,则可以使用如下几种方式:

  • 对象.innerText属性
  • 对象.innerHTML属性

3.1 对象.innerText属性

  • 将文本内容添加/更新到任意标签位置
  • 显示纯文本,不解析标签
<body>
    <div class="box">我是文字的内容</div>
    <script>
        // const obj = {
        //     name:'red'
        // }
        // console.log(obj.name);
        // // 修改内容
        // obj.name = 'blue'

        // 1. 获取元素
        const box = document.querySelector('.box')
        // 2. 修改文字内容   对象.innerText 属性
        console.log(box.innerText) // 获取文字内容
        // box.innerText = '我是一个盒子'  // 修改文字内容
        box.innerText = '<strong>我是一个盒子</strong>'  // 不解析标签
    </script>
</body>

3.2 对象.innerHTML属性

  • 将文本内容添加/更新到任意标签位置
  • 会解析标签,多标签建议使用模板字符
<body>
    <div class="box">我是文字的内容</div>
    <script>
        // 1. 获取元素
        const box = document.querySelector('.box')
        // 2. innerHTML 解析标签
        console.log(box.innerHTML);
        // box.innerHTML = '我要更换'
        box.innerHTML = '<strong>我要更换</strong>'
    </script>

3.3 练习 

年会抽奖案例

需求:从数组随机抽取一等奖、二等奖和三等奖,显示到对应的标签里面

素材:

  • html文件结构
  • 数组名单'周杰伦','刘德华','周星驰','黎明','张学友'

分析:

  1. 声明数组:const personArr = ['周杰伦','刘德华','周星驰','黎明','张学友']
  2. 一等奖:随机生成一个数字(0-数组长度),找到对应数组的名字
  3. 通过innerText或者innerHTML将名字写入span元素内部
  4. 二等奖依次类推
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .wrapper {
            width: 840px;
            height: 420px;
            background: url(./images/bg01.jpg) no-repeat center / cover;
            padding: 100px 250px;
            box-sizing: border-box;
        }
    </style>
</head>
<body>
    <div class="wrapper">
        <strong>年会抽奖</strong>
        <h1>一等奖:<span id="one">???</span></h1>
        <h3>一等奖:<span id="two">???</span></h3>
        <h5>一等奖:<span id="three">???</span></h5>
    </div>
    <script>
        // 1.声明数组
        const personArr = ['周杰伦','刘德华','周星驰','黎明','张学友']
        // 2. 先做一等奖
        // 2.1 随机数 数组的下标
        const random = Math.floor(Math.random()*personArr.length)
        // console.log(personArr[random]);
        // 2.2 获取one 元素
        const one = document.querySelector('#one')
        // 2.3 把名字给one
        one.innerHTML = personArr[random]
        // 2.4 删除数组这个名字
        personArr.splice(random,1)
        // console.log(personArr);


        // 3. 二等奖
        // 3.1 随机数 数组的下标
        const random2 = Math.floor(Math.random()*personArr.length)
        // console.log(personArr[random2]);
        // 3.2 获取two元素
        const two = document.querySelector('#two')
        // 3.3 把名字给one
        two.innerHTML = personArr[random2]
        // 3.4 删除数组这个名字
        personArr.splice(random2,1)
        // console.log(personArr);
        
        // 4. 三等奖
        // 4.1 随机数 数组的下标
        const random3 = Math.floor(Math.random()*personArr.length)
        // console.log(personArr[random3]);
        // 4.2 获取three元素
        const three = document.querySelector('#three')
        // 4.3 把名字给one
        three.innerHTML = personArr[random3]
        // 4.4 删除数组这个名字
        personArr.splice(random3,1)
        // console.log(personArr);
    </script>
</body>
</html>

4、操作元素属性

复习:splice()方法用于添加或删除数组中的元素

注意:这种方法会改变原始数组。

4.1 操作元素常用属性

可以通过JS设置/修改标签元素属性,比如通过src更换图片

最常见的属性比如:href、title、src等

语法:对象.属性 = 值

    <img src = "./images/1.webp" alt = " ">
    <script> 
        // 1. 获取元素
        const pic = document.querySelector('img')
        // 2. 操作元素
        pic.src = './images/bo2.jpg'
        pic.title = '你好啊'
    </script>

4.1.1 练习

 页面刷新,图片随机更换

需求:当我们刷新页面,页面中的图片随机显示不同的图片

分析:

①:随机显示,则需要用到随机函数

②:更换图片需要用到的图片src属性,进行修改

③:核心思路:

  1. 获取图片元素
  2. 随机得到图片序号
  3. 图片.src=图片随机路径
<body>
    <img src="./images/1.webp" alt="">
    <script>
    // 取得N—M的随机整数
    function getRandom(N,M){
        return Math.floor(Math.random()*(M - N +1)) + N 
    }
    // 1. 获取图片对象
    const img = document.querySelector('img')
    // 2. 随机得到序号
    const random = getRandom(1,6)
    // 3. 更换路径
    img.src = `./images/${random}.webp`
    </script>
</body>

4.2 操作元素样式属性

通过JS设置/修改标签元素的样式属性

  • 比如通过轮播图小圆点自动更换颜色样式
  • 点击按钮可以滚动图片,这是移动的图片的位置left等等

 4.2.1 通过style属性操作CSS

语法:对象.style.样式属性 = 值

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            width: 300px;
            height: 500px;
            background-color: pink;
        }
    </style>
</head>
<body>
    <div class="box"></div>
    <script>
        // 1. 获取元素
        const box = document.querySelector('.box')
        // 2. 修改样式属性  对象.style.样式属性 = '值'  要跟单位
        box.style.width = '300px'
        // 多组单词的采取 小驼峰命名法
        box.style.backgroundColor = 'hotpink'
        box.style.border = '2px solid blue'
        box.style.borderTop = '2px solid red'
    </script>
</body>
</html>

注意:

  1. 修改样式通过style属性引出
  2. 如果属性有-连接符,需要转换为小驼峰命名法
  3. 赋值的时候,需要的时候不要忘记加CSS单位 

练习:页面刷新,页面随机更换背景图片

需求:当我们刷新页面,页面中的背景图片随机显示不同的图片

分析:

①:随机函数

②:css页面背景图片background-image

③:标签选择body,因为body是唯一的标签,可以直接写document.body.style

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body {
            background: url(./images/desktop_1.jpg) no-repeat top center /
            cover;
        }
    </style>
</head>
<body>
    <script>
        // console.log(document.body);
        // 获取N-M的随机整数
        function getRandom(N,M){
            return Math.floor(Math.random()*(M - N + 1)) + N 
        }  
        // 随机数
        const random = getRandom(1,10)
        document.body.style.backgroundImage = `url(./images/desktop_${random}.jpg)`
        </script>
</body>
</html>

 4.2.2 操作类名(className)操作css

如果修改的样式比较多,直接通过style属性修改比较繁琐,可以通过借助于css类名的形式。

语法:

// active 是一个css类名
元素.className = 'active'

注意:

  • 由于class是关键字,所以使用className去代替
  • className是使用新值换旧值,如果需要添加一个类,需要保留之前的类名
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div {
            width: 200px;
            height: 200px;
            background-color: red;
        }
        .nav {
            background-color: blue;
        }
        .box {
            width: 300px;
            height: 300px;
            background-color: skyblue;
            margin: 100px auto;
            padding: 10px;
            border:1px solid black;
        }
    </style>
</head>
<body>
    <div class="nav">123</div>
    <script>
        // 1.获取元素
        const div = document.querySelector('div')
        // 2.添加类名 class是这个关键字 我们用className
        div.className = 'nav box'
    </script>
</body>
</html>

4.2.3 通过classList操作类控制css 

解决className容易覆盖以前的类名,可以通过classList方式追加和删除类名

语法:

// 追加一个类
元素.classList.add('类名')
// 删除一个类
元素.classList.remove('类名')
// 切换一个类
元素.classList.toggle('类名')
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            width: 200px;
            height: 200px;
            color: royalblue;
        }
        .active {
            color: red;
            background-color: pink;
        }
    </style>
</head>
<body>
    <div class="box">文字</div>
    <script>
        // 通过classList添加
        // 1. 获取元素
        const box = document.querySelector('.box')
        // 2. 修改样式  
        // 2.1 追加类 add() 类名不加点,并且是字符串
        // box.classList.add('active')
        // 2.2 删除类 remove() 类名不加点,并且是字符串
        // box.classList.remove('box') 
        // 2.3 切换类 toggle()  有还是没有,有就删掉,没有就加上
        box.classList.toggle('active')

    </script>
</body>
</html>

使用className和classList的区别?

  • 修改大量样式的更方便
  • 修改不多样式的时候方便
  • classList是追加和删除不影响以前类名 

4.3 操作表单元素属性

表单有很多情况,也需要修改属性,比如点击眼睛,可以看到密码,本质是把表单类型转换为文本框正常的有属性有取值的跟其他的标签属性没有任何区别

获取:DOM对象.属性名

设置:DOM对象.属性名=新值

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

</head>

<body>
    <input type="text" value="请输入">
    <button disabled>按钮</button>
    <input type="checkbox" name="" id="" class="agree">
    <script>
        // 1. 获取元素
        let input = document.querySelector('input')
        // 2. 取值或者设置值  得到input里面的值可以用 value
        // console.log(input.value)
        input.value = '小米手机'
        input.type = 'password'

        // 2. 启用按钮
        let btn = document.querySelector('button')
        // disabled 不可用   =  false  这样可以让按钮启用
        btn.disabled = false
        // 3. 勾选复选框
        let checkbox = document.querySelector('.agree')
        checkbox.checked = false
    </script>
</body>

</html>

4.4 自定义属性

标准属性:标签自带的属性 比如class id title等,可以直接使用点语法操作比如:disabled、checked、selected

自定义属性:

  • 在html5中推出了专门的data-自定义属性
  • 在标签上一律以data-开头
  • 在DOM对象上一律以dataset对象方式获取
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

</head>

<body>
   <div data-id="1"> 自定义属性 </div>
    <script>
        // 1. 获取元素
        let div = document.querySelector('div')
        // 2. 获取自定义属性值
         console.log(div.dataset.id)
      
    </script>
</body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1115848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次Clickhouse 复制表同步延迟排查

现象 数据从集群中一个节点写入之后&#xff0c;其他两个节点无法及时查询到数据&#xff0c;等了几分钟。因为我们ck集群是读写分离架构&#xff0c;也就是一个节点写数据&#xff0c;其他节点供读取。 排查思路 从业务得知&#xff0c;数据更新时间点为&#xff1a;11:30。…

信驰达RF-BM-2340x系列BLE蓝牙模块正式登录TI官网

信驰达作为TI中国低功耗连接技术第三方IDH&#xff0c;RF-BM-2340x系列低功耗蓝牙模块正式通过TI认证并在全球进行推广。 图 1 TI官网信驰达RF-BM-2340x系列BLE蓝牙模块 一直以来&#xff0c;信驰达重视在无线射频通信领域基础技术上的投入&#xff0c;奠定了公司在低功耗蓝牙…

Redis数据结构之SDS

前言 字符串在 Redis 中的应用场景十分广泛&#xff0c;所有的键都是字符串类型&#xff0c;值也可能是字符串类型。 比如电商系统用 Redis 缓存商品信息&#xff0c;可以把商品 ID 作为键&#xff0c;商品信息序列化为 JSON 后作为值写入&#xff1a; SET item:1001 {"…

使用python自动化操作如何使用subprocess,mac如何查看软件安装路径

使用下面这种方法实现需要配置全局的环境变量&#xff0c;很麻烦 import subprocessdef open_wps_new_doc():try:# 打开WPS应用程序subprocess.Popen(wps)# 等待一段时间&#xff0c;确保WPS完全打开time.sleep(2)# 发送快捷键组合&#xff0c;新建一个Word文档pyautogui.hotk…

linux进阶(3)

课程链接 CH10-2-Apache的其他用途_哔哩哔哩_bilibili scp不够好,因为他需要知道服务器上具体的一个目录

MySQL -- 数据库基础

MySQL – 数据库基础 文章目录 MySQL -- 数据库基础一、基础知识1.什么是数据库2.连接服务器3.服务器、数据库、表的关系3.MySQL架构4.SQL分类5.存储引擎 一、基础知识 1.什么是数据库 文件存储数据有以下几个缺点&#xff1a; 文件的安全性问题文件不利于数据查询和管理文件…

【ARM AMBA5 CHI 入门 12.2 -- CHI 协议层详细介绍 】

文章目录 1 协议层1.1 协议层传输通道1.2 域段1.2.1 ID域段1.2.2 其他关键域段1.2.2.1 Address1.2.2.2 Secure bit1.2.2.3 Memory Attributes1.2.2.4 Transaction attribute combinations 1.4.1 Transaction 路由1.4.2 SAM 介绍1.4.3 Node ID 1.5 节点间数据怎么传输的呢&#…

jdk11的HttpClient

我们都知道在jdk11之前都在用okhttp或者org.apache.httpcomponents 其实早在jdk9的时候这个方案就在孵化中 上面的截图来自openjdk的官网&#xff0c;注&#xff1a;openjdk是个开源项目&#xff0c;不存在侵权现象 这是openjdk的官网&#xff1a;JEP 110: HTTP/2 Client (In…

vue 插槽 作用域插槽

vue 插槽 作用域插槽 **创建 工程&#xff1a; H:\java_work\java_springboot\vue_study ctrl按住不放 右键 悬着 powershell H:\java_work\java_springboot\js_study\Vue2_3入门到实战-配套资料\01-随堂代码素材\day05\准备代码\10-插槽-作用域插槽 vue --version vue crea…

安科瑞关于红外测温技术在变电站运维中的应用

安科瑞 崔丽洁 红外测温技术 特点 工作中的输变电机械设备由于电流热效应产生了红外线照射效应&#xff0c;从而在电气设备表层形成了相应的高温场&#xff0c;而红外线测温高温技术则透过吸取这些自高温场发出的红外线照射热能&#xff0c;并透过电流效应以及放大器和A/D转换器…

Linux - 还不懂 gdb 调试器?(调试软件)

前言 当前&#xff0c;我们可以使用 make/makefile 来程序化执行代码文件&#xff1b;可以使用 gcc/g 等编译器来编译代码&#xff1b;可以使用 vim 编辑器来编写代码&#xff1b;其实在 Linux 当中还有一个工具&#xff0c;可以实现调试工作&#xff0c;这个工具就是 -- gdb。…

RK3568驱动指南|第七期-设备树-第57章 实例分析:中断

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

PHP 基础

PHP 基础 概述 在PHP 文件中&#xff0c;可以与HTML 和JavaScript 混编。 开始标记<?php 表示进入PHP 模式&#xff0c;结束标记?>&#xff0c;标识退出PHP 模式。 PHP 模式之外的内容会被作为字符输出到浏览器中。 PHP 在服务端执行&#xff0c;HTML 和 JS 在浏览…

任何人不知道这款超实用的配音软件,我都会伤心的OK?

看完一段精彩的视频&#xff0c;令人陶醉的原因之一就是配音&#xff0c;有的充满感情&#xff0c;有的字正腔圆&#xff0c;相信很多人都不知道这样的声音是怎么配出来的&#xff1f;今天&#xff0c;小编就来给大家分享一款超实用的配音软件&#xff0c;不仅操作简单&#xf…

STM32:TIM通道输入捕获

本文主要讲解如何使用TIMER通道的输入脉冲捕获功能。基于STM32F7的Timer2 Channel3来进行讲解。 配置时钟 Timer2的时钟频率&#xff0c;对应APB1 Timer。 分频设置为96-1&#xff0c;这样设置每次count计数&#xff0c;对应的时间为1us。Counter设置为最大即可&#xff0c;默…

基于Java的师生交流答疑管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

Linux1024一篇通俗易懂的liunx命令操作总结(第十课)

Linux1024一篇通俗易懂的liunx命令操作总结(第十课) 一 liunx 介绍 Linux是一种免费开源的操作系统&#xff0c;它的设计基于Unix。它最早是由芬兰的一位大学生Linus Torvalds在1991年开始编写的&#xff0c;取名为Linux。Linux具有高度的灵活性和可定制性&#xff0c;可以在…

nginx负载均衡(动静分离)

nginx负载均衡&#xff08;动静分离&#xff09; 文章目录 nginx负载均衡&#xff08;动静分离&#xff09;工作原理&#xff1a;环境说明&#xff1a;部署nginx负载均衡步骤&#xff1a;在负载均衡&#xff08;NGINX&#xff09;主机上做配置&#xff1a;测试&#xff1a;在浏…

疯狂小杨哥有意退网

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 昨天我发了一个文章说&#xff1a;有1.6亿粉丝的疯狂小杨哥也似乎宣布退网&#xff0c;有些人说我胡编乱造&#xff0c;有些人说我为了博眼球什么都敢做。毕竟做了近10多年自媒体了&#xff0c;我不…

Nginx Proxy代理

代理原理 反向代理产生的背景&#xff1a; 在计算机世界里&#xff0c;由于单个服务器的处理客户端&#xff08;用户&#xff09;请求能力有一个极限&#xff0c;当用户的接入请求蜂拥而入时&#xff0c;会造成服务器忙不过来的局面&#xff0c;可以使用多个服务器来共同分担成…