Jsdom: рдЖрдк рдмрд╛рд╣рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреИрд╕реЗ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рдЬреБрд▓ре░ 2017  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jsdom/jsdom

jsdom рдЙрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ <head> рдЯреИрдЧ рдХреЗ рдЕрдВрджрд░ рдЗрдирд▓рд╛рдЗрди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреИрд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдЬреЛ <script src=""> рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╢реАрд░реНрд╖ рд╕реЗ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИрдВ?

рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

{
    url: url,
    resources: 'usable',
    runScripts: 'dangerously',
}

рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА:

  • Node.js рд╕рдВрд╕реНрдХрд░рдг: 8.1.2
  • jsdom рд╕рдВрд╕реНрдХрд░рдг: 11.1.0

рдиреНрдпреВрдирддрдо рдкреНрд░рдЬрдирди рдорд╛рдорд▓рд╛:

// index.js
const request = require('request')
const jsdom = require('jsdom')
const {JSDOM} = jsdom
const url = 'http://localhost:8000'

request(url, (error, response, body) => {
  const options = {
    url: url,
    resources: 'usable',
    runScripts: 'dangerously',
  }

  const dom = new JSDOM(body, options)

  console.log(dom.window.document.body.children.length) // Expecting to see `1`
  console.log(dom.window.document.body.innerHTML) // Expecting to see `<h1>Hello world</h1>`
})
// external.js
document.addEventListener('DOMContentLoaded', () => {
  document.write('<h1>Hello world!</h1>')
})
<!-- index.html -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>JSDOM test</title>
    <script src="external.js"></script>
  </head>
  <body>
  </body>
</html>

рдкреВрд░реНрдг рдиреНрдпреВрдирддрдо рдХрд╛рд░реНрдп рдЙрджрд╛рд╣рд░рдг: https://github.com/cg433n/jsdom-test

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣рд╛рдБ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ DOMContentLoaded рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдШрдЯрдирд╛ рд╣реИред рдРрд╕рд╛ рд╣реЛрдиреЗ рдХрд╛ рдореМрдХрд╛ рдорд┐рд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдк рд▓реЙрдЧ рдЗрди рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдЖрдЧ рд▓рдЧрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рддрднреА рдЖрдкрдХрд╛ document.write() рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рдХреБрдЫ рд╢рд╛рдпрдж рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

const dom = new JSDOM(body, options)

dom.window.document.addEventListener('DOMContentLoaded', () => {
  // We need to delay one extra turn because we are the first DOMContentLoaded listener,
  // but we want to execute this code only after the second DOMContentLoaded listener
  // (added by external.js) fires.
  setImmediate(() => {
    console.log(dom.window.document.body.children.length) // Expecting to see `1`
    console.log(dom.window.document.body.innerHTML) // Expecting to see `<h1>Hello world</h1>`
  });
});

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣рд╛рдБ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ DOMContentLoaded рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдШрдЯрдирд╛ рд╣реИред рдРрд╕рд╛ рд╣реЛрдиреЗ рдХрд╛ рдореМрдХрд╛ рдорд┐рд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдк рд▓реЙрдЧ рдЗрди рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдЖрдЧ рд▓рдЧрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рддрднреА рдЖрдкрдХрд╛ document.write() рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рдХреБрдЫ рд╢рд╛рдпрдж рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

const dom = new JSDOM(body, options)

dom.window.document.addEventListener('DOMContentLoaded', () => {
  // We need to delay one extra turn because we are the first DOMContentLoaded listener,
  // but we want to execute this code only after the second DOMContentLoaded listener
  // (added by external.js) fires.
  setImmediate(() => {
    console.log(dom.window.document.body.children.length) // Expecting to see `1`
    console.log(dom.window.document.body.innerHTML) // Expecting to see `<h1>Hello world</h1>`
  });
});

рд╕рдордЭрд╛! рддреБрдо рд▓реЛрдЧ рд╢рд╛рдирджрд╛рд░ рд╣реЛ - рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддреЗ рд░рд╣реЛ!

рд╕реВрдЪрдирд╛: рдКрдкрд░ рджрд┐рдП рдЧрдП рдбреЗрдореЛ рдХреА 2 рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЬреЛрдЦрд┐рдо рднрд░реА рд╣реИрдВред

рдПрдлрдПрд╕ рд╣реИрдХ

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдореИрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдЬреЗрдПрд╕ рдХреЛрдб рдкрдврд╝рдиреЗ рдФрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП fs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ, #3023 рдореЗрдВ @EricRicketts ' FS.read() рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдЖрдзрд╛рд░рд┐рдд Stackoverflow рдФрд░ @Domenic рдХреЗ addEventListener() рдореЗрдВ рджреЗрдЦреЗрдВ #1914. рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╢реАрд▓ рдбреЗрдореЛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдЪрдЯреАрдПрдордПрд▓ рдореЗрдВ рдмрд╛рд╣рд░реА рдЬреЗрдПрд╕ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП fs.readFileSync рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
  • рдХрдИ рдмрд╛рд╣рд░реА рдЬреЗрдПрд╕ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реВрдк
  • рдмрд╛рд╣рд░реА рдЬреЗрдПрд╕ 'рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдлрд╛рдпрд░ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
  • рдЯрд░реНрдорд┐рдирд▓ рдЪрд░ рдХреЛ рдиреЛрдб рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдлрд┐рд░ рдмрд╛рд╣рд░реА рдЬреЗрдПрд╕ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП

рдпрд╣ рдЖрдкрдХреЛ xhr / API рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИред

рдпреВрдЖрд░рдПрд▓

рдореИрдВ рдпреВрдЖрд░рдПрд▓ рдХрд╛рдо рдкрд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╕рдордЭ рд╕рдХрд╛ред
рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдПрдХ рдЕрджреНрдпрддрди рдиреНрдпреВрдирддрдо JSDOM url рд╡рд░реНрдХрд┐рдВрдЧ рдбреЗрдореЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рд╣рд░реА.js рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рд╕реНрд╡рд╛рдЧрдд рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛ред :рджрд┐рд▓:

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕