摘要:靜態(tài)模板文件的內(nèi)容,如模板等,多為字符串,如果直接部署上線,則需要在線上實(shí)時(shí)編譯,引入的模板引擎也需要包含編譯的部分。如果部署時(shí)之前先進(jìn)行模板預(yù)編譯,則模板文件內(nèi)容為一個(gè)預(yù)編譯后生成的模板函數(shù)。使用進(jìn)行預(yù)編譯,有幾種方式。
靜態(tài)模板文件的內(nèi)容,如 Handlebars模板等,多為字符串,如果直接部署上線,則需要在線上實(shí)時(shí)編譯,引入的模板引擎也需要包含編譯的部分。
如果部署時(shí)之前先進(jìn)行模板預(yù)編譯,則:
1. 模板文件內(nèi)容為一個(gè)預(yù)編譯后生成的模板函數(shù)。
2. 線上的性能更高,因?yàn)椴辉傩枰獙?shí)時(shí)編譯模板。
3. 引入的模板引擎更精簡(jiǎn),可以將編譯的部分功能去掉。
使用 Handlebars 進(jìn)行預(yù)編譯,有幾種方式。
首先需要安裝 nodejs具體安裝方式可去官網(wǎng)查找,現(xiàn)在 Mac 和 Linux 版也有編譯過(guò)的 Binaries 文件,不必下載源碼編譯安裝,設(shè)置一下 PATH (增加一條,指向 $node_root/bin/),NODE_PATH (指向 $node_root/lib/node_modules/) 變量即可,非常方便。
安裝 Handlebarsnpm install -g handlebars 根據(jù)情況決定是否安裝到全局。
編譯模板文件按照 Handlebars 官網(wǎng)的說(shuō)法,只需:handlebars -f 即可。
但是這種方式局限性非常大。
1. 必須在命令行直接使用 handlebars 命令,不太容易配合 build 工具
2. 生成的編譯后的模板內(nèi)容(函數(shù)),被直接賦值給了 Handlebars.templates 字典,且 key 被設(shè)置為 文件名 ,而非 路徑名 或 模塊名,容易 命名沖突!這樣的話,需要后期自己處理。
這樣一來(lái),頁(yè)面的引用方式會(huì)有較大變化,即:
var a, b, tpl = require("./path/to/tpl.tpl"); var tpl = Handlebars.compile(tpl);
變?yōu)椋?/p>
require("./path/to/tpl.tpl"); var tpl = Handlebars.templates["tpl.tpl"];
變化太大,很難用自動(dòng)化的工具還自動(dòng)改變引用(除非用很強(qiáng)的書寫約定)。
更好的方式:
寫一段 compile.js 腳本:
var fs = require("fs"); var h = require("handlebars"); var compiledFn = h.precompile(fs.readFileSync("path/to/tpl.tpl")); // 根據(jù)情況 可以將內(nèi)容先轉(zhuǎn)換為 seajs 模塊,再 writeFile var content = "define("xx/id",[],function(){return " + compiledFn + "});"; fs.writeFileSync("path/to/dest/tpl.tpl.js", content);
然后再引用的地方只需將 Handlebars.compile 改為 Handlebars.template 即可(根據(jù)情況,require 的路徑做相應(yīng)調(diào)整):
var a,b, tpl = require("./path/to/tpl.tpl.js"); var tpl = Handlebars.template(tpl);下面舉一個(gè)實(shí)例來(lái)演示:
開(kāi)發(fā)時(shí)的結(jié)構(gòu)可能如下(假設(shè)與 seajs 配合):
__index.html |__script | |__index.js |__tpl | |__index.tpl |__style
index.html 內(nèi)容如下:
...seajs.use("./index"); ...
index.js 內(nèi)容如下:
define(function(require){ // 如果沒(méi)有引入 seajs-text.js 插件, // 則:require("../tpl/index.tpl.js"); var tplStr = require("../tpl/index.tpl"); var tplFn = Handlebars.compile(tplStr); var context = { Title: "Hi, Handlebars!" }; var html = tplFn(context); });
index.tpl 內(nèi)容如下:
{{Title}}
部署時(shí),運(yùn)行上面提到的 compile.js,之后:
index.html 不變,index.js 內(nèi)容:
... // 其實(shí)這里已經(jīng)是編譯后的函數(shù)了,而非 String var tplStr = require("../tpl/index.tpl.js"); var tplFn = Handlebars.template(tplStr); ...
index.tpl.js 內(nèi)容如下:
define("id",[], function(require, exports, module){ // 或 return function (Handlebars, ... module.exports = function (Handlebars,depth0,helpers,partials,data) { this.compilerInfo = [4,">= 1.0.0"]; helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression; buffer += ""; return buffer; } });"; if (stack1 = helpers.Title) { stack1 = stack1.call(depth0, {hash:{},data:data}); } else { stack1 = (depth0 && depth0.Title); stack1 = typeof stack1 === functionType ? stack1.call(depth0, {hash:{},data:data}) : stack1; } buffer += escapeExpression(stack1) + "
轉(zhuǎn)載請(qǐng)注明來(lái)自[超2真人]
本文鏈接:http://www.peichao01.com/static_content/doc/html/Handlebars_precompile.html
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/77994.html
摘要:但在產(chǎn)品模式下,我們非常有必要在的屬性里的里配置一個(gè)來(lái)變向的為靜態(tài)資源注入版本號(hào),如下,以便上線之后頁(yè)面可以引入版本更新后的代碼。通過(guò)給靜態(tài)資源注入值來(lái)作為版本號(hào)的好處主要有兩個(gè)實(shí)現(xiàn)策略。 前言 webpack,作為一個(gè)處理模塊加載、資源依賴管理、構(gòu)建化的工具,已經(jīng)逐漸成為了前端工程化領(lǐng)域的新貴。其創(chuàng)造性的把每個(gè)靜態(tài)資源歸為一個(gè) module(模塊)并能被其強(qiáng)大的 loader 所加載...
摘要:使用這段上下文數(shù)據(jù)會(huì)得到如下結(jié)果不會(huì)再對(duì)安全字符串進(jìn)行編碼。的在模板中可以訪問(wèn)任何的上下文??梢酝ㄟ^(guò)方法注冊(cè)一個(gè)。使用這個(gè)上下文會(huì)得到事實(shí)上,可以使用表達(dá)式在任何上下文中表示對(duì)當(dāng)前的上下文的引用。 Handlebars 為你提供了一個(gè)可以毫無(wú)挫折感的高效率書寫 語(yǔ)義化的模板 所必需的一切。 Mustache 模板和 Handlebars 是兼容的,所以你可以把Mustache模板拿來(lái)...
摘要:頁(yè)面調(diào)試騰訊開(kāi)發(fā)維護(hù)的代碼調(diào)試發(fā)布,錯(cuò)誤監(jiān)控上報(bào),用戶問(wèn)題定位。同樣是由騰訊開(kāi)發(fā)維護(hù)的代碼調(diào)試工具,是針對(duì)移動(dòng)端的調(diào)試工具。前端業(yè)務(wù)代碼工具庫(kù)。動(dòng)畫庫(kù)動(dòng)畫庫(kù),也是目前通用的動(dòng)畫庫(kù)。 本人微信公眾號(hào):前端修煉之路,歡迎關(guān)注 本篇文章整理自己使用過(guò)的和看到過(guò)的一些插件和工具,方便日后自己查找和使用。 另外,感謝白小明,文中很多的工具來(lái)源于此。 彈出框 layer:http://layer....
摘要:如果沒(méi)有看過(guò)之前一篇博客的,或者對(duì)的腳手架沒(méi)有了解過(guò)的同學(xué),推薦先看上一篇如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的腳手架。它是一個(gè)用來(lái)構(gòu)建靜態(tài)網(wǎng)站的類庫(kù),也能夠用來(lái)對(duì)文件進(jìn)行處理。有任何問(wèn)題歡迎進(jìn)行交流。 前言 在之前一篇博客介紹了關(guān)于Node腳手架的一些基礎(chǔ)的知識(shí),這篇博客是在之前的基礎(chǔ)上針對(duì)在Node中開(kāi)發(fā)腳手架中遇到的問(wèn)題,如: 終端樣式、交互問(wèn)題 文件處理問(wèn)題 通過(guò)對(duì)Vue-cli 2.9.2的...
摘要:基于,可以在中導(dǎo)入模板。利用對(duì)象函數(shù)替換對(duì)象或者運(yùn)行函數(shù)支持點(diǎn)語(yǔ)法可以對(duì)象等屬性值使用時(shí),直接標(biāo)簽引入文件。模塊會(huì)自動(dòng)匹配相應(yīng)的數(shù)值,對(duì)象或者是函數(shù)。也可以單獨(dú)建立一個(gè)模板,或者可以用來(lái)唯一確定一個(gè)模板,是固定寫法,不可或缺。 前言:常用的末班引擎有很多,但寫法都大同小異。handlebars.js就是一個(gè)純JS庫(kù),因此你可以向其他腳本一樣用script包起來(lái)。調(diào)用內(nèi)部封裝好的功能。 ...
閱讀 3214·2021-11-11 16:54
閱讀 2378·2021-09-04 16:48
閱讀 3307·2019-08-29 16:08
閱讀 707·2019-08-29 15:13
閱讀 1437·2019-08-29 15:09
閱讀 2731·2019-08-29 12:45
閱讀 1993·2019-08-29 12:12
閱讀 513·2019-08-26 18:27