你怎么知道Node.js代码将在浏览器上运行?
我正在学习如何使用Flux,并在文档中遇到以下行:“我们可以使用Node的EventEmitter开始使用商店。”
我知道你可以使用诸如Browserify之类的东西来进行绑定和缩小,抓取Node代码所要做的所有依赖项,以使得捆绑的浏览器兼容的JS文件。 但是,现在困扰着我的是如何知道你能做什么。 我们如何知道我们被允许在浏览器中使用哪些节点代码?
所以,首先我们来考虑一下在节点中你有没有
- 用JavaScript编写的3rdParty模块(ECMA5,ECMA6,甚至TypeScript或CoffeScript)等的JavaScript 模块 ;
- 节点内置模块。 这些是像
fs
,path
,util
等节点核心模块 。 - 本地编译模块称为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模块的说明,即节点http
, https
,由于像节点请求这样的库抽象将无处不在或使用特定的变换(如http-browserify) 。