在CouchDB中使用require()或//!json,!代码?

在CouchDB权威指南中 ,作者说你可以使用:

// !json templates.edit // !json blog // !code vendor/couchapp/path.js // !code vendor/couchapp/template.js 

但是,为什么使用这些macros,当你可以使用require()?

有没有我想要使用macros的场合呢?

基本上这只是与CouchApp一起使用CouchDB 才有意义 。

它允许从显示function更容易地分离数据。
通常情况下,CouchDB使用Mozilla的SpiderMonkey JavaScript引擎来渲染视图,因此没有CommonJS实现。

基本上CouchApp允许你使用JavaScript的“显示”function(存储在数据库中)来呈现HTML。

因此,就Node.js而言,不,使用这些macros是没有意义的。 另外,我快速浏览了Node.js的两个可用的CouchDB模块,我找不到任何对macros的支持,这进一步表明这是一些CouchApp的特定function。

这是CommonJS模块引入到CouchDB之前的一个function。 这些macros现在已经过时了。

只是添加了一些我认为对CouchDB有用的新东西。

首先, require()函数似乎不能包含devise文档附件,这意味着如果您想在客户端和服务器上包含相同的脚本,则无法像预期的那样将它们放在附件中。

也就是说,虽然下面的工作确定,如果devise文件有一个属性somewhere.foo包含Javascript:

 var js = require('somewhere/foo') 

这不:

 var js = require('_attachments/foo') 

错误是(我正在使用CouchDB v1.6):

 {"error":"invalid_require_path", "reason":"Must require a JavaScript string, not: object"} 

正因为如此,我一直把我的脚本作为属性放在devise文档中,而不是附件。 这意味着它们可以通过require()和客户端(通过show函数)在服务器上访问。

其次,只require() Javascript是可能的,这意味着你不能用它来包含(比如说)作为devise文档属性上传的HTML模板。

couchapp支持的!code!json指令在这里没有什么帮助。 (更不用说,我似乎没有太大的成功让他们工作…)

我发现对模板有用的技巧是,您可以直接在显示和视图中使用this来访问devise文档属性。 所以给定一个devise文档属性templates.edit ,这个工作:

 var template = this.templates.edit; 

这很好地结合在一起,因为它也可以用来提供一个显示function,它提供了作为属性embedded的Javascript。 说这是在devise文档的shows.myscript属性:

 function(doc, req) { return this.js.myscript; } 

然后URL http://localhost:5984/<database>/_design/<id>/_show/myscript会将其提供给客户端,这意味着您可以在HTML中引用它。 如果你愿意的话,你也可以使用你的show函数来连接和最小化以这种方式embedded到一个包中的几个脚本。

目前它们还在使用中。 尽pipe使用require看起来更清晰,但由于在运行时对依赖关系进行了评估,所以debugging起来很困难。 使用这些macros,在推送到Couch之前查找代码