您不能从 Web 浏览器内部运行 Web 服务器。浏览器中真的没有任何东西可以像 Node 的http
模块一样工作。在浏览器中运行 PhantomJS 也没有任何意义,因为 PhantomJS是一个网络浏览器。
您想要完成的期望行为是什么?
更新:
似乎您正在尝试在浏览器中运行适用于 Node.js 的代码。
浏览器中的 JavaScript 引擎比 Node.js 中的限制性更强,例如,出于安全原因,您无法从浏览器内部访问文件系统(否则您可以读取访问过您网页的任何人的硬盘驱动器) .
Browserify 确实包含一些“垫片”,它们会将小型 JS 库放入在浏览器中工作并匹配 Node.js 的 API 的代码中,从而允许一些特定于 Node.js 的 JS 代码在浏览器中执行。
在您的情况下,您需要Phantom
,而这似乎又需要http
。根据 Browserify 文档,它将看到require('http')
并包含一个用于 http 模块的 shim(因为浏览器不提供http
自己的模块)。
然后该Phantom
模块尝试调用http.createServer()
,但根据该 http shim 的文档:
除了 http.METHODS 和 http.STATUS_CODES 之外,该模块还实现了 http.request、http.get 和大部分 http.ClientRequest 和 http.IncomingMessage。
所以http.createServer()
不支持垫片。这也是有道理的,因为浏览器永远不会让您在其内部打开 http 服务器,否则导航到某人的网站可能会导致您的浏览器开始向外部世界提供内容,这显然没有意义。
在您的评论中:
“我希望我的节点 js 脚本可以从另一个 JS 代码执行”
您没有指定正在运行的“其他 JS 代码”。如果该 JS 代码已经在 Node 中运行,那么您根本不需要 Browserify。如果您试图让 Web 浏览器启动一个实际的 Node.js 进程,这不会发生,同样出于明显的安全原因,因为浏览网页不应该能够在您的设备上运行任何可执行文件系统。
Browserify 让你做的是获取最初用于 Node.js 的代码,并在浏览器中运行它,但在运行时它在浏览器中执行,而不是在 Node.js 中,所以你只能使用在 Node.js 中工作的 JS 代码浏览器的 JS 运行时的约束。
如果您尝试在 Node.js 中执行代码,那么您需要通过从命令行启动 Node.js 可执行文件或让另一个程序为您启动该进程来执行此操作,但这不能在网络浏览器中完成。如果您试图让用户导航到您的网站,然后让这些代码在他们的机器上的浏览器中运行,而不是在 Node.js 中,那么您只需要使用在浏览器中工作的模块。