问题描述:
刚开始使用 Node.js。在我的app/js
文件中,我正在做这样的事情:
应用程序.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
来服务我的页面。
解决思路一:
从版本 14 开始,这现在也可以在 Node.js 中发生。
当您将包类型声明为package.json
.如果这样做,某些 CommonJS 变量将无法使用,包括require
.
要解决此问题,"type": "module"
请从您的package.json
文件中删除并确保您没有任何以.mjs
.
若遇到问题的解决参考:
项目文件夹中的任何内容都可能发生这种情况。因此,如果您有一个不相关的构建脚本,它是用CommonJSimport 编写的,但带有project.jsonwith “type”: “module”,那么构建脚本将会中断,即使它没有在package.json.
您仍然可以使用createRequire在模块中使用 require
我正在使用 nvm,所以我从节点 14 切换到节点 10,并且此错误已修复。
您还可以将文件扩展名重命名为.cjs
“type”: “module”使用 Node 14,从 package.json 结果中取出(node:7396) Warning: To load an ES module, set “type”: “module” in the package.json or use the .mjs。我没有任何 .mjs
这样你就不能用了import。
解决思路二:
在终端中,您正在运行节点应用程序并且它正在运行您的脚本。这是一个与直接在浏览器中运行脚本截然不同的执行环境。虽然 Javascript 语言大致相同(如果您运行的是 Chrome 浏览器,则两者都是 V8),但其他执行环境(例如可用的库)并不相同。
node.js 是一个服务端 Javascript 执行环境,它结合了 V8 Javascript 引擎和一堆服务端库。require()
是 node.js 添加到环境中的一项功能。因此,当您在终端中运行 node 时,您正在运行一个包含require()
.
require()
不是内置在浏览器中的功能。这是 node.js 的特定功能,而不是浏览器的特定功能。因此,当您尝试让浏览器运行您的脚本时,它没有require()
.
有一些方法可以在浏览器中运行某些形式的 node.js 代码(但不是全部)。例如,您可以获得require()
类似(尽管不完全相同)工作的浏览器替代品。
但是,您不会在浏览器中运行 Web 服务器,因为这不是浏览器能够执行的操作。
您可能对browserify感兴趣,它允许您在浏览器中使用require()
语句使用节点样式模块。
解决思路三:
正如 Abel 所说,默认情况下Node >= 14中的 ES 模块不再具有require
。
如果要添加它,请将以下代码放在文件顶部:
以上仅为部分解决思路介绍,查看全部内容,请添加公众号后回复001,即可查看。