要求没有定义?Node.js的

Ric*_*tos 36 javascript google-chrome node.js

刚开始使用Node.js. 在我的app/js文件中,我正在做这样的事情:

app.js

var http = require('http');

http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Am I really running a server?!');
}).listen(8080, '127.0.0.1');

console.log('running server!');
Run Code Online (Sandbox Code Playgroud)

当我在我的终端并运行时node app.js,控制台吐出'running server!',但在我的浏览器中,我得到了,Uncaught ReferenceError: require is not defined.

有人可以向我解释为什么在终端中,它可以正常工作,但在浏览器中,它不是吗?

我正在使用节点http-server来为我的页面提供服务.

Abe*_*bel 115

从版本 14 开始,这现在也可以在 Node.js 中发生。

当您在package.json. 如果这样做,某些 CommonJS 变量将无法使用,包括require.

要解决此问题,请"type": "module"从您的package.json文件中删除并确保您没有任何以.mjs.

  • 使用 Node 14,从 package.json 中取出 `"type": "module"` 结果 `(node:7396) 警告:要加载 ES 模块,请在 package.json 中设置 "type": "module" 或使用.mjs`。我没有 .mjs (9认同)
  • 项目文件夹中的任何内容都可能发生这种情况。因此,如果您有一个使用 `CommonJS` 导入编写的不相关的构建脚本,但 `project.json` 具有 `"type": "module"`,那么构建脚本将会中断,即使它没有在 `package.json` 中引用。 `。 (6认同)
  • 这样你就不能使用“import”。 (4认同)
  • 您仍然可以使用 [createRequire](https://nodejs.org/api/modules.html#modules_module_createrequire_filename) 在模块中使用 require (2认同)
  • 您还可以将文件扩展名重命名为“.cjs” (2认同)

Rob*_*sch 58

Node.JS是服务器端技术,而不是浏览器技术.因此,特定于节点的调用require()在浏览器中不起作用.

browserify的WebPack如果你想从节点服务于特定浏览器的模块.


Dr-*_*ket 49

正如 Abel 所说,Node >= 14 中的ES 模块require默认不再具有。

如果要添加它,请将此代码放在文件的顶部:

import { createRequire } from 'module';
const require = createRequire(import.meta.url);
Run Code Online (Sandbox Code Playgroud)

来源:https : //nodejs.org/api/modules.html#modules_module_createrequire_filename

  • 我们如何在 TypeScript 中添加它,以便它在编译后的 JS 中添加它? (3认同)

jfr*_*d00 43

在终端中,您正在运行节点应用程序,它正在运行您的脚本.这与在浏览器中直接运行脚本的执行环境截然不同.虽然Javascript语言基本相同(如果您运行Chrome浏览器,则都是V8),其他执行环境(如可用库)也不尽相同.

node.js是一个服务器端Javascript执行环境,它将V8 Javascript引擎与一堆服务器端库相结合. require()是node.js添加到环境中的一个这样的功能.因此,当您在终端中运行节点时,您正在运行包含的环境require().

require()不是浏览器内置的功能.这是node.js的一个特定功能,而不是浏览器的特定功能.因此,当您尝试让浏览器运行您的脚本时,它没有require().

有一些方法可以在浏览器中运行某些形式的node.js代码(但不是全部).例如,您可以require()类似地获得该工作的浏览器替代品(尽管不完全相同).

但是,您不会在浏览器中运行Web服务器,因为浏览器无法执行此操作.


您可能对browserify感兴趣,它允许您使用require()语句在浏览器中使用节点样式模块.

  • @ N73k - 我不会认为这是一个严肃的问题.如果你想阅读node.js,它是什么以及人们使用它是什么,这是一个完全不同的主题,你可以从在网上自己搜索并找到各种文章开始.Javascript是一种真正的OOP语言.也许与你想要的不同,但这只是你的意见,有很多人出于各种原因不同意你的意见.这不是辩论或讨论的地方. (11认同)
  • @HasinduDahanayake - 这个煽动性言论有什么意义?JS 是一种非常真实的面向对象语言。语言中的一切都是具有方法、类的对象,并且具有扩展类或对象的能力。它是松散类型的,但这并没有使它变得不那么面向对象。 (9认同)

小智 6

"type":"module"只需从 package.json 中删除即可。

  • 使用 Node 14,从 package.json 中取出 `"type": "module"` 结果 `(node:7396) 警告:要加载 ES 模块,请在 package.json 中设置 "type": "module" 或使用.mjs`。我没有 .mjs (14认同)
  • 这没有帮助。 (2认同)