Backbone.js应用程序使用CommonJS结构与node.js和客户端协同工作
Backbone.js application using CommonJS structure to work with node.js and client
我正在研究一种由BackboneJS应用程序使用CommonJS结构进行编写的方法,该结构允许需要Javascript模块。然后,该应用程序可以在客户端或服务器端使用节点进行工作。
我已经研究了requirejs和其他类似的选项,但你必须以特定的方式编写应用程序,在我看来,这看起来真的很糟糕。
我还研究了browserfy和webmake,它们将您的代码和所需的任何模块合并到一个带有缺失(require)方法的js文件中。这都是一个聪明的想法,但让客户端的代码有点混乱。
有没有这样的东西可以通过以其commonJS格式编写的代码,编译所有与浏览器兼容的所需模块,并生成一个(或多个)可以在浏览器中使用的Javascript文件,而不必担心缺少require方法?更好的是为主干应用程序量身定制的解决方案。
在浏览器中使用CommonJS结构化模块有很多选项:
- RequireJS 2.0.2支持配置选项
cjsTranslate
。在r.js优化器配置中将其设置为cjsTranslate: true
,将使用define
样板包装任何以CommonJS格式出现的包含模块。请在此处查看详细信息 - Cajon是在RequireJS之上构建的一个新的模块加载程序,它支持CommonJS格式的模块(也是由RequireJS作者@jrburke编写的)
- Volo依赖性管理工具(同样由@jrburke提供)能够包含cjs模块并将其转换为amd模块。这可能不是一个很好的选择,但为了完整性,值得包括在内
- 您可以编写一个服务器组件,自动将代码封装在AMD
define
样板中。我相信这就是他们在SoundCloud采取的方法——看看这篇博客文章
编辑2014年8月29日:目前的最佳实践可以说是使用生成的源映射进行Browserify,以便于客户端调试。
我不清楚为什么像webmake这样的东西不能解决你的问题。
-
它不需要以与服务器端模块不同的方式编写客户端模块。
-
你提出了webmake/browerify可能会导致js的问题。你猜怎么着。RequireJS/Coll也做同样的事情。是的,我知道,不一定,但在2012年左右的任何实际生产情况下,你都会有某种工具来组合你的js并缩小它,然后再通过网络发送。
-
@rharper目前接受的答案中的前三点基本上列出了AMD加载程序空间中的替代方案。AMD作为一个概念肯定与CommonJS非常不同,它解决了一个非常有效的问题,而这个问题没有引起CJS规范编写者的注意。但这对未来来说是一个合理的担忧,因为目前的脚本大小与图像等相比相形见绌。当脚本大小成为一个显著的性能问题时,我们可能会有ECMA Harmony模块,它应该支持本地浏览器。(即使在今天,也没有什么能阻止你手动将模块划分为逻辑组,并在需要时要求加载每个组合组。只是不经常需要)。
-
webmake是@rharper列出的第四个备选方案的(某种)实现。我提倡webmake而不是browserfy,因为webmake在其授权中声明,它只应该做一件事——在您编写了一堆模块并通过
require("foo")
和exports.bar = ...
机制声明了它们的依赖关系之后,您运行一个指定初始javascript文件的命令,它会吐出一个包含所有可传递发现的依赖关系的js文件。在我有限的使用经验中,它做得很好。只需最少的开销,就可以添加75多行未缩小的代码作为前导码。 -
如果在开发过程中有一个额外的构建步骤会引起摩擦,那么您也可以动态地重新生成组合的js,并通过node.js服务器(几行代码)为其提供服务。webmake还支持源映射,因此在webkit浏览器中进行调试也可以。
-
请记住,我之所以建议webmake,是因为经过大量的搜索,它是我遇到的最简单的解决方案。但这并不意味着它对你有效。这个空间中有这么多替代方案的原因是,每个方案都有自己的一套铃声和口哨声,其中一些可能对您的用例至关重要。但是,在大多数优秀的javascript加载程序的情况下,一般原则仍然适用:
-
不管你是用AMD还是CJS,你都不需要写AMD的样板@rharper列出了一些AMD的替代品,它们支持自动做到这一点。
-
您应该有两条不同的生产和开发路径。从今天起,生产javascript应该缩小/合并。开发javascript不应该,也不需要在保存(在编辑器中)/reload(页面)/debug(在浏览器中)循环中添加额外的步骤。
-
- 在索引.html和应用.js [node.js] 之间共享变量
- JS(node.js)而循环不起作用
- 如何使用 JS (Node.js) 防止 HTTP 查询中允许使用 UTF8 字符串
- Angular JS & Node Webkit Routing
- 当作为脚本运行时.js Node中“this”的上下文是什么
- JS/Node:- 使用 node.io 选择标记
- JavaScript 如何让节点在返回 node.js/Node-RED 之前等待
- 处理快速连续的函数调用 - Javascript / underscore.js / node.js
- 如何在一台服务器中运行不同的.js文件.js NODE JS中的文件
- JS node-mysql bools 表现得很奇怪
- Node.js+Node Webkit+基于Node串行端口的应用程序-这可能吗
- 如何在Express.js/Node.js中检查查询字符串是否有值
- Express.Js, Node.Js, MongoDB Questions
- 在JS/Node中,当多个人编辑相同的记录时,如何避免数据冲突?有图案吗
- 服务器端js(node.js)上的同步
- 将参数从jade发送到js/node
- angular.js+node.js/electron中的Promise;不起作用
- 是否有可能确定我的应用程序的aws实例使用js/node aws-sdk
- Image Magick模块抛出奇怪的错误(Express js Node js)
- 用JS (Node.js)读取文本文件'