require未定义?Node.js

126

我刚开始使用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。有人能解释一下为什么在终端中它可以正常工作,但在浏览器中却不能吗?我正在使用node的http-server来提供我的页面。

13
你是不是在浏览器中运行那个JS文件?你不应该这样做... - david
2
我也遇到了同样的问题,我只是从 package.json 文件中删除了 "type": "module" 行。 - Synchro
@Synchro 谢谢!我删除了我的 package.json 文件,然后它就可以工作了。我只是在学习阶段,所以这不是生产环境设置。 - Adrian
因为这是谷歌的首选结果,所以我能够在将 Angular 8 升级到 14 的过程中修复这个错误,方法是从我的 tsconfig.json 文件的 compilerOptions 中移除了 "strict": true - VoNWooDSoN
9个回答

155

自Node.js版本14起,这种情况现在也可能发生。

当你在package.json中将包类型声明为module时,就会出现这种情况。如果这样做,某些CommonJS变量无法使用,包括require

要修复这个问题,请从你的package.json文件中删除"type": "module",并确保你没有任何以.mjs结尾的文件。


8
这种情况可能发生在项目文件夹中的任何内容上。因此,如果您有一个与CommonJS导入无关的构建脚本,但是具有"type": "module"project.json文件,那么即使该脚本未在package.json中被引用,构建脚本也会出错。 - Joshua Wade
4
在模块中仍然可以使用require,使用createRequire函数即可。 - codedread
我正在使用 nvm,所以我从 node 14 切换到 node 10,这个错误就被解决了。 - Milind
3
你可以将文件扩展名更改为.cjs - Tibor Udvari
9
在使用Node 14时,如果在package.json中删除了"type": "module",会出现以下警告信息:(node:7396) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs。我没有.mjs文件。请翻译以上内容。 - Jeb50
4
这样你就不能使用 import - Piotr Henryk Dabrowski

113
在终端中,您正在运行节点应用程序并运行您的脚本。这是与直接在浏览器中运行脚本非常不同的执行环境。虽然JavaScript语言主要相同(如果您正在运行Chrome浏览器,则都是V8),但其他执行环境(如可用的库)并不相同。
node.js是一个服务器端JavaScript执行环境,它将V8 JavaScript引擎与一堆服务器端库结合起来。 `require()`就是node.js添加到环境中的一个功能。因此,当您在终端中运行节点时,您正在运行包含`require()`的环境。
`require()`不是内置于浏览器中的功能。那是node.js的特定功能,而不是浏览器的功能。因此,当您尝试让浏览器运行您的脚本时,它没有`require()`。
有一些方法可以在浏览器中运行某些形式的node.js代码(但不是全部)。例如,您可以获取浏览器替代品,这些替代品对于`require()`的工作方式类似(但不完全相同)。
但是,您将无法在浏览器中运行Web服务器,因为这不是浏览器具备的能力。
您可能会对browserify感兴趣,它使用`require()`语句让您在浏览器中使用类似于节点样式的模块。

45
@N73k - 我不会把这当作一个严肃的问题。如果你想了解node.js是什么以及人们如何使用它,那是完全不同的话题,你可以通过在网上进行搜索来找到各种文章。JavaScript是一种真正的OOP语言。也许与你认为你想要的不同,但这只是你的观点,有许多人出于各种原因不同意你的观点。这不是争论或讨论的地方。 - jfriend00
11
那个具有煽动性的语句有何意义?JS是一门真正的面向对象语言。语言中的所有内容都是一个带有方法、类和扩展类或对象能力的对象。虽然它是弱类型的,但这并不会使它变得不那么面向对象。 - jfriend00

109

12
我们该如何在 TypeScript 中添加这个功能,以便在编译后在生成的 JS 文件中添加它? - Mike Kormendy

64

Node.JS是一种服务器端技术,而不是浏览器技术。因此,类似于require()这样的特定于Node的调用在浏览器中无法工作。

如果您想从Node提供浏览器特定模块,请参阅browserifywebpack


我也遇到了同样的问题,已经安装了Browserify和Webpack,但问题仍然存在!! - Youssef Boudaya
1
不了解您的特定配置,我无法提供帮助。最好创建一个新问题,描述您的具体问题。 - Rob Raisch

5

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


14
在使用Node 14时,如果从package.json中删除了"type": "module",会导致警告信息(node:7396) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs。但我没有任何.mjs文件。请翻译此内容。 - Jeb50
2
它没有帮助。 - Jasdev Singh Moun
这并没有帮助,你需要写一个警告,提示“如果您的应用程序文件中没有ES6导入”。 - Anas

2
我通过以下步骤解决了这个问题:-
步骤1:在项目根目录下创建addRequire.js文件。
步骤2:在addRequire.js中添加以下代码行。
import { createRequire } from "module";
const require = createRequire(import.meta.url);

global.require = require; //this will make require at the global scobe and treat it like the original require

步骤三:我在app.js文件头部导入了该文件。

import "./start/addRequire.js";

现在你的整个项目中除了import,还有require,你可以在任何地方使用它们。


1

点1:仅在app.js文件或main.js文件中添加require()函数调用代码行。

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


1
我的错误:我安装了ESLint到我的项目中并且在填写调查问卷时选择了错误的模块类型。 也许对其他人有帮助吧)) 你的项目使用哪种类型的模块?·* commonjs

0
我通过从package.json文件中删除以下行来解决它。
 "type": "module"

希望它能解决问题。


这似乎只是对此现有答案的重复。 - Pang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接