字节流到输出流

文档

dom.spec.whatwg.org/#parsing

考虑几个字节流到输出流的问题

  • 网络获取是chunk获取【分段获取】,那对于浏览器来说是否是获取到所有资源后在统一进行解析?
  • 压缩的风险是什么?
  • 想"白嫖"cdn时,js和图片有区别不?找个git平台可以不?
  • Meta信息可以修改编码,http也有,他们的区别是什么?
  • ....

本文不解释,直接上现象

content-type决定了那个解析器 : text/html - byte/1.js

显然,这种解析规则跟html是不一样的

content-type决定了使用哪种解析器

注:同样包含决定使用哪个解析器的还有标签

思考题

  • 考虑下如何"白嫖"cdn或者建站?
  • 考虑下如何"反白嫖"

分段传输 - byte/1.html

限下流,速度降低,可看到如下页面

解析是可以分段的,这并不复杂,但会包含一个笼统的特点,普通的html标签可以不闭合【script/style等特殊的不行】

我们在看cdn【js/css】,小说或者图片时,很容易遇见一段一段的现象

思考题

  • 如果是你,你会怎么设计以下实现
javascript 复制代码
 // 页面显示: <div>123</div>
document.write("<div>123")
 // 页面显示: <div>123456</div>
document.write("456")
 // 页面显示: <div>123456789</div>
document.write("789</div>")

标签可以不闭合 - byte/2.js

如果1s发送1段内容,那么浏览器会如何渲染?

javascript 复制代码
const express = require('express');
const fs = require('fs');
const app = express();

app.get('/1', (req, res) => {
    const text = fs.readFileSync("2.html","utf-8")
  
    const arr = text.split("\r\n")
    arr.forEach((txt,i)=>{
        setTimeout(()=>{
            res.write(txt)
        },i*1000)
    })

    setTimeout(()=>{
        res.end()
    },arr.length*1000)
    
});
    

app.listen(3000)
html 复制代码
<!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>
    <div>11111111
         22222222
         33333333
         44444444
         55555555
    </div>
</body>
</html>

标签可以不闭合,一般没啥问题,但考虑下,比如"严格"限制闭合标签,可能会产生的问题,当然,对于现在的网络环境而言并不复杂【至少国内是】

注:这也是比较老的一个点,以前table中包含tbody,浏览器解析时,必须遇见/tbody才会解析里面的内容,所以会分割很多个tbody用于加速显示,现在无所谓了

Gzip压缩 - byte/3.js

一般的字节流和字符流可以直接转换【直接解码】,同时我们也知道Receive Response后会进入渲染流水线线,但是压缩呢?

如果使用压缩,html是否可以分段解析?

将网速调低,可以看到如下结构,指解析了一次

去掉gzip压缩,在看一次没有压缩的情况

显然,字节流转换到字符流,此处与压缩格式【Content-Encoding:gzip】有关,同时也会影响到后续的渲染流水线

注1:理论上gzip更常见的是资源文件【js/css】,因为资源文件大多需要等待完成后在解析【获取一半也没法解析】

注2:实际上减少传输次数的优化,远远大于分块解析【我瞎掰的,也可以描述为动态解析】

注3:更何况html文件一般不大【无视后端渲染哈】,远远不足1.5k【tcp包大小】

思考题

  • 如果压缩后,传输过程中错了一个字符,是不是数据全丢了重新传?

对于字节流到字符流,还有一些其他的内容,此处直接忽略

解码会根据meta影响- byte/4.html

如图,我的编码格式是gbk,我的内容却进行了解码

最大的"bug"在于,编码以后得到的meta值需要修改编码这个值

解码不完全会根据meta影响 - byte/5.html

更大的"bug",如果meta前的数据N多,解码的规则就会失效

  • 原因来自于解析规则,只针对前1k信息处理编码相关的内容

规范/原理

有兴趣的可自行读取,后续不再重复

html.spec.whatwg.org/multipage/p...

字节流就是来自网络层,确定编码后会将字节转换为字符

相关推荐
用户9385156350733 分钟前
React Context 与自定义 Hook 从底层到实践:「跨层级通信 + 副作用封装」全解析
前端·javascript·react.js
滴滴答答哒1 小时前
VUE3+element-plus MultiSelect 多选下拉组件
前端·javascript·vue.js
其美杰布-富贵-李1 小时前
04 watch 与 Vue 响应式数据流
前端·javascript·vue.js
赵大仁3 小时前
生成式 UI 实战:用 JSON Schema + React 动态渲染 AI 界面
前端·ai·react·next.js·前端架构·生成式ui
kyriewen4 小时前
我排查了一个React内存泄漏——罪魁祸首是这3个被忽略的清理函数
前端·javascript·面试
IT_陈寒4 小时前
我又被JavaScript的隐式类型转换坑了
前端·人工智能·后端
其美杰布-富贵-李4 小时前
03 ref、reactive 与 computed 响应式数据
前端·javascript·vue.js
OpenTiny社区4 小时前
GenUI SDK v1.3.0 发布|多框架兼容,一键换物料,渲染器 & 演练场全面增强!
前端·ai编程
用户938515635074 小时前
useRef + Web Worker 实战:React 如何优雅地拥抱多线程
前端·javascript·react.js
他们叫我秃子5 小时前
前端开发转 Go 全栈(五):终于遇到熟人了,Go 的闭包和高阶函数原来这么像 JavaScript
前端·后端·go