browserify错误:http.createServer不是一个函数

我试图browserify这个节点的js脚本:

var phantom = require('phantom') phantom.create(function(ph) { ph.createPage(function(page) { page.open("editor.html", function(status) { console.log("opened diagram? ", status); page.evaluate(function() { return document.getElementById("GraphImage").src; }, function(result) { //console.log(result); ph.exit(); }); }); }); }); 

所以我使用了这个命令:

 browserify myscript.js > bundle.js 

而当我从一个HTML文件运行bundle.js我得到这个错误:

 http.createServer is not a function 

似乎browserify不支持HTTP服务器。 我该如何解决这个问题?

您无法从Web浏览器内运行Web服务器。 浏览器中没有任何东西可以像Node的http模块那样工作。 在浏览器中运行PhantomJS也是没有意义的,因为PhantomJS 一个Web浏览器。

你想要完成什么样的行为?


更新:

好像你试图在浏览器中运行Node.js代码。

浏览器中的JavaScript引擎比Node.js中的JavaScript引擎更具有限制性,例如,出于安全原因,您无法从浏览器内部访问文件系统(否则,您可以读取访问您网页的任何人的硬盘驱动器) 。

Browserify确实包含了一些“shims” ,它会把小型的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.createServer() 。 这也是有道理的,因为浏览器永远不会让你在自己的内部打开一个http服务器,否则导航到别人的网站可能会导致你的浏览器开始向外界提供内容,这显然没有意义。

在你的评论中:

“我希望我的节点js脚本可以从另一个JS代码执行”

你不指定什么“其他的JS代码”在运行。如果该JS代码已经运行在节点,那么你根本不需要Browserify。 如果你想让浏览器启动一个真正的Node.js进程,这种情况不会发生,因为显然的安全原因,因为浏览到一个网页不应该有能力运行任何可执行文件系统。

Browserify允许你做的就是取最初用于Node.js的代码,然后在浏览器中运行它,但是在运行时它在浏览器中执行,而不是在Node.js中,所以你只能使用JS代码浏览器的JS运行时限制。

如果你试图在Node.js中执行你的代码,那么你需要通过启动Node.js可执行文件来实现,无论是从命令行还是让另一个程序为你启动进程,但是不能从networking浏览器内完成。 如果您试图让用户导航到您的网站,然后让这些代码在浏览器中而不是Node.js中运行,那么您只需要使用在浏览器中工作的模块。