编程范式与客户端容器| 青训营笔记

53 阅读4分钟

前端主要的编程语言是JavaScript,其在不同编程范式的使用情况,掌握创建领域特定语言的相关工具、模式。

机器语言=》汇编语言=》高级语言(c(通过指针操作地址,可直接操作位、字节、地址)、c++(类、权限、虚函数、继承、多态)、lisp(列表、闭包)、JavaScript(基于原型和头等函数的多范式语言))

编程范式
命令式:面向过程(自顶向下、结构化编程)、面向对象
声明式:函数式(可缓存、移植、测试、推理、并行)、响应式(异步离散的函数式编程:操作符、数据流;过滤、合并、转化、高阶,多播)

面向过程:

数据和算法关联性弱

不利于修改和扩充

不利于代码重用

面向对象:

    封装(关联数据与算法)
    继承(无需重写进行功能扩充)
    多态(不同的结构可以进行接口的共享,从而函数复用)
    依赖注入(去除代码耦合)
    
    5大原则
    单一职责
    开放封闭
    里式替换
    依赖倒置
    接口分离
    

领域特定语言DSL

SQL Token分类:注释、关键字、操作符、空格、字符串、变量

浏览器架构演进:

单进程架构(所有模块运行在同一个进程里,包括网络、插件等)、多进程架构(主进程、网络进程、渲染进程、GPU进程、插件进程)、面向服务架构(将原来的UI、数据库、文件设备等作为独立的基础服务)

扩展性(高内聚低耦合易扩展)、安全性、稳定性、流畅度

渲染进程(多线程架构)(页面渲染、脚本执行、事件处理、网络请求)

浏览器(主进程):主要负责页面的展示逻辑、用户交互、子进程管理,包括地址栏、书签、前进后退、收藏夹等

GPU进程:负责整个浏览器UI绘制

网络服务进程:负责网络资源加载

标签页(渲染进程):控制tab内所有内容,将HTML、Css、JavaScript转成用户可交互页面

插件进程:控制网站运行的插件,如flash、ModHeader等

其他进程:适用程序storage、network、audio sever等

线程:js引擎、GUI渲染、定时器、事件、网络

chrome运行原理

浏览器地址输入URL后

浏览器主进程 渲染进程

graph TD
输入处理 --> 开始导航 --> 读取响应--> 寻找渲染进程
资源加载 --> 构建 --> 布局--> 绘制--> 合成光栅化
资源加载 --> 加载子资源--> 执行脚本
构建 -->构建DOM--> 构建CSSOM--> 构建渲染树
绘制--> 构建图层--> 绘制图层

输入处理

判断是URL地址(直接请求站点资源)还是query查询条件(将输入发送给搜索引擎)

开始导航

按下回车后,UI 线程通知网络线程,发起一个网络请求,获取站点内容,请求过程中,tab处于loading状态

读取响应

网络线程接到HTTP 的响应后,先检查响应头的媒体类型(MIME Type)

  • 响应主体是HTML文件,浏览器将内容交给渲染进程处理
  • 拿到是其他类型文件zip或exe,交给下载管理器处理

寻找渲染进程

网络线程做完所有检查后,告知主进程数据已准备ok,主进程确认后为这个站点寻找一个渲染进程

主进程通过IPC消息告诉渲染进程去处理这次导航

渲染进程开始接收数据+告知主进程已开始处理,导航结束,进入文档加载阶段

渲染进程

资源加载

收到主进程消息后加载HTML文档,还需要加载子资源(一些图片、css样式、JavaScript脚本)

构建渲染树

构建DOM树,将HTML文本转化成浏览器理解的结构,然后构建CSSOM树,转为可理解的CSSOM,最后构建渲染树,渲染树是DOM树和CSSOM树的结合

页面布局

根据渲染树计算每个节点的位置和大小

在浏览器页面区域绘制元素边框

遍历渲染树,将元素以盒模型形式写入文档流

页面绘制

构建图层=》绘制图层=》合成线程接收指令生成图块=》栅格线程将图块进行栅格化=》展示在屏幕上

前端性能

首屏优化:

压缩、分包、删除无用代码

静态资源分离

js脚本非阻塞加载

缓存策略

SSR

预置loading、骨架屏

渲染优化

GPU加速

减少回流、重绘

离屏渲染

懒加载

js优化

防止内存泄漏(清除定时器)

循环尽早break

合理使用闭包

减少dom访问

防抖、节流

web workers

跨端方案

  • webview(一次开发、随时更新)
  • 小程序
  • RN、WeeX
  • Lynx
  • Flutter