当服务器需要访问套接字之类的东西时,browserify 怎么可能在浏览器中生成服务器代码 运行?

How is it possible that browserify can make server code run in the browser when servers need access to things like sockets?

我只是不知道某些浏览器提供的功能,还是这个库使用了一些奇怪的变通方法来实现这些功能?

实际上,它既不是 ;-)

基本上,简单的答案是:Browserify 不会将所有东西 带入浏览器,只会将真正有意义且从技术角度来看可行的东西带入浏览器。

例如,您可以轻松拥有

url.format(...)

在浏览器中,因为这意味着只处理内存中的对象和字符串,但你不能

http.createServer(...)

因为这根本行不通。除此之外,Browserify 还为 requiremodule.exports 提供垫片,因此您也可以在浏览器中使用 CommonJS 模块,但前提是它们坚持那里可用的东西。同样,例如,任何用 C++ 编写的 CommonJS 模块都不能在浏览器中工作,无论是否有 Browserify。

最后,Browserify 使用了几个模块,这些模块基本上 API 兼容 Node.js,但已针对浏览器重写,例如http-browserify.

所以,最终,它是所谓的 "isomorphic JavaScript" 的好工具,换句话说:在服务器和浏览器中使用 CommonJS 模块,而无需在任何一个上使用特殊模式端,例如 AMD 或 UMD。

但是,当然,它不提供任何魔法:-)

Browserify 不会向您的浏览器添加功能。它会编译您的 Node.js 代码,以便它可以在浏览器中运行。

简而言之,Browserify 允许您在浏览器端代码中使用 Node 的 require;它不会授予您的浏览器访问它尚不具备的网络和文件系统功能的权限。

相反,您需要使用(或编写)模拟服务器端功能的自定义模块。例如,如果您在服务器端代码中使用数据库模块(例如 Postgres 或 Mongo),您可以编写一个新的数据库模块(与服务器端模块具有相同的 API)使用浏览器支持的存储机制,如 IndexedDB。