Jsdom: Klarstellen, dass Pfade zu lokalen Skripten absolut sind

Erstellt am 13. Mai 2016  ·  4Kommentare  ·  Quelle: jsdom/jsdom

Im Moment setzt jsdom injizierte Skripte src ohne Überprüfung oder Auflösung. IIRC, es gab einen Vorschlag, einen separaten Satz für lokale Skripte zum config hinzuzufügen. Bis dahin sollte vielleicht das Haupthilfedokument klarstellen, dass Pfade zu lokalen Skripten absolut sein müssen (oder so etwas wie path.join(__dirname, 'script.js') ). Nichts davon funktioniert als richtiger lokaler Pfad:

scripts: ['script.js']

scripts: ['.\\script.js']

scripts: ['./script.js']

Ich bin mir nicht sicher, was der richtige Ort für diese Warnung ist, also wage ich es nicht, eine PR zu machen.

documentation fixed in newapi

Hilfreichster Kommentar

require.resolve() wäre gut für einen Beispielcode in der Readme:

scripts: [
  require.resolve('./myscript.js'),
  require.resolve('jquery')
]

Alle 4 Kommentare

require.resolve() wäre gut für einen Beispielcode in der Readme:

scripts: [
  require.resolve('./myscript.js'),
  require.resolve('jquery')
]

Bezogen auf https://github.com/tmpvar/jsdom/issues/1733

Wenn ich versuche, die Skripte zu laden, indem ich:

scripts: [
  require.resolve('./myscript.js'),
  require.resolve('jquery')
]

Es scheint nicht zu funktionieren. Testfall:

import test from 'ava'

// import { readFileSync } from 'fs'
import { jsdom, createVirtualConsole } from 'jsdom'

// const systemJSContent = readFileSync(require.resolve('systemjs'), { encoding: 'utf-8' })

const cwd = process.cwd()
let window
test.beforeEach(() => {
  const virtualConsole = createVirtualConsole().sendTo(console)
  const document = jsdom('',
    {
      url: `file://${cwd}/index.html`,
      virtualConsole,
      scripts: [
        require.resolve('systemjs')
      ]
    })
  window = document.defaultView

  // let scriptEl = document.createElement('script')
  // scriptEl.textContent = systemJSContent
  // document.body.appendChild(scriptEl)
})

test(async t => {
  // SystemJS should create global `SystemJS` variable.
  console.log(window.SystemJS)
  t.not(window.SystemJS, undefined)
})

Wenn ich umschalte, um die Datei direkt zu laden, wird der Test bestanden:

import test from 'ava'

import { readFileSync } from 'fs'
import { jsdom, createVirtualConsole } from 'jsdom'

const systemJSContent = readFileSync(require.resolve('systemjs'), { encoding: 'utf-8' })

const cwd = process.cwd()
let window
test.beforeEach(() => {
  const virtualConsole = createVirtualConsole().sendTo(console)
  const document = jsdom('',
    {
      url: `file://${cwd}/index.html`,
      virtualConsole,
//      scripts: [
//        require.resolve('systemjs')
//      ]
    })
  window = document.defaultView

  let scriptEl = document.createElement('script')
  scriptEl.textContent = systemJSContent
  document.body.appendChild(scriptEl)
})

test(async t => {
  // SystemJS should create global `SystemJS` variable.
  console.log(window.SystemJS)
  t.not(window.SystemJS, undefined)
})

Testcode kann hier eingesehen werden: https://github.com/unional/some-issues/tree/jsdom-scirpts

Liegt es daran, dass jsdom() keine Skripte lädt?

Und es erlaubt Ihnen nicht, Skripts separat bereitzustellen, die es einfügt und ausführt.

UPDATE: egal. Das ist der Grund. Dieser Test besteht:

test('use scripts property', t => {
  return new Promise(r => {
    env(`file://${cwd}/index.html`,
      {
        virtualConsole,
        scripts: [
          require.resolve('systemjs')
        ],
        done(_err, window: any) {
          t.not(window.SystemJS, undefined)
          r()
        }
      })
  })
})

Schließen, da die alte API in der kommenden Version 12 gelöscht wird.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen