为什么node.js无法识别document.GetElementById? 它说'ReferenceError:document not defined'。 我该怎么办?
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
答案 0 :(得分:23)
document
与Web浏览器中的DOM(文档对象模型)相关。
Node.js不是浏览器Javascript。它是一个服务器,很像PHP或Perl,因此,您无法访问浏览器的DOM或执行任何特定于基于浏览器的Javascript。
您最接近的是使用类似browserify的内容在您的客户端代码中包含Node.js模块。
答案 1 :(得分:10)
您可以使用JSDom向节点添加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;
我希望这是回答你的问题。
答案 2 :(得分:6)
要理解答案,必须了解以下内容的关系: JavaScript引擎,浏览器和 Node.js 。
Javascript Engine :是将JS转换为机器代码的Javascript编译器。例如, V8 就是一个很好的选择。从技术上讲,V8是由C ++开发的(您可以将其视为C ++程序)。
V8实现了 ECMAScript ,这是一种Java语言标准,用于定义JS的特性和功能。
但是 DOM 操作不是ECMAScript定义的。因此V8不支持它。
浏览器:开发人员可以在浏览器中使用document
进行DOM操作,因为DOM操作由浏览器提供,例如:Chrome。
Chrome也是由C ++开发的,而V8(如前所述,也是由C ++开发的)被嵌入到Chrome中以解释Javascript。因此,Chrome通过将JS命令和C ++实现绑定在一起,可以扩展Java脚本的功能或为其添加功能。
Nodejs :与Chrome不同,它是服务器端程序。但是同一件事是Nodejs由C ++开发,而V8嵌入到Nodejs中以处理js。 Nodejs以与Chrome类似的方式扩展了Javascript的功能。但是由于服务器端不需要处理DOM,因此您无法在Node.js中访问此类函数。
答案 3 :(得分:-2)
OK, shorter answer is you wanna access document
Object which is only available in the window and front end side, don't forget that document
=== window.document
which you don't have access in the server and node side...
So never try something like this on your node side for example getting root element by ID which will throw the error, instead try to access it from FrontEnd:
document.getElementById('root');
will throw an Error:
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
The short answer is don't use document and window object in node.js
as they are not available in node.js
...
Using Domino could help in some cases for accessing the dom...
As the name might suggest, domino's goal is to provide a DOM in Node.
In contrast to the original dom.js project, domino was not designed to run untrusted code. Hence it doesn't have to hide its internals behind a proxy facade which makes the code not only simpler, but also more performant.
Domino currently doesn't use any harmony features like proxies or WeakMaps and therefore also runs in older Node versions.
For more info, visit here...
答案 4 :(得分:-7)
npm install npm -g
” npm install -g typescript
”之后此命令帮助我解决了这个问题