في الوقت الحالي ، يقوم jsdom بتعيين البرامج النصية المحقونة src
بدون أي تدقيق أو حل. IIRC ، كان هناك اقتراح لإضافة مجموعة منفصلة للنصوص المحلية إلى config
. حتى ذلك الحين ، ربما يجب أن يوضح مستند المساعدة الرئيسي أن المسارات إلى البرامج النصية المحلية يجب أن تكون مطلقة (أو شيء مثل path.join(__dirname, 'script.js')
). لا شيء من هؤلاء سيعمل كمسار محلي مناسب:
scripts: ['script.js']
scripts: ['.\\script.js']
scripts: ['./script.js']
لست متأكدًا من المكان المناسب لهذا التحذير ، لذلك لا أجرؤ على إجراء العلاقات العامة.
سيكون require.resolve()
جيدًا لبعض نماذج التعليمات البرمجية في الملف التمهيدي:
scripts: [
require.resolve('./myscript.js'),
require.resolve('jquery')
]
متعلق بـ https://github.com/tmpvar/jsdom/issues/1733
عندما أحاول تحميل البرامج النصية من خلال:
scripts: [
require.resolve('./myscript.js'),
require.resolve('jquery')
]
لا يبدو أنه يعمل. حالة اختبار:
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)
})
إذا قمت بالتبديل لتحميل الملف مباشرة ، فسوف يجتاز الاختبار:
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)
})
يمكن رؤية كود الاختبار هنا: https://github.com/unional/some-issues/tree/jsdom-scirpts
هل يرجع ذلك إلى أن jsdom()
لا يقوم بتحميل البرامج النصية؟
ولا يسمح لك بتزويد البرامج النصية التي سيتم حقنها وتنفيذها بشكل منفصل.
تحديث: فما باللك. هذا هو السبب. يجتاز هذا الاختبار:
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()
}
})
})
})
يتم الإغلاق كواجهة برمجة تطبيقات قديمة يتم حذفها في الإصدار 12 القادم.
التعليق الأكثر فائدة
سيكون
require.resolve()
جيدًا لبعض نماذج التعليمات البرمجية في الملف التمهيدي: