2014-02-07 102 views
2

加載客戶端腳本我有一個玉模板,browserify + browserify-middleware + jadeify如何從browserify暴露module.exports(通過jadeify)

這是所有在節點服務器端創建一個JavaScript文件,這是使創建生成的JavaScript文件所需的唯一事情:

app.use('/templates', require('browserify-middleware')('./public-includes'), 
{ 
    grep: /\.jade$/, 
    transform: ['jadeify'] 
})); 

然後在Web瀏覽器中,我得到一些javascript從/templates/template.jade代碼,(編輯:我張貼here)我可以看到它設置一個module.exports上的11種函數(就像節點一樣)。但是,我如何從客戶端使用它?我試着用require.js這樣的var template = require('/templates/template.jade', function(template){});,它返回undefined。

我是否也應該在客戶端使用browserify?我見過的所有例子都談論了bundle和東西,但我不知道它是否適用,我在目錄上運行它,並且不提供任何地方的軟件包名稱。

回答

2

理想情況下,無處不在使用browserify。要做到這一點,只是有一個client.js文件,它的作用:

var template = require('./templates/template.jade'); 
// rest of code here 

然後在服務器上,這樣做:

app.get('/client.js', require('browserify-middleware')('./client.js', 
{ 
    transform: ['jadeify'] 
})); 

在你的HTML你再只是做:

<script src="/client.js"></script> 

替代,如果你想使用像requirejs或只是一個獨立的全球,你可以這樣做:

app.get('/templates', require('browserify-middleware')('./public-includes'), 
{ 
    grep: /\.jade$/, 
    transform: ['jadeify'], 
    standalone: 'template' 
})); 

然後你會發現無論是全球template變量聲明在客戶端上,或者它應該requirejs工作,所以你可以這樣做:

require('/templates/template.jade', function (template) { 
    //use template here 
}); 

我不是很有經驗的requirejs雖然如此,你的這種方法可能會有所不同。我真的建議使用browserify的一切。

+0

你已經證明了我所有這些方法的確切問題,我不明白 - 在我的代碼示例中,browserify指向一個目錄(這對我有意義),並且單個文件成爲JavaScript包裝。用你的'client.js'例子,我需要創建一個對該目錄中每個模板的引用?在第二個例子中 - 如果它在一個目錄上運行,那麼「獨立」是什麼?它是否命名每個文件並將其放在全局範圍內? – Madd0g

+0

對不起,只需要添加'standalone:'template''命名函數 - 這實際上並不需要,因爲它是由require.js返回的,但它也使整個工作成爲可能。謝謝,我非常欣慰地看到這個工作:) – Madd0g

+0

我仍然不確定全局範圍,以及它如何與'standalone'和一個目錄一起工作,但由於它對require.js有效,我不知道我在乎。 – Madd0g