Jsdom: Clarifier les chemins vers les scripts locaux pour qu'ils soient absolus

Créé le 13 mai 2016  ·  4Commentaires  ·  Source: jsdom/jsdom

Pour l'instant , jsdom définit les scripts injectés src sans aucune vérification ni résolution. IIRC, il y avait une proposition d'ajouter un ensemble séparé pour les scripts locaux au config . Jusque-là, peut-être que la documentation d'aide principale devrait clarifier que les chemins vers les scripts locaux doivent être absolus (ou quelque chose comme path.join(__dirname, 'script.js') ). Aucun de ceux-ci ne fonctionnera comme un chemin local approprié :

scripts: ['script.js']

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

scripts: ['./script.js']

Je ne sais pas quel est le bon endroit pour cet avertissement, donc je n'ose pas faire de PR.

documentation fixed in newapi

Commentaire le plus utile

require.resolve() serait bon pour un exemple de code dans le fichier readme :

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

Tous les 4 commentaires

require.resolve() serait bon pour un exemple de code dans le fichier readme :

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

Lié à https://github.com/tmpvar/jsdom/issues/1733

Lorsque j'essaie de charger les scripts par:

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

Cela ne semble pas fonctionner. Cas de test:

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)
})

Si je passe pour charger le fichier directement, le test réussira :

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)
})

Le code de test peut être vu ici : https://github.com/unional/some-issues/tree/jsdom-scirpts

Est-ce parce que jsdom() ne charge pas les scripts ?

Et il ne vous permet pas de fournir séparément des scripts qu'il injectera et exécutera.

MISE À JOUR : tant pis. C'est la raison. Ce test passe :

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()
        }
      })
  })
})

Fermeture car l'ancienne API est supprimée dans la prochaine v12.

Cette page vous a été utile?
0 / 5 - 0 notes