你怎么知道Node.js代码将在浏览器上运行?

我正在学习如何使用Flux,并在文档中遇到以下行:“我们可以使用Node的EventEmitter开始使用商店。”

我知道你可以使用诸如Browserify之类的东西来进行绑定和缩小,抓取Node代码所要做的所有依赖项,以使得捆绑的浏览器兼容的JS文件。 但是,现在困扰着我的是如何知道你能做什么。 我们如何知道我们被允许在浏览器中使用哪些节点代码?

所以,首先我们来考虑一下在节点中你有没有

  • 用JavaScript编写的3rdParty模块(ECMA5,ECMA6,甚至TypeScript或CoffeScript)等的JavaScript 模块 ;
    • 节点内置模块。 这些是像fspathutil等节点核心模块 。
    • 本地编译模块称为Addons ,它们是dynamic链接的共享对象,用C或C ++编写;

然后你有包装器/模块捆绑器

  • Browserify
  • 的WebPack

译码器即源代码到源代码编译器,典型地将处理类似的语法转换

Babel.js将现代JavaScript 平滑到传统引擎

和技术

  • ECMA5 Shim支持传统的JavaScript引擎
  • HTML5跨浏览器的Polyfills

因为如果你想要改变语法,甚至是全局variables(比如Promise),你需要做polyfill,所以你需要将transpiler和polyfill结合起来,就像babel-polyfill

最后,我们为捆绑过程处理不同types的模块devise模式(模块格式):

  • AMD模块格式
  • CommonJS模块格式

以及那些不是那些必须通过定制装载机捆绑/清理的格式。

也就是说,本地模块不会在浏览器中运行:您不能通过Webpack绑定本地模块。 普通模块将会,但不是全部。 这是由于几个原因。 有一些不能被“浏览”或“网页包装”的具体方法。 以fs为例。 你可以把这个内置的模块在浏览器中? 有一些叫做brfs的抽象,就是内置节点apis fs.readFileSync()fs.readFile() ,所以你会

 $ browserify -t brfs example/main.js > bundle.js 

要得到

 var fs = require('fs'); var html = fs.readFileSync(__dirname + '/robot.html', 'utf8'); console.log(html); 

这不适用于npm模块中的每个非内置模块,所以WebPack有一个module.noParse选项来排除Addons模块,不支持的模块等。

所以你必须看一下变换列表,这意味着你可以将这个变换应用到browserify ,就像上面提到的fs变换一样。

所以说,你怎么知道某个模块会在浏览器中运行? 当你devise你的Web应用程序和Node后端时,你必须做机会主义的deviseselect来devise共同的模块/库,这个模块/库可以在两个环境中运行,因此在一些点上被压缩/打包,如对象模型,应用程序逻辑等将处理文件系统I / O或将使用本机插件的模块,所以只能在服务器上工作,通过包装打包它是可能的,但行为看起来不同,正如我们在上面的fs例子中看到的,networking特定的模块,所以这是一个devise问题。

可以添加关于networking模块的说明,即节点httphttps ,由于像节点请求这样的库抽象将无处不在或使用特定的变换(如http-browserify) 。