2016-11-30 157 views
1

我在学习如何使用Flux,并在文档中遇到以下行:“我们可以使用Node的EventEmitter开始使用商店。”你如何知道Node.js代码将在浏览器上运行?

我知道您可以使用诸如Browserify之类的方法来进行绑定和缩小,并获取Node代码所需的所有依赖关系,以便生成捆绑的兼容浏览器的JS文件。但是现在困扰我的是你如何知道你能做什么。我们如何知道我们被允许在浏览器中使用哪些节点代码?

+0

在浏览器中运行的节点代码? nodejs是服务器端运行时。如果您指的是节点模块,那么您可以检查package.js并确保它没有服务器特定的依赖关系 – Kossel

+0

通常您会重用框架不可知的js并在服务器上保留特定于节点的代码 – aw04

回答

3

那么,首先让我们考虑的是,当节点必须

  • 的JavaScript modules是用JavaScript编写的(ECMA5,ECMA6甚至打字稿或CoffeScript)等中的3rdParty模块;
    • 节点内置模块。这些都是节点Core modulesfspathutil
    • 称为Addons本地编译模块被是 动态链接共享对象,用C或C++;

然后你有打包/模块捆扎机

的transpilers即源到源的编译器。典型将处理语法tranforms像

Babel.js该衬层现代JavaScript以传统发动机

因为你需要,如果你想改变做polyfills技术不仅是语法,而且还包括全局变量(比如Promise),所以你将转译器和polyfill结合起来就像babel-polyfill

最后,我们有不同种的模块设计模式(模块格式),用于捆扎过程进行处理:

和格式是而不是在那些必须捆绑/垫片 - 在可能的情况下 - 通过定制loaders

也就是说,本地模块不会在浏览器中运行:您无法通过Webpack绑定本地模块。普通模块将会,但不是全部。这是由于几个原因。有一些特定的方法不能被“浏览”或“网页包装”。我们以fs为例。你可以把这个内置模块放在浏览器中吗?有一些抽象的调用brfs,这是转换内置节点API 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); 

这不会对建每个非工作-in模块,在npm模块丛林中,因此WebPack有一个module.noParse选项来排除扩展模块,不支持的模块等 - 关于这个请参阅here

所以你必须看看list of the transforms,这意味着你可以将这个变换应用于browserify以获得像上面提到的fs变换。

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

的说明,可联网的模块即节点httphttps即由于库抽象,如节点request会到处运行或使用特定的变换等http-browserify加入。

相关问题