在CouchDB Definitive Guide筆者說,你可以使用:在CouchDB中使用require()或//!json,!代碼?
// !json templates.edit
// !json blog
// !code vendor/couchapp/path.js
// !code vendor/couchapp/template.js
但是,爲什麼使用這些宏時,你可以使用require()?
有沒有這種情況我想用宏來代替?
在CouchDB Definitive Guide筆者說,你可以使用:在CouchDB中使用require()或//!json,!代碼?
// !json templates.edit
// !json blog
// !code vendor/couchapp/path.js
// !code vendor/couchapp/template.js
但是,爲什麼使用這些宏時,你可以使用require()?
有沒有這種情況我想用宏來代替?
基本上這隻有在使用CouchDB和CouchApp時纔有意義。
它可以更輕鬆地將數據從show函數中分離出來。
通常情況下,CouchDB使用Mozilla的SpiderMonkey JavaScript引擎來呈現視圖,因此沒有可用的CommonJS實現。
基本上CouchApp允許您使用JavaScript「顯示」功能(存儲在數據庫中)來呈現HTML。
因此,在Node.js方面,不,它使用宏沒有意義。另外,我快速瀏覽了Node.js的兩個可用CouchDB模塊,我找不到任何對宏的支持,這進一步表明這是一些CouchApp特定的功能。
這是CommonJS模塊引入CouchDB之前的一個功能。這些宏現在已經非常陳舊了。
目前它們還在使用中。雖然使用require
看起來更清晰,但因爲依賴性在運行時進行評估,所以調試起來很困難。在推送到Couch之前,使用宏查找代碼
只需添加一些我認爲對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函數來連接和最小化以這種方式嵌入到一個包中的幾個腳本。
我一直在尋找無處不在,試圖找出這個問題:我如何在show函數中引用html模板?我可以使用require()嗎? – Costa 2012-04-06 05:39:04
查看kan.so上的Kanso工具。它允許使用基於Common JS的替代方法。 – 2013-10-25 03:59:08