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

标签 javascript node.js jsdom

我无法使用 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/

相关文章:

javascript - 使用 JSDom 在 Node 测试环境中正确接近 "window"

javascript - 使用正则表达式查找字符模式

javascript - Node js 如果条件不能正常工作

javascript - 如何使用 JavaScript 删除 HTML 中的子节点?

jquery - jquery ui datetimepicker 不起作用(node.js + ejs + Express)

node.js - 为什么我的nodejs请求很慢?

ajax - 使用 jsdom 加载 ajax 应用程序

javascript - jsdom.env 不适用于 node.js C9

javascript - react 和通天塔 : You may need an additional loader to handle the results of these loaders

javascript - React Router 只识别索引路由