代码之家  ›  专栏  ›  技术社区  ›  MaximPro

HTML解析器如何与推测解析器交互

  •  0
  • MaximPro  · 技术社区  · 2 年前

    Whatwg规范描述了推测性HTML解析的概念。


    Spec说,推测解析器的行为类似于HTML解析器,但有一些限制,这意味着它执行的步骤与HTML解析器相同。

    an end tag whose name is "script" 这是否意味着推测解析器将独立于HTML解析器执行所有步骤?

    但是这一步呢:

    如果活动推测HTML解析器为null,JavaScript执行上下文堆栈为空,则执行微任务检查点。

    好吧,怎么样 example in another algorithm :

    你现在能说什么?我想知道哪些步骤可以应用于这个或那个解析器,以及它们应该如何组合在一起。


    第二个:

    Spec有算法 speculative fetch

    这是什么意思:“表现得好像该元素是为了后续投机获取的效果而处理的。”?

    step 2, note

    结果未被使用。此步骤允许从非推测性解析启动推测性获取。 此时,获取仍然是推测性的,因为,例如,在插入元素时,预期的父级可能已经从文档中删除。

    最后一句话我不清楚,你能澄清一下发生了什么吗?

    0 回复  |  直到 2 年前
        1
  •  2
  •   Kaiido    2 年前

    从你的问题来看,你是否理解推测解析器的作用并不完全清楚。因此,概括一下,它用于在实际的HTML解析器被阻止时预取资源 parsing-blocking <script> <script src="script.js"></script> 标记,而不是暂时什么都不做 script.js 下载后执行,浏览器可以启动 打火机 推测解析器,它将搜索其他可以立即开始获取的资源。这样,当阻塞脚本的执行结束时,浏览器希望已经开始获取下一个所需的资源,并且能够直接重用这些资源,从而加快全局页面加载。

    如果这一步只对HTML解析器有影响,而对推测解析器没有影响,那么应该明确说明。

    确实如此。措辞“如果 active speculative HTML parser is null”确切地说,这一步不应该由推测解析器执行。这只是更正确的措辞,因为规范是作为伪代码编写的,依赖集合变量的存在与否比依赖半抽象类型更好。

    所以,是的,脚本解析中的所有步骤都将被执行,但实际运行脚本的步骤除外。(另外,如果我没记错的话 待定解析脚本


    create an element algo,由于它很早就返回了,它确实只会执行第一步,即创建一个 mock element


    这是什么意思:“表现得好像该元素是为了后续投机获取的效果而处理的。”?

    这意味着推测解析器必须表现得好像这些元素已经被实际处理过,并且它们的效果被应用于解析器上,即使它们没有被应用 应用于实际的解析器。这是因为这些元素将影响获取的方式,因此推测解析器必须进行实际修改才能执行正确的获取。

    例如,如果推测解析器遇到 <base href="https://example.com/"> <img src="./image.png"> ,它必须采取 <base> href 考虑到能够获取正确的图像文件。


    最后一句话我不清楚,你能澄清一下发生了什么吗?

    this example 根据规范,不幸的是,它无法在StackSnippet的null原始iframe中运行,因此 as a jsfiddle :

    <iframe srcdoc='
    <div id=a>
     From iframe
     <script>
      // This script will move the current parent <div> to the <iframe>'s parent
      // Since it's now in another document, the following script should not be executed nor downloaded
      // Still, it's going to be parsed and inserted into the parent DOM
      const div = document.getElementById("a");
      parent.document.body.append(div);
     </script>
     <script src="script.js"></script>
    </div>'
    ></iframe>
    

    推荐文章