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

时间:2016-11-30 22:00:48

标签: node.js reactjs browserify client-side flux

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

我知道你可以使用像Browserify这样的东西进行捆绑和缩小,抓住Node代码生成捆绑浏览器兼容JS文件的所有依赖关系。但现在困扰我的是你怎么知道你能做到这一点。我们如何知道允许在浏览器中使用哪些Node代码?

1 个答案:

答案 0 :(得分:3)

所以,首先让我们考虑在节点中你有

  • JavaScript modules,它们是用JavaScript编写的第三方模块(ECMA5,ECMA6甚至TypeScript或CoffeScript)等;
    • 节点内置模块。这些是节点Core modules,如fspathutil等。
    • 原生编译模块,名为Addons 动态链接的共享对象,用C或C ++编写;

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

转换器,即源代码编译器,通常会处理语法转换,如

Babel.js将现代JavaScript变为旧版引擎

和技术

因为如果你想要转换语法甚至全局变量(如Promise),你需要进行polyfill,所以你将transpiler与polyfill结合起来就像babel-polyfill

最后,我们为捆绑过程处理了不同类型的模块设计模式(模块格式):

以及那些必须捆绑/填充的格式 - 尽可能 - 通过自定义loaders

也就是说,本机模块不会在浏览器中运行:您无法通过Webpack捆绑本机模块。普通模块将会,但不是全部。这是由于几个原因。有一些特定的方法不能“浏览”或“webpacked”。我们以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模块,不支持的模块等。 - 请参阅{{ 3}}关于那个。

因此,您必须查看here,这意味着您可以将此转换应用于browserify,以获得与上述fs转换类似的内容。

这就是说,你怎么知道某个模块会在浏览器中运行?当您设计Web应用程序和Node后端时,您必须做机会主义设计选择设计将在环境中运行的共享模块/库,因此在某些时候进行填充/打包,如对象模型,应用程序逻辑等,其他将处理文件系统I / O或将使用本机插件的模块,因此只能在服务器中工作,通过包装器进行打包,但行为看起来会有所不同,正如我们在fs中看到的那样上面的示例,以及特定于Web的模块,因此这是一个设计问题。

可以添加关于网络模块的说明,即节点httphttps,这要归功于节点list of the transforms之类的库抽象将在任何地方运行或使用特定的变换,如request