脚本加载发生在 JSDOM 中的 window 加载之后

Script onload happens after window onload in JSDOM

这是一个新问题,源于我在以下内容中学到的知识:

在上一个问题中我们了解到,当window正在加载脚本时,任何脚本(直接加载的脚本以及脚本动态加载的脚本)都会先完成加载,然后才完成加载window.onload 会触发。

但 JSDOM 的行为似乎有所不同。

这是 loader.js 脚本,与上一个问题中的相同:

function main()
{
  if (typeof window !== 'undefined') {
    var script = window.document.createElement('script')
    script.src = 'https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.core.min.js'
    script.onload = function () { console.log('script loaded') }
    window.onload = function () { console.log('window loaded') }
    window.document.head.appendChild(script)
  } else {
    console.log('window not available yet')
  }
}

if (typeof module !== 'undefined' && module.exports) {
  exports.main = main
}

main()

这里是通过JSDOMwindow伪装的驱动代码

var jsdom = require('jsdom')
var loader = require('./loader.js')

var html = `<!DOCTYPE html>
<html>
  <head>
    <title>Test</title>
    <script src="loader.js"></script>
  </head>
  <body>
    <div>Test</div>
  </body>
</html>`

global.window = new jsdom.JSDOM(html, { runScripts: "dangerously", resources: "usable" }).window

这是输出:

$ node fakewindow.js 
window not available yet
window loaded
script loaded

window.onload 事件在 script.onload 事件触发之前触发。为什么 JSDOM 认为 window 已加载,即使由直接包含在 HTML 中的脚本加载的动态脚本尚未加载?这是 JSDOM 中的错误还是相关 W3C 标准允许这种行为?

似乎是 JSDOM 中的错误。

最新版本似乎已经解决13.0.0,尝试更新JSDOM。

我已经为 jsdom 13 尝试了相同的代码并且有效。

window not available yet
script loaded
window loaded

jsdom 11 确实显示了问题:

window not available yet
window loaded
script loaded