原文鏈接:點(diǎn)這里
幾年之前就有人提出過刷钢,隨著瀏覽器的強(qiáng)大MVC會前移,一個(gè)程序的不再是由一個(gè)個(gè)獨(dú)立的、每次請求由服務(wù)器生成的頁面組成仆葡,而是第一次請求生成的HTML&JS&CSS駐留在瀏覽器中蹂楣,然后通過REST和服務(wù)器進(jìn)行數(shù)據(jù)交互俏站。這并不是一個(gè)什么新的架構(gòu),如果我們用Flex開發(fā)一個(gè)Web程序的話痊土,其實(shí)一般都用的都是這種方式肄扎。瀏覽器的進(jìn)步確實(shí)在推進(jìn)一部分偏重應(yīng)用的Web程序往這個(gè)方向發(fā)展,現(xiàn)在JavaScript的SPA框架已經(jīng)百花齊放了赁酝,如《JavaScript寶座:七大框架論劍》里所說:
加載整個(gè)頁面犯祠,然后再“漸進(jìn)增強(qiáng)”以添加動(dòng)態(tài)行為,這種構(gòu)建Web應(yīng)用的方式已經(jīng)不夠好了酌呆。要想讓應(yīng)用加載快衡载,反應(yīng)靈敏,而且又引領(lǐng)潮流隙袁,必須徹底檢討你的開發(fā)手段痰娱。真正的JavaScript應(yīng)用必須有適當(dāng)?shù)臄?shù)據(jù)模型,并具備客戶端渲染能力菩收,而絕不僅僅是服務(wù)器處理數(shù)據(jù)再加上一些Ajax和jQuery代碼那么簡單猜揪。
在SPA應(yīng)用中幾乎都用到了客戶端模板,似乎服務(wù)器模板已經(jīng)沒有用武之地了坛梁,確實(shí)有很多人認(rèn)為混合使用客戶端模板和服務(wù)器模板是一個(gè)糟糕的實(shí)踐而姐。如何處理好服務(wù)器和客戶端之間的關(guān)系確實(shí)是個(gè)問題,stackoverflow上有人問了類似的問題:《Typical Angular.js workflow and project structure (with Python Flask)》划咐。
在實(shí)際的應(yīng)用 中往往還是展示為主的頁面和部分應(yīng)用為主的頁面(這樣的一個(gè)頁面往往是一個(gè)SPA)的結(jié)合拴念,所有的頁面還是有一些可以共享的東西的——比如頁頭钧萍、頁尾已經(jīng)用戶特定的信息,這部分用服務(wù)器端來處理還是比較簡單政鼠,所以混合使用服務(wù)器模板和客戶端模板目前來說還是一個(gè)務(wù)實(shí)的做法风瘦。
好了,言歸正傳公般。無論是服務(wù)器模板還是客戶端模板大家使用的分隔符也就那么幾種万搔,比如現(xiàn)在正在用的Jinja2(Flask的默認(rèn)模板)和AngularJS默認(rèn)的變量分隔符都是"{{}}",當(dāng)它們一起使用的時(shí)候自然就會產(chǎn)生沖突官帘。
Django里的分割符也是"{{}}"瞬雹,所以可以參考:《AngularJS with Django - Conflicting template tags》里給出的解決方案,簡而言之刽虹,這個(gè)方案就是利用AngularJS的一個(gè)API改變他的分隔符:
myModule.config(function($interpolateProvider) {
$interpolateProvider.startSymbol('{[{');
$interpolateProvider.endSymbol('{[{');
});
但這樣做的缺點(diǎn)是如果你使用了其它的AngularJS的插件酗捌,而這個(gè)插件的模板中使用了"{{}}"這樣的分隔符(寫死在模板中了),那么就會出問題涌哲。
那反過來想想胖缤,我們可以不改客戶端模板的分隔符,而是去改服務(wù)器模板的分隔符阀圾,當(dāng)然Jinja2也是支持的:
env = Environment(variable_start_string="${", variable_end_string="}")
這樣可以把Jinja2的變量分隔符改為“${}”哪廓,當(dāng)然還可以做更多的設(shè)置。但這樣做不只對服務(wù)器端模板的編寫者不習(xí)慣初烘,更嚴(yán)重的問題是一些針對這種模板的編輯器也認(rèn)不出這個(gè)符號了撩独。
除了上述兩種非此即彼的方案,也許二者的分隔符都不做修改是更好的方法账月。Jinja2文檔里有講原樣輸出一個(gè)分隔符的方法:
{{ '{{' }}
如果輸出一大段文字综膀,還有更好的方法:
{% raw %}
<ul>
{% for item in seq %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% endraw %}
當(dāng)然這樣的模板會難看些,但也是比較折中的方法了局齿。
有朋友在評論里提到的方法也是不錯(cuò)的:
在jinja2中使用"{{空格"就可以區(qū)分了
app.jinja_env.variable_start_string = '{{ '
app.jinja_env.variable_end_string = ' }}'
在angularjs中使用{{}}就可以了剧劝,這樣服務(wù)器端和客戶端都不需要修改。
多謝卓之威的評論抓歼。