【问题标题】:require is not defined? Node.js要求没有定义?节点.js
【发布时间】:2015-11-03 01:53:59
【问题描述】:

刚开始使用 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!');

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

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

我正在使用节点的http-server 来提供我的页面。

【问题讨论】:

  • 你是在……在浏览器中运行那个 js 文件吗?你不应该这样做......
  • 我也遇到了同样的问题,我刚刚从 package.json 文件中删除了 "type": "module"
  • @Synchro 谢谢!我删除了我的 package.json 文件并且它起作用了。我只是在学习,所以它不是产品设置。

标签: javascript node.js google-chrome


【解决方案1】:

只需从你的 package.json 中删除 "type":"module"。希望对你有所帮助?。

【讨论】:

  • 使用节点 14,从 package.json 结果 (node:7396) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs 中取出 "type": "module"。我没有任何 .mjs
  • 没用。
【解决方案2】:

第1点:Add require()函数调用行代码只在app.js文件或main.js文件中。

第 2 点:通过检查 pacakage.json 文件确保安装了所需的软件包。如果没有更新,请运行“npm i”。

【讨论】:

    【解决方案3】:

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

    如果要添加,请将以下代码放在文件顶部:

    import { createRequire } from 'module';
    const require = createRequire(import.meta.url);
    

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

    【讨论】:

    • 我们如何在 TypeScript 中添加它,以便在编译后的 JS 中添加它?
    【解决方案4】:

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

    当您在 package.json 中将包类型声明为模块时,就会发生这种情况。如果你这样做,certain CommonJS variables can't be used,包括require

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

    【讨论】:

    • 您的项目文件夹中的任何内容都可能发生这种情况。因此,如果您有一个使用 CommonJS 导入编写的不相关的构建脚本,但一个带有 "type": "module"project.json,那么即使在 package.json 中没有引用它,构建脚本也会中断。
    • 你仍然可以在使用createRequire的模块中使用require
    • 也可以将文件扩展名重命名为.cjs
    • 使用节点 14,从 package.json 结果 (node:7396) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs 中取出 "type": "module"。我没有任何 .mjs
    • 那样你不能使用import
    【解决方案5】:

    为了补充上面其他人所说的内容,当您的 HTML 文件中有路径时,您的 js 文件正在客户端读取。至少这对我来说是个问题。我在我的 index.html 的标签中将它作为脚本希望这会有所帮助!

    【讨论】:

    • 那么您的答案中有哪些新信息?它看起来就像“我也是”-评论。
    【解决方案6】:

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

    如果您希望从 Node 提供特定于浏览器的模块,请参阅 browserifywebpack

    【讨论】:

    • 我也遇到了同样的问题,同时安装了browserify和webpack,但是问题依旧!!
    • 在不知道您的特定配置的情况下,我无能为力。最好针对您的具体问题创建一个新问题。
    【解决方案7】:

    在终端中,您正在运行节点应用程序并且它正在运行您的脚本。这是一个与直接在浏览器中运行脚本截然不同的执行环境。虽然 Javascript 语言大致相同(如果您运行的是 Chrome 浏览器,则两者都是 V8),但其他执行环境(例如可用的库)却不一样。

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

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

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

    但是,您不会在浏览器中运行 Web 服务器,因为浏览器无法做到这一点。


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

    【讨论】:

    • @N73k - 我不会把它当作一个严肃的问题。如果你想了解 node.js,它是什么以及人们用它做什么,那是一个完全不同的话题,你可以先在网络上进行自己的搜索,然后找到各种文章。 Javascript 是一种真正的 OOP 语言。也许与您认为自己想要的不同,但这只是您的意见,并且有很多人出于各种原因不同意您的意见。这不是辩论或讨论的地方。
    • @HasinduDahanayake - 这个煽动性声明的意义何在? JS 是一种非常真实的面向对象语言。语言中的一切都是具有方法的对象,具有类,具有扩展类或对象的能力。它的类型很松散,但这并没有减少 OO。
    猜你喜欢
    • 2018-07-14
    • 2014-09-23
    • 1970-01-01
    • 2015-04-03
    • 2019-03-13
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多