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