Jsdom: Esclareça os caminhos para scripts locais para serem absolutos

Criado em 13 mai. 2016  ·  4Comentários  ·  Fonte: jsdom/jsdom

Por enquanto , jsdom define scripts injetados src sem nenhuma verificação ou resolução. IIRC, houve uma proposta para adicionar um conjunto separado para scripts locais ao config . Até então, talvez o documento de ajuda principal deva esclarecer que os caminhos para scripts locais devem ser absolutos (ou algo como path.join(__dirname, 'script.js') ). Nada disso funcionará como um caminho local adequado:

scripts: ['script.js']

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

scripts: ['./script.js']

Não tenho certeza de qual é o lugar apropriado para este aviso, então não ouso fazer um PR.

documentation fixed in newapi

Comentários muito úteis

require.resolve() seria bom para algum código de exemplo no readme:

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

Todos 4 comentários

require.resolve() seria bom para algum código de exemplo no readme:

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

Relacionado a https://github.com/tmpvar/jsdom/issues/1733

Quando tento carregar os scripts por:

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

Não parece funcionar. Caso de teste:

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

Se eu mudar para carregar o arquivo diretamente, o teste passará:

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

O código de teste pode ser visto aqui: https://github.com/unional/some-issues/tree/jsdom-scirpts

É porque jsdom() não carrega scripts?

E não permite que você forneça scripts separadamente que ele injetará e executará.

ATUALIZAÇÃO: não importa. Essa é a razão. Este teste passa:

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

Fechando porque a API antiga está sendo excluída na próxima versão v12.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Progyan1997 picture Progyan1997  ·  3Comentários

potapovDim picture potapovDim  ·  4Comentários

mitar picture mitar  ·  4Comentários

kentmw picture kentmw  ·  3Comentários

amfio picture amfio  ·  3Comentários