Backbone.js应用程序使用CommonJS结构与node.js和client一起工作

时间:2012-07-30 16:41:10

标签: javascript node.js backbone.js requirejs commonjs

我正在寻找一种使用CommonJS结构编写BackboneJS应用程序的方法,该结构允许使用Javascript模块。然后,此应用程序可以在节点的客户端或服务器端工作。

我已经研究了requirejs和其他类似的选项,但你必须以一种特定的方式编写应用程序,在我看来这看起来非常简单。

我还查看了browserifywebmake,其中包含您的代码和所需的任何模块,并将它们组合成一个带有缺失(require)方法的单个js文件。这一切都很聪明,但客户端的代码有点乱。

是否存在可以通过其commonJS格式编写的代码,编译与浏览器兼容的所有必需模块并吐出可在浏览器中使用的Javascript文件(或多个)的事情不得不担心缺少需要的方法?更好的是为骨干应用量身定制的解决方案。

2 个答案:

答案 0 :(得分:6)

您可以在浏览器中使用CommonJS结构化模块:

  1. RequireJS 2.0.2支持配置选项cjsTranslate。在r.js优化器配置中将此值设置为cjsTranslate: true将使用define样板包装任何包含在CommonJS格式中的模块。详情请见here
  2. Cajon是一个基于RequireJS构建的模块加载器,它支持CommonJS格式的模块(也是由RequireJS作者@jrburke编写的)。
  3. Volo依赖关系管理工具(同样由@jrburke)能够将cjs模块包含并转换为amd模块。这可能不是一个很好的选择,但值得包括完整性。
  4. 您可以编写一个服务器组件,自动将代码包装在AMD define样板中。我相信这是他们在SoundCloud采取的方法 - 请参阅this blog post
  5. 编辑2014年8月29日:目前的最佳做法可以说是Browserify生成的源地图,以便于客户端调试。

答案 1 :(得分:1)

我不清楚为什么像webmake这样的东西无法解决你的问题。

  1. 它不要求您以与服务器端模块不同的方式编写客户端模块。

  2. 你提出了关注webmake / browerify munge up the js。好吧,猜猜看。 RequireJS / Curl做同样的事情。是的,我知道,不一定,但是在大约2012年的任何实际生产情况中,你会有一些工具来组合你的js并在通过网络发送之前将其缩小。

  3. @rharper当前接受的答案中的前三个点基本上列出了AMD加载程序空间中的替代方案。 AMD作为一个概念肯定与Common JS非常不同,并且解决了一个非常有效的问题,它没有引起CJS规范编写者的注意。但它是未来的一个有效问题,因为目前的脚本大小与图像相比相形见绌。当脚本大小成为引人注目的性能问题时,我们可能会有ECMA Harmony模块,它应该具有本机浏览器支持。 (即使在今天,也没有什么能阻止您手动将模块拆分为逻辑组,并且需要在需要时加载每个组合组。通常不需要它。)

  4. webmake是@rharper列出的第四种替代方案的(某种)实现。我提倡webmake而不是browserify,因为webmake在其授权中声明它应该只做一件事 - 在你编写了一堆模块后,通过require("foo")exports.bar = ...机制声明了它们的依赖关系运行一个命令,指定您的初始javascript文件,并吐出一个包含所有传递发现的依赖项的js文件。在我使用它的有限经验中,它做得很好。只需很少的开销 - 只需添加75个奇数行的非缩小代码作为前导码。

  5. 如果在开发过程中有额外的构建步骤导致摩擦,您可以选择动态重新生成组合的js并通过node.js服务器(几行代码)提供服务。 webmake还支持源映射,因此webkit浏览器中的调试也可以正常工作。

  6. 请记住,我建议使用webmake,因为经过大量的搜索,这是我遇到的最简单的解决方案。但这并不意味着它适合你。之所以在这个领域有这么多的选择,是因为每个人都有自己的铃铛和口哨,其中一些可能对你的用例至关重要。但一般原则将适用于大多数优秀的javascript加载器:

    • 无论您使用的是AMD还是CJS,都不需要编写AMD样板文件。 @rharper列出了一些支持自动执行此操作的AMD备选方案。

    • 您应该有两种不同的生产和开发途径。生产javascript应该在今天缩小/合并。开发javascript不应该,并且不应该在保存(在编辑器中)/重新加载(页面)/调试(在浏览器中)循环中添加额外的步骤。