前端主要的编程语言是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