web应用101

48 阅读6分钟

前言

  • 最近阅读了一篇关于web应用的文章。让我关注到一些之前忽略的点,解开了一些疑惑的问题。感觉对web应用有了全新的认识,帮助我构建web应用的基础框架。以下内容是翻译+自己的一些理解。原文链接(英文):www.robinwieruch.de/web-applica…
  • "101”常常用来指代某个领域的“入门级别”。这个用法来自于美国大学中对课程编号的命名方式,其中以“101”结尾的编号通常代表该课程为某个领域的入门课程。

web服务器与应用服务器的区别

  • Web服务器(Web Server)提供可以通过HTTP传输的格式资源(如HTML、CSS和JavaScript)。当客户端向web服务器请求资源时,web服务器通过将资源发送回客户端来完成请求。通常,这些资源只是服务器上的文件。如果HTML被发送到客户机,那么客户机(在本例中是浏览器)将解释HTML以呈现它。

  • 应用服务器(Application Server)提供HTML、CSS和JavaScript之外的资源。例如,如果客户端以数据友好格式请求数据,则可以发送JSON。此外,应用服务器没有绑定到协议。虽然web服务器主要使用HTTP协议,但应用服务器可以使用其他协议(例如用于实时通信的WebSockets)。最重要的事实是,应用服务器可以在其服务器端使用特定编程语言实现细节(例如JavaScript与Node.js、PHP、Java、Ruby、c#、Go、Rust和Python)。

  • Web 服务器: 处理 HTTP 请求和发送静态文件。

  • 应用服务器: 处理动态请求,执行代码,生成动态内容。

  • 例子:

    • Web服务器:Apache、Nginx。
    • 应用服务器:Tomcat、Node.js、uWSGI、Gunicorn。
  • web服务器和应用服务器都可以被归类为服务器。因此,您经常会听到人们谈论服务器时,他们指的是这两者之一。然而,人们经常说服务器是指物理计算机,它运行在远程某个地方,web服务器或应用程序服务器正在运行运行在这个物理计算机上。

  • 部署和托管

    • 部署描述了在服务器上运行网站的行为
    • 托管描述了从该服务器为网站提供持续服务的行为

从网站到WEB应用

  • 静态内容变成动态内容,从只能读内容到可以创建、编辑、删除内容。
  • 新增服务端路由,如创建博客后,重定向到另一个页面
  • 服务端新增数据库用于存储动态的数据
  • 服务端需要渲染包含动态数据的HTML返回给客户端,而这个工作由模版引擎完成,不同的语言由不同的模版引擎((e.g. Pug for JavaScript on Node.js, Twig for PHP, JSP for Java, Jinja2 for Python) )。

从多页面应用到单页面应用

  • 单页面应用:single-page application (SPA)
  • 网站构成的变化:早期的网站都是由HTML加CSS和少量的JavaScript构成,JavaScript只用于实现动画和DOM操作(如移动、新增、删除HTML元素),JQuery是最受欢迎的库用于处理这类任务;对于单页面应用,是由小的HTML文件加CSS和大量的JavaScript构成,整个应用都是由JavaScript生成的,主流的单页面框架/库有Angular.js; React.js and Vue.js
  • 对于多页面应用,每次当用户从一个页面转移到另一个页面(如从页面/home到页面/about) ,客户端都会向服务端请求相关的HTML、CSS、JS等文件。对于单页面应用,则用JS封装了整个应用,只需在进入网站时请求一次HTML、CSS、JS文件,后面页面的跳转都无需再请求HTML等文件。
  • 动态HTML的渲染方式发生改变,由后端模版引擎变成前端模版引擎完成:多页面应用是由服务端从数据库中获取动态数据并完成HTML渲染然后返回给客户端;单页面应用是由客户端通过api接口向服务端获取动态数据,然后在客户端完成HTML渲染。
  • 页面路由方式发生变化:多页面应用是由服务端定义页面路由;对于单页面应用,页面的跳转不会请求HTML,所以变成由客户端定义路由。

用户体验的优化

  • 单页面的实现机制提高了页面切换的加载速度的同时,但也导致首次进入某网站的加载时间变长,导致用户体验较差。为了解决这个问题,前端引入新技术:code splitting(代码分隔)也称为lazy loading(懒加载),基本思路是按需加载JS,即在用户进入A页面时只加载A页面的JS文件,切换到B页面后再加载B页面的JS文件,从而减少首次加载时间。
  • 优化按需加载:对于多次进入一个页面会导致多次请求该页面的JS文件,这部分是多余的网络请求。可以使用缓存技术将这个过程省略掉。使用缓存后又产生一个新问题:何时更新,怎么判断过期的缓存数据。

前端与后端

  • 源于Client--Server架构,产生前端和后端的关系

  • 为啥需要后端,把所有逻辑都放到前端不行吗?回答这个问题需要理解CS的架构是用来解决什么问题,产生背景是啥。

    • 一些业务逻辑不适合放在前端(浏览器可以读取前端代码),存在泄露的风险。如:鉴权逻辑
    • 前端不适合与第三方数据源建立敏感链接。如:数据库链接

全栈应用

  • 起源:由SPA应用兴起而产生的

  • 解决动态内容渲染需要两次请求:

    • 获取JS
    • 获取动态的数据
  • 难题:客户端的状态管理

  • 全栈应用客户端与服务端使用API交流

    • 常用的规范&风格:

      • REST
      • GraphQL
  • 随着web的发展,一些事情变得更复杂

    • 服务端路由--》客户端路由

      • 通过懒加载的方式来解决大文件内容带来的问题
    • 服务端渲染 --》客户端渲染

      • 额外的数据请求连接

        • 数据获取和状态管理问题
        • 页面加载长问题
  • 新的主题

    • Server-Side Rendering 2.0 (SSR)
    • Static Site Generation (SSG)