在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之前查找代码