web前后端 进阶学习

一、后端进阶知识

(一)服务器端编程语言

  1. Node.js
    • 概述
      • Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它允许开发者使用 JavaScript 编写服务器端代码。这意味着前后端可以使用同一种语言,降低了学习成本和代码切换的复杂性。
      • 例如,使用 Node.js 可以轻松构建高性能的网络应用程序,如 Web 服务器、实时聊天应用等。
    • 关键特性
      • 非阻塞 I/O:Node.js 采用事件驱动、非阻塞 I/O 模型。这意味着在执行 I/O 操作(如读取文件或进行网络请求)时,程序不会等待操作完成,而是继续执行其他代码。当 I/O 操作完成后,会触发相应的事件回调函数。例如,在处理多个并发的数据库查询时,非阻塞 I/O 可以提高程序的效率,使服务器能够同时处理更多的请求。
      • 模块系统:Node.js 有自己的模块系统,通过require()函数可以引入其他模块。模块可以是内置模块(如http模块用于创建 HTTP 服务器)、第三方模块(通过npm安装)或自定义模块。例如,使用express这个第三方模块可以快速搭建一个 Web 应用框架。
  2. Python(Flask 和 Django)
    • Flask
      • 概述:Flask 是一个轻量级的 Python Web 框架。它提供了简单而灵活的方式来构建 Web 应用。
      • 路由系统:通过装饰器@app.route()来定义路由。例如,@app.route('/')定义了根路由,当用户访问网站的根目录时,对应的函数会被调用。可以在函数中返回 HTML 内容或者其他数据格式(如 JSON)。
      • 模板引擎:Flask 支持多种模板引擎,如 Jinja2。模板引擎允许将数据和 HTML 模板分离,提高代码的可维护性。例如,可以在模板中使用{{ variable }}来渲染从后端传递过来的变量。
    • Django
      • 概述:Django 是一个功能强大的高级 Web 框架,它具有内置的 ORM(对象关系映射)、管理界面、安全机制等诸多功能。
      • MVC(Model - View - Controller)架构变体:Django 采用 MVT(Model - View - Template)架构。模型(Model)用于与数据库交互,视图(View)处理业务逻辑并返回响应,模板(Template)用于呈现数据。例如,在一个博客应用中,模型可以定义文章(Article)和用户(User)等实体,视图可以处理用户请求,如获取文章列表、创建新文章等,模板则负责将文章数据以 HTML 格式呈现给用户。
      • ORM:Django 的 ORM 允许开发者使用 Python 类来表示数据库表,通过操作这些类来实现对数据库的增删改查。例如,定义一个class Article(models.Model),其中的属性对应数据库表中的列,然后可以使用Article.objects.create()来创建新的文章记录。

(二)数据库管理

  1. 关系型数据库(MySQL、PostgreSQL)
    • MySQL
      • 数据存储结构:MySQL 使用表格来存储数据,表格由行和列组成。列定义了数据的类型(如INTVARCHAR等),行则是具体的数据记录。例如,在一个电商数据库中,customers表可能包含customer_id(整数类型)、customer_name(字符串类型)等列,每一行代表一个客户的信息。
      • SQL 查询:通过 SQL(Structured Query Language)语句来操作数据库。例如,SELECT * FROM customers WHERE customer_id = 1语句用于从customers表中获取customer_id为 1 的客户的所有信息。INSERT INTO customers (customer_name) VALUES ('John Doe')用于插入一条新的客户记录。
      • 索引优化:索引可以提高查询速度。例如,在经常用于WHERE子句筛选的列(如customer_id)上创建索引,可以加快查询该列的速度。但过多的索引会增加插入、更新和删除操作的时间,需要合理设计。
    • PostgreSQL
      • 高级数据类型和功能:PostgreSQL 支持更丰富的数据类型,如数组、JSON 等。例如,可以在一个表中定义一个jsonb类型的列来存储复杂的 JSON 数据。它还提供了强大的事务处理和并发控制机制,支持多版本并发控制(MVCC),能够在高并发环境下保证数据的一致性。
      • 存储过程和函数:可以在 PostgreSQL 中创建存储过程和函数来封装复杂的业务逻辑。例如,创建一个函数来计算用户的订单总额,然后在多个查询或应用程序中调用这个函数,提高代码的复用性。
  2. 非关系型数据库(MongoDB、Redis)
    • MongoDB
      • 文档型数据库:MongoDB 以 BSON(Binary JSON)格式的文档来存储数据。文档类似于 JSON 对象,是一种灵活的数据结构。例如,在一个社交媒体应用中,一个用户文档可能包含usernameemailposts(一个包含用户发布的帖子的数组)等字段。
      • 查询语言:使用 MongoDB 的查询语言来检索数据。例如,db.users.find({ "username": "johndoe" })用于查找usernamejohndoe的用户文档。它还支持复杂的查询操作,如聚合管道,可以用于对数据进行分组、统计等操作。
    • Redis
      • 键 - 值存储数据库:Redis 主要用于存储键 - 值对,并且提供了非常快速的读写操作。它的数据类型丰富,包括字符串、列表、集合、有序集合等。例如,在一个缓存系统中,可以使用 Redis 的字符串类型来缓存用户的登录状态,以用户 ID 为键,登录状态(如truefalse)为值。
      • 缓存和消息队列应用:Redis 作为缓存可以减少数据库的负载。例如,将热门商品的信息缓存到 Redis 中,当用户请求热门商品信息时,直接从 Redis 中获取,而不是每次都查询数据库。同时,Redis 可以作为简单的消息队列,通过LPUSHRPOP等命令来实现消息的入队和出队操作。

(三)服务器部署与运维

  1. 云服务器(AWS、阿里云)
    • AWS(Amazon Web Services)
      • EC2(Elastic Compute Cloud):EC2 提供可调整大小的计算容量,用户可以根据需求选择不同类型的实例(如计算优化型、存储优化型等)。例如,对于一个高流量的 Web 应用,可以选择具有高 CPU 和内存配置的实例。
      • RDS(Relational Database Service):RDS 可以方便地部署和管理关系型数据库(如 MySQL、PostgreSQL 等)。它提供了自动备份、故障转移等功能,减轻了运维的负担。例如,在多个可用区(AZ)中部署 RDS 实例,可以提高数据库的可用性,当一个可用区出现故障时,另一个可用区的实例可以继续提供服务。
    • 阿里云
      • 云服务器 ECS(Elastic Compute Service):类似于 AWS 的 EC2,ECS 提供计算资源。用户可以在阿里云控制台轻松创建、配置和管理服务器实例。例如,通过安全组设置来控制服务器的入站和出站流量,保障服务器的安全。
      • 云数据库 RDS(Relational Database Service):提供多种数据库引擎支持,并且有完善的监控和报警系统。例如,当数据库的 CPU 使用率过高或者存储空间不足时,会及时发送报警信息,方便用户进行调整。
  2. 容器化技术(Docker、Kubernetes)
    • Docker
      • 容器概念:Docker 容器是一种轻量级的虚拟化技术,它将应用程序及其依赖打包成一个独立的运行环境。例如,将一个 Web 应用和它所依赖的 Python 库、数据库配置等打包成一个 Docker 容器,这个容器可以在任何安装了 Docker 的机器上运行,而不会受到主机环境的影响。
      • 镜像构建与管理:通过Dockerfile来构建镜像。Dockerfile包含了构建容器所需的指令,如基础镜像的选择、文件的复制、命令的执行等。例如,以下是一个简单的Dockerfile用于构建一个 Node.js 应用容器:
FROM node:14
WORKDIR /app
COPY. /app
RUN npm install
CMD ["node", "app.js"]

  • Kubernetes
    • 集群管理:Kubernetes 是一个用于容器编排的开源平台,它可以管理多个 Docker 容器组成的集群。例如,它可以自动调度容器到合适的节点上运行,根据负载情况进行水平扩展或收缩。在一个大型 Web 应用中,可能有多个微服务,每个微服务都运行在一个或多个容器中,Kubernetes 可以有效地管理这些容器,确保服务的高可用性。
    • 服务发现与负载均衡:Kubernetes 提供了服务发现机制,使得容器之间可以方便地相互通信。同时,它也支持负载均衡,将外部流量均匀地分配到多个容器实例上。例如,当一个 Web 服务有多个副本运行在不同的容器中时,Kubernetes 可以通过负载均衡器将用户的请求均匀地分配到这些副本上,提高服务的性能和可靠性。

二、前端进阶知识

(一)前端框架

  1. Vue.js
    • 响应式原理
      • Vue.js 的核心是响应式数据绑定。它通过Object.defineProperty()方法来劫持数据的getput操作。例如,当一个数据属性message被定义为响应式数据后,当message的值发生变化时,Vue.js 会自动更新与之绑定的 DOM 元素。在组件内部,数据是响应式的,这使得组件的状态管理变得更加方便。
      • 组件系统:Vue.js 有强大的组件系统。组件可以看作是一个独立的、可复用的单元。例如,一个按钮组件可以在多个页面中使用。组件之间可以通过props(属性)进行父子组件通信,也可以通过事件机制进行子父组件通信。如在一个父组件中可以通过v - bind指令将数据传递给子组件,子组件可以通过$emit事件将数据传递回父组件。
  2. React.js
    • 虚拟 DOM(Document Object Model)
      • React 使用虚拟 DOM 来提高性能。虚拟 DOM 是真实 DOM 的 JavaScript 对象表示。当组件的状态发生变化时,React 会先更新虚拟 DOM,然后通过比较新旧虚拟 DOM 的差异(称为diff算法),只更新真实 DOM 中需要改变的部分。例如,在一个列表渲染的场景中,当列表中的一个元素发生变化时,React 通过虚拟 DOM 的比较,只会更新这个元素对应的真实 DOM 节点,而不是重新渲染整个列表。
      • 组件生命周期:React 组件有一系列的生命周期方法,如componentDidMountcomponentWillUnmount等。这些方法可以帮助开发者在组件的不同阶段执行相应的操作。例如,在componentDidMount方法中可以进行网络请求,获取数据并更新组件的状态;在componentWillUnmount方法中可以清理定时器、取消网络请求等操作,避免内存泄漏。

(二)前端性能优化

  1. 代码优化
    • 代码压缩与合并:使用工具(如 Webpack)对 JavaScript 和 CSS 代码进行压缩和合并。例如,Webpack 可以通过配置UglifyJsPlugin来压缩 JavaScript 代码,去除多余的空格、注释等,减小文件大小。同时,将多个小的 JavaScript 文件合并成一个或几个较大的文件,可以减少浏览器的请求次数,提高页面加载速度。
    • 懒加载(Lazy Loading):对于页面中的图片、脚本等资源,采用懒加载技术。例如,在一个长页面中,只有当图片进入浏览器的可视区域时才加载它。可以通过 JavaScript 的IntersectionObserver API 或者一些第三方库(如LazyLoad)来实现懒加载。这样可以避免一次性加载大量的资源,特别是对于移动设备,可以节省用户的流量和提高页面的初始加载速度。
  2. 资源优化
    • 图片优化:选择合适的图片格式。例如,对于颜色丰富的照片,JPEG 格式通常是较好的选择;对于具有透明度的图像,PNG 格式更合适。此外,还可以使用 WebP 格式,它在保证一定图像质量的前提下,文件大小通常比 JPEG 和 PNG 更小。同时,通过工具(如ImageOptim)对图片进行压缩,在不明显降低图像质量的情况下减小文件大小。
    • CSS 和 JavaScript 加载顺序优化:将 CSS 文件放在页面头部加载,这样可以让浏览器尽早开始渲染页面的样式。将 JavaScript 文件放在页面底部加载,避免 JavaScript 的加载和执行阻塞页面的初始渲染。例如,在 HTML 文件中,将<link rel="stylesheet" href="styles.css">放在<head>标签内,将<script src="script.js"></script>放在</body>标签之前。

(三)前端安全

  1. 跨站脚本攻击(XSS)防范
    • 输入过滤与输出编码:对用户输入的数据进行严格的过滤和验证。例如,对于用户输入的评论内容,过滤掉可能包含恶意脚本的 HTML 标签和 JavaScript 代码。同时,在将数据输出到页面时,对数据进行 HTML 实体编码。如将<编码为&lt;>编码为&gt;,这样即使数据中包含恶意脚本,也不会被浏览器执行。
    • Content - Security - Policy(CSP):设置 CSP 头信息来限制页面可以加载的资源来源。例如,可以通过设置Content - Security - Policy: default - src'self';来只允许页面从当前域名加载资源,防止从外部恶意域名加载脚本等资源。
  2. 跨站请求伪造(CSRF)防范
    • 令牌(Token)验证:在表单中添加一个隐藏的令牌字段,这个令牌是由服务器生成并发送给客户端的。当客户端提交表单时,服务器会验证这个令牌是否有效。例如,在一个用户登录后的表单提交场景中,服务器在用户登录成功后生成一个令牌,并将其包含在页面的表单中。当用户提交表单时,服务器检查令牌是否与之前生成的一致,不一致则拒绝请求,从而防止 CSRF 攻击。

三、前后端交互进阶知识

(一)API 设计与通信

  1. RESTful API 设计原则
    • 资源定位:每个资源都有一个唯一的 URI(Uniform Resource Identifier)。例如,在一个电商应用中,商品资源可以通过/products/{product_id}来定位,其中{product_id}是具体商品的标识符。
      • HTTP 方法使用规范:使用不同的 HTTP 方法来表示对资源的操作。例如,GET方法用于获取资源信息,POST方法用于创建新的资源,PUT方法用于更新资源的全部内容,DELETE方法用于删除资源。如GET /products/1用于获取 ID 为 1 的商品信息,POST /products用于创建一个新的商品记录。
  2. GraphQL
    • 查询语言特点:GraphQL 是一种用于 API 的查询语言,它允许客户端精确地指定需要的数据。与传统的 RESTful API 不同,GraphQL 的查询是由客户端决定的。例如,客户端可以通过一个查询语句{ product(id: 1) { name, price } }来只获取 ID 为 1 的商品的名称和价格信息,而不是像 RESTful API 那样可能返回整个商品对象的所有信息。
    • 后端实现:在后端实现 GraphQL API 时,需要定义类型系统和解析函数。类型系统定义了可以查询的数据类型,解析函数则用于获取和返回数据。例如,对于上述的商品查询,需要在后端定义Product类型,包括nameprice等字段,并且编写解析函数来从数据库或者其他数据源获取相应的数据。

(二)实时交互技术

  1. WebSockets
    • 协议原理:WebSockets 是一种全双工通信协议,它在单个 TCP 连接上实现了双向通信。与传统的 HTTP 请求 - 响应模式不同,WebSockets 允许服务器主动向客户端推送数据。例如,在一个在线股票交易应用中,服务器可以通过 WebSockets 实时向客户端推送股票价格的变化,客户端可以随时接收并更新显示的价格。
    • 前端和后端实现:在前端,可以使用WebSocket对象来建立连接并处理消息。例如,const socket = new WebSocket('ws://example.com/socket');来创建一个 WebSockets 连接,然后通过socket.onmessage事件来接收服务器发送的消息。在后端,不同的语言和框架有不同的实现方式。例如,在 Node.js 中,可以使用wssocket.io等库来创建 WebSockets 服务器并处理连接和消息发送。
  2. Server - Sent Events(SSE)
    • 单向推送机制:SSE 是一种单向的实时通信技术,它允许服务器向客户端发送事件流。例如,在一个新闻网站中,服务器可以通过 SSE 向客户端推送最新的新闻标题,客户端可以实时接收并更新显示。
    • 前端使用方式:在前端,可以使用EventSource对象来接收 SSE。例如,const eventSource = new EventSource('http://example.com/events');来创建一个 SSE 连接,然后通过eventSource.onmessage事件来接收服务器发送的消息。与 WebSockets 相比,SSE 更简单,适用于只需要服务器向客户端单向推送数据的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值