gpt4 book ai didi

javascript - 如何使用 JSDOM 加载本地 JavaScript 文件?

转载 作者:行者123 更新时间:2023-11-29 20:48:27 64 4
gpt4 key购买 nike

我无法使用 JSDOM(版本 13.0.0)从具有相对路径的本地文件系统加载脚本。

我查看了以下问题,但它们没有回答我的问题:

文件 foo.js:

var jsdom = require('jsdom')

var html = `<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<script src="bar.js"></script>
</head>
<body>
<div>Test</div>
</body>
</html>`

global.window = new jsdom.JSDOM(html, { runScripts: "dangerously", resources: "usable" }).window
console.log('foo')

文件bar.js:

console.log('bar')

这是我得到的错误:

$ node foo.js
foo
Error: Could not load script: "bar.js"
at onErrorWrapped (/Users/lone/so/node_modules/jsdom/lib/jsdom/browser/resources/per-document-resource-loader.js:41:19)
at Object.check (/Users/lone/so/node_modules/jsdom/lib/jsdom/browser/resources/resource-queue.js:72:23)
at request.then.catch.err (/Users/lone/so/node_modules/jsdom/lib/jsdom/browser/resources/resource-queue.js:124:14)
at process._tickCallback (internal/process/next_tick.js:68:7)
at Function.Module.runMain (internal/modules/cjs/loader.js:746:11)
at startup (internal/bootstrap/node.js:240:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:564:3) Error: Tried to fetch invalid URL bar.js
at ResourceLoader.fetch (/Users/lone/so/node_modules/jsdom/lib/jsdom/browser/resources/resource-loader.js:84:29)
at PerDocumentResourceLoader.fetch (/Users/lone/so/node_modules/jsdom/lib/jsdom/browser/resources/per-document-resource-loader.js:16:42)
at HTMLScriptElementImpl._fetchExternalScript (/Users/lone/so/node_modules/jsdom/lib/jsdom/living/nodes/HTMLScriptElement-impl.js:92:30)
at HTMLScriptElementImpl._eval (/Users/lone/so/node_modules/jsdom/lib/jsdom/living/nodes/HTMLScriptElement-impl.js:161:12)
at HTMLScriptElementImpl._poppedOffStackOfOpenElements (/Users/lone/so/node_modules/jsdom/lib/jsdom/living/nodes/HTMLScriptElement-impl.js:126:10)
at OpenElementStack.pop (/Users/lone/so/node_modules/jsdom/lib/jsdom/browser/htmltodom.js:17:12)
at Object.endTagInText [as END_TAG_TOKEN] (/Users/lone/so/node_modules/parse5/lib/parser/index.js:2153:20)
at Parser._processToken (/Users/lone/so/node_modules/parse5/lib/parser/index.js:657:55)
at Parser._processInputToken (/Users/lone/so/node_modules/parse5/lib/parser/index.js:684:18)
at Parser._runParsingLoop (/Users/lone/so/node_modules/parse5/lib/parser/index.js:440:18)

如何在使用 JSDOM 时加载本地 JavaScript 文件?

最佳答案

JSDOM 在执行时不知道在本地何处查找该文件。因此,运行您的示例,您可以遵循这两种方法中的任何一种。

第一种方法

您必须等待脚本文件加载和执行。

在同一个文件夹中创建三个文件 index.html、index.js 和 test.js

index.html

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
abc
<script src='index.js'></script>
</body>
</html>

索引.js

document.body.textContent = 123;

测试.js

'use strict';

const { JSDOM } = require('jsdom');

const options = {
resources: 'usable',
runScripts: 'dangerously',
};

JSDOM.fromFile('index.html', options).then((dom) => {
console.log(dom.window.document.body.textContent.trim());

setTimeout(() => {
console.log(dom.window.document.body.textContent.trim());
}, 5000);
});

// console output
// abc
// 123

第二种方法JSDOM 环境中设置外部脚本根文件夹。

js/index.js

console.log('load from jsdom');
var loadFromJSDOM = 'load from jsdom';

测试.js

'use strict';
const { JSDOM } = require('jsdom');
JSDOM.env({
html: "<html><body></body></html>",
documentRoot: __dirname + '/js',
scripts: [
'index.js'
]
}, function (err, window) {
console.log(window.loadFromJSDOM);
}
);

从这些引用资料中阅读更多信息

https://github.com/jsdom/jsdom/issues/1867

jsdom.env: local jquery script doesn't work

关于javascript - 如何使用 JSDOM 加载本地 JavaScript 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53236280/

64 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com