Node.js 文档未定义

IT技术 javascript node.js
2021-02-07 23:43:43

为什么 node.js 无法识别 document.GetElementById?它说“参考错误:文档未定义”。我能做什么?

ReferenceError: document is not defined
at Object.<anonymous> (C:\Users\Desktop\main.js:9:18)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Function.Module.runMain (module.js:501:10)
at startup (node.js:129:16)
at node.js:814:3
6个回答

document 与 Web 浏览器中的 DOM(文档对象模型)有关。

然而,Node.js 不是浏览器环境。它是一个服务器环境,很像 PHP 或 Perl,因此,您无法访问浏览器的 DOM 或执行任何特定于浏览器托管的 JavaScript。

你能得到的最接近的是使用类似的东西 在客户端代码中包含 Node.js module。

你能指出一些使用browserify它的代码吗?
2021-03-12 23:43:43
当然,但这不是问题的内容。如果需要,请换一个新的。
2021-03-18 23:43:43
如果您要提供我们需要为某些库(例如 pdf.js)模拟浏览器 dom 服务器端的情况,我发现这个答案可能会更有用。
2021-03-25 23:43:43
不,但他们有文档请记住,客户端应用程序(DOM 可访问)的行为与服务器应用程序有很大不同。您将无法使用 browserify 在浏览器中启动服务器或进行任何与服务器相关的活动;它主要用于采用干净打包的 NPM module(例如 Moment.js 或 Lodash)并使它们可用。
2021-03-28 23:43:43

您可以使用JSDomNode.js添加 Dom 支持。要使变量成为全局变量,您可以使用

GLOBAL.document = new JSDOM(html).window.document;

或者

global.document = new JSDOM(html).window.document;

html您的网站在哪里作为字符串。

要使用 JSdom,请将其包含在您的项目中:

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

或在普通 js 中:

var jsdom = require("jsdom");
var JSDOM = jsdom.JSDOM;

我希望这能回答你的问题。

要理解这个答案,有必要知道:Javascript EngineBrowserNode.js之间的关系

Javascript 引擎:是将 JS 转换为机器代码的 Javascript 编译器。例如,V8就是一个很好的例子从技术上讲,V8 是用 C++ 开发的(您可以将其视为 C++ 程序)。

V8 实现了ECMAScript,它是 Javascript 语言的标准,定义了 JavaScript 的特性和功能。

但是DOM操作不是由 ECMAScript 定义的。所以V8不支持它。

浏览器:开发者可以document在浏览器中进行DOM操作,因为DOM操作是由浏览器提供的,例如:Chrome。

Chrome 也是由 C++ 开发的,并且 V8(如前所述,它也是由 C++ 开发的)被嵌入到 Chrome 中来解释 Javascript。因此,Chrome 通过将 JS 命令和 C++ 实现绑定在一起来扩展或添加功能到 Javascript。

Nodejs:不同于Chrome,它是一个服务器端程序。但同样的事情是,Nodejs 是用 C++ 开发的,V8 被嵌入到 Nodejs 中来处理 js。Nodejs 以与 Chrome 类似的方式扩展了 Javascript 的功能。但是由于服务器端不需要处理DOM,所以你不能在Nodejs内部访问这些功能。

文档中,只需将此注释添加到.test.js文件的顶部即可配置您的环境:

/**
* @jest-environment jsdom
*/

好的,更简短的答案是您想访问document仅在窗口和前端可用的对象,不要忘记document===window.document您在服务器和节点端无权访问...

所以永远不要在你的节点端尝试这样的事情,例如通过 ID 获取根元素会抛出错误,而是尝试从 FrontEnd 访问它:

document.getElementById('root');

会抛出错误:

ReferenceError: document is not defined
at Object.<anonymous> (C:\Users\Desktop\app.js:12:50)
at Module._compile (my.js:490:34)
at Object.Module._extensions..js (my.js:518:10)
at Module.load (my.js:555:42)
at Function.Module._load (my.js:610:12)
at Function.Module.runMain (my.js:701:10)
at startup (node.js:899:16)
at node.js:901:3

简短的回答是不要使用文档窗口对象,node.js因为它们在node.js...

在某些情况下,使用Domino可以帮助访问 dom...

顾名思义,domino 的目标是在 Node.js 中提供一个 DOM。

与最初的 dom.js 项目相比,domino 并不是为运行不受信任的代码而设计的。因此,它不必将其内部隐藏在代理外观后面,这使代码不仅更简单,而且性能更高。

Domino 目前不使用任何像代理或 WeakMaps 这样的和谐特性,因此也可以在旧的 Node 版本中运行。

欲了解更多信息,请访问这里...

这没有回答
2021-03-16 23:43:43
这再次说明了问题。它不回答它
2021-04-08 23:43:43