Node.js日記:模板技術

模板技術

模板技術的誕生是爲了將顯示與數據分離,模板技術多種多樣,但其本質是將模板文件和數據通過模板引擎生成最終的文件內容。

模板技術原理

模板技術並不是什麼神祕技術,乾的是拼接字符串的體力活。模板引擎就是利用正則表達式識別模板標識,並利用數據替換其中的標識符。

模板技術包含兩個方面:

- 定義模板標識符
- 解析模板標識符

代碼舉例:

//字符串替換的思想
function tmpl(str, obj) {       // 解析模板標識
    if (typeof str === 'string') {
        return str.replace(/<%=\s*([^%>]+)\s*%>/g, function() {
            let key = arguments[1];
            return obj[key];
        });
    }
}

let str = "Hello, <%= name%>";  // 模板內容
let obj = {name: "樹先生"};     //  模板數據
console.log(tmp(str, obj))

常用模板技術

模板技術:Pug、Mustache、EJS、Handlebars,國內的有 baiduTemplate(百度)、artTemplate(騰訊)、juicer(淘寶)。

EJS 使用

使用之前需安裝包:

npm install ejs

1)常用標籤

<%=  輸出數據到模板(輸出是轉義 HTML 標籤)

<%-  輸出非轉義的數據到模板

<%  用於流程控制,無輸出

%>  一般結束標籤

2)用法

const ejs = require('ejs');

ejs.render(str, data, options);  // => 輸出繪製後的 HTML字符串

ejs.renderFile(filename, data, options, function(err, str){  // str => 輸出繪製後的 HTML字符串
});

- cache 緩存編譯後的函數,需要提供 filename
- filename 被 cache 參數用做鍵值,同時也用於 include 語句
- context 函數執行時的上下文環境
- compileDebug 當爲 false 時不編譯調試語句
- client 返回獨立的編譯後的函數
- delimiter 放在角括號中的字符,用於標記標籤的開與閉
- debug 將生成的函數體輸出
- _with 是否使用 with() {} 結構。如果爲 false,所有局部數據將存儲在 locals 對象上。
- localsName 如果不使用 with ,localsName 將作爲存儲局部變量的對象的名稱。默認名稱是 locals
- rmWhitespace 刪除所有可安全刪除的空白字符,包括開始與結尾處的空格。對於所有標籤來說,它提供了一個更安全版本的 -%> (在一行的中間並不會剔除標籤後面的換行符)
- escape 爲 <%= 結構設置對應的轉義(escape)函數。它被用於輸出結果以及在生成的客戶端函數中通過 .toString() 輸出。(默認轉義 XML)

3)輸出

// 模板文件 out.ejs
<h2><%= user.name %></h2>
<h2><%- user.name %></h2>
const ejs = require('ejs');
ejs.renderFile(__dirname + '/out.ejs', {user : {name : '<span>lony</span>'}}, (err, str) => {
    // str => 輸出繪製後的 HTML 字符串
    console.log(str);
});

4)條件

// 模板文件 if.ejs
<% if (user) { %>
  <h2><%= user.name %></h2>
<% } %>
const ejs = require('ejs');
ejs.renderFile(__dirname + '/if.ejs', {user : {name : 'lony'}}, (err, str) => {
    console.log(str);
});

5)循環

// 模板文件 loop.ejs
<% users.forEach((user) => { %>
  <%= user.id %> <%= user.name %>
<% }) %>
const ejs = require('ejs');
ejs.renderFile(__dirname + '/loop.ejs', {users : [{id : 1, name: 'xx'}, {id : 2, name: 'yy'}]}, (err, str) => {
    console.log(str);
});

使用模板技術響應 HTML

// books.ejs
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>書籍</title>
</head>
<body>
    <ul>
        <% books.forEach((book) => { %>
            <li><%= book %></li>
        <% }) %>
    </ul>
</body>
</html>
const http = require('http');
const ejs = require('ejs');
// 使用模板技術響應 HTML 格式的數據
http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type' : 'text/html'});
    let data = {books: ['西遊記', '三國演義', '水滸傳', '紅樓夢']};
    ejs.renderFile(__dirname + '/books.ejs', data, (err, str) => {
        console.log(str);
        res.end(str);
    });
}).listen(8888);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章