是的,我熟悉 Handlebars 模板引擎。它是一個流行的 JavaScript 模板庫,用於構建語義化模板。 它的工作原理可以概括如下:
-
模板編譯: Handlebars 將模板字串編譯成 JavaScript 函式。這個過程發生一次,可以預先編譯,也可以在執行時進行。編譯後的函式接受一個上下文物件作為引數。
-
上下文物件: 上下文物件包含模板渲染所需的資料。它通常是一個 JavaScript 物件,其屬性對應於模板中的變數。
-
資料繫結: Handlebars 使用雙花括號
{{...}}
作為佔位符,將上下文物件中的資料繫結到模板。例如,{{name}}
將被替換為上下文物件中name
屬性的值。 -
表示式: Handlebars 支援簡單的表示式,例如
{{firstName}} {{lastName}}
,以及更復雜的表示式,例如{{user.address.city}}
。 -
Helper 函式: Helper 函式允許你新增自定義邏輯到模板中。例如,你可以建立一個 helper 函式來格式化日期或執行條件邏輯。Helper 函式使用
{{helperName parameter1 parameter2 ...}}
的語法呼叫。 -
內建 Helper 函式: Handlebars 提供了一些內建的 helper 函式,例如
#if
、#unless
、#each
、#with
等,用於控制流程和迭代。 -
塊級 Helper 函式: 塊級 helper 函式允許你定義更復雜的邏輯,包括迴圈和條件渲染。它們使用
{{#helperName}} ... {{/helperName}}
的語法。例如,{{#each users}} ... {{/each}}
可以用來迭代users
陣列。 -
部分: 部分允許你定義可重用的模板片段。它們使用
{{> partialName}}
的語法呼叫。 -
HTML 轉義: 預設情況下,Handlebars 會對輸出進行 HTML 轉義,以防止跨站指令碼攻擊 (XSS)。你可以使用三個花括號
{{{...}}}
來禁用 HTML 轉義。
簡單示例:
// 模板字串
const template = Handlebars.compile("Hello, {{name}}!");
// 上下文物件
const context = { name: "World" };
// 渲染模板
const output = template(context);
// 輸出: Hello, World!
console.log(output);
更復雜的示例 (使用 #each
helper):
const template = Handlebars.compile(`
<ul>
{{#each users}}
<li>{{name}} - {{email}}</li>
{{/each}}
</ul>
`);
const context = {
users: [
{ name: "Alice", email: "alice@example.com" },
{ name: "Bob", email: "bob@example.com" }
]
};
const output = template(context);
console.log(output);
總結:
Handlebars 透過將模板編譯成 JavaScript 函式,並使用上下文物件提供資料來渲染模板。它提供了豐富的功能,例如表示式、helper 函式、內建 helper 函式、塊級 helper 函式和部分,使你能夠建立動態和可重用的模板。 它的學習曲線相對平緩,並且擁有活躍的社群支援。