成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Handlebars模板部署時(shí)發(fā)布為預(yù)編譯過(guò)的模板函數(shù)

SnaiLiu / 2553人閱讀

摘要:靜態(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/) 變量即可,非常方便。

安裝 Handlebars

npm 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 += "

"; 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) + "

"; return buffer; } });

轉(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

相關(guān)文章

  • 利用 webpack 處理開(kāi)發(fā)與線上環(huán)境靜態(tài)資源切換問(wèn)題

    摘要:但在產(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 所加載...

    RyanHoo 評(píng)論0 收藏0
  • Handlebars中文文檔(譯自官方版)

    摘要:使用這段上下文數(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)...

    hikui 評(píng)論0 收藏0
  • 前端常用插件、工具類庫(kù)匯總

    摘要:頁(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....

    GitCafe 評(píng)論0 收藏0
  • 如何實(shí)現(xiàn)一個(gè)腳手架進(jìn)階版(Vue-cli v2.9學(xué)習(xí)篇)

    摘要:如果沒(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的...

    thekingisalwaysluc 評(píng)論0 收藏0
  • handlebars.js模板引擎

    摘要:基于,可以在中導(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)部封裝好的功能。 ...

    SimpleTriangle 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<