Backbone.js应用程序使用CommonJS结构与node.js和客户端协同工作

Backbone.js application using CommonJS structure to work with node.js and client

本文关键字:js node 协同工作 客户端 CommonJS 应用程序 Backbone 结构      更新时间:2024-04-28

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

我已经研究了requirejs和其他类似的选项,但你必须以特定的方式编写应用程序,在我看来,这看起来真的很糟糕。

我还研究了browserfy和webmake,它们将您的代码和所需的任何模块合并到一个带有缺失(require)方法的js文件中。这都是一个聪明的想法,但让客户端的代码有点混乱。

有没有这样的东西可以通过以其commonJS格式编写的代码,编译所有与浏览器兼容的所需模块,并生成一个(或多个)可以在浏览器中使用的Javascript文件,而不必担心缺少require方法?更好的是为主干应用程序量身定制的解决方案。

在浏览器中使用CommonJS结构化模块有很多选项:

  1. RequireJS 2.0.2支持配置选项cjsTranslate。在r.js优化器配置中将其设置为cjsTranslate: true,将使用define样板包装任何以CommonJS格式出现的包含模块。请在此处查看详细信息
  2. Cajon是在RequireJS之上构建的一个新的模块加载程序,它支持CommonJS格式的模块(也是由RequireJS作者@jrburke编写的)
  3. Volo依赖性管理工具(同样由@jrburke提供)能够包含cjs模块并将其转换为amd模块。这可能不是一个很好的选择,但为了完整性,值得包括在内
  4. 您可以编写一个服务器组件,自动将代码封装在AMD define样板中。我相信这就是他们在SoundCloud采取的方法——看看这篇博客文章

编辑2014年8月29日:目前的最佳实践可以说是使用生成的源映射进行Browserify,以便于客户端调试。

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

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

  2. 你提出了webmake/browerify可能会导致js的问题。你猜怎么着。RequireJS/Coll也做同样的事情。是的,我知道,不一定,但在2012年左右的任何实际生产情况下,你都会有某种工具来组合你的js并缩小它,然后再通过网络发送。

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

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

  5. 如果在开发过程中有一个额外的构建步骤会引起摩擦,那么您也可以动态地重新生成组合的js,并通过node.js服务器(几行代码)为其提供服务。webmake还支持源映射,因此在webkit浏览器中进行调试也可以。

  6. 请记住,我之所以建议webmake,是因为经过大量的搜索,它是我遇到的最简单的解决方案。但这并不意味着它对你有效。这个空间中有这么多替代方案的原因是,每个方案都有自己的一套铃声和口哨声,其中一些可能对您的用例至关重要。但是,在大多数优秀的javascript加载程序的情况下,一般原则仍然适用:

    • 不管你是用AMD还是CJS,你都不需要写AMD的样板@rharper列出了一些AMD的替代品,它们支持自动做到这一点。

    • 您应该有两条不同的生产和开发路径。从今天起,生产javascript应该缩小/合并。开发javascript不应该,也不需要在保存(在编辑器中)/reload(页面)/debug(在浏览器中)循环中添加额外的步骤。