2010-12-05 36 views

回答

2

基本上這隻有在使用CouchDB和CouchApp時纔有意義。

它可以更輕鬆地將數據從show函數中分離出來。
通常情況下,CouchDB使用Mozilla的SpiderMonkey JavaScript引擎來呈現視圖,因此沒有可用的CommonJS實現。

基本上CouchApp允許您使用JavaScript「顯示」功能(存儲在數據庫中)來呈現HTML。

因此,在Node.js方面,不,它使用宏沒有意義。另外,我快速瀏覽了Node.js的兩個可用CouchDB模塊,我找不到任何對宏的支持,這進一步表明這是一些CouchApp特定的功能。

+2

我一直在尋找無處不在,試圖找出這個問題:我如何在show函數中引用html模板?我可以使用require()嗎? – Costa 2012-04-06 05:39:04

+1

查看kan.so上的Kanso工具。它允許使用基於Common JS的替代方法。 – 2013-10-25 03:59:08

6

這是CommonJS模塊引入CouchDB之前的一個功能。這些宏現在已經非常陳舊了。

0

目前它們還在使用中。雖然使用require看起來更清晰,但因爲依賴性在運行時進行評估,所以調試起來很困難。在推送到Couch之前,使用宏查找代碼

1

只需添加一些我認爲對CouchDB有用的新功能。

首先,require()函數似乎無法包含設計文檔附件,這意味着如果您希望在客戶端和服務器上包含相同的腳本,則無法按照您的預期將它們放入附件中。

也就是說,雖然如果設計文檔有包含JavaScript屬性somewhere.foo以下幾項工作確定:

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"} 

因此,我一直把我的腳本我n設計文件作爲屬性,而不是附件。這意味着它們可以通過服務器require()訪問,也可以通過客戶端訪問(通過顯示功能)。

其次,只有require() ing是可能的,這意味着你不能用它來包含(比如說)作爲設計文檔屬性上傳的HTML模板。

由couchapp支持的!code!json指令在這裏沒有什麼幫助。 (更不用說,我似乎沒有太大的成功讓他們工作......)

我發現對模板有用的技巧是,您可以使用this直接在節目和視圖中訪問設計文檔屬性。因此,考慮設計文檔屬性templates.edit,這個工程:

var template = this.templates.edit; 

這種關係的很好,因爲它也可以被用來提供一個展示功能,提供您嵌入作爲屬性的JavaScript。之所以這樣說,是在設計文檔的shows.myscript屬性:

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

然後URL http://localhost:5984/<database>/_design/<id>/_show/myscript將它用於客戶端,這意味着你可以參考它在你的HTML。如果你願意的話,你也可以使用你的show函數來連接和最小化以這種方式嵌入到一個包中的幾個腳本。