動態網頁是指前端頁面當中的數據內容來源於后台數據庫,前端的html
代碼會隨着后台數據的變化而變化,是動態生成的。制作動態網頁有兩種方式,一種方式是在后台拿到前端的html
模板,利用后台模板引擎(如ejs
等)在后台完成數據與html
模板的拼接,最后把拼接完成的完整html
代碼返回給前端。但是這種工作模式會逐步走向過時,因為它不符合前后端分離的趨勢。而第二種方式則更加符合我們所提倡的前后端分離的概念,即后台只提供json
數據,不做模板拼接的工作,前端通過ajax
來向后台請求json
數據,然后在前台利用前台模板引擎(如artTemplate
等)完成數據與模板的拼接工作,從而生成完整的html
代碼。下面就詳細介紹這兩種模板引擎的常用用法。
一、后台模板引擎ejs
現在比較著名的后台模板引擎有ejs
和jade
。這兩個都屬於node
的第三方模塊包,都可以通過npm
的方式進行下載,我們下面具體介紹ejs
的用法。
1、下載並引包
在當前的項目文件夾下,用命令->npm install ejs
來下載這個模塊包。然后通過const ejs = require('ejs');
來引包。
2、書寫前端模板
由於之后要在后台完成模板拼接的工作,並且前端的數據也來源於后台,故對於前端模板,我們只需要根據ejs
所需要的模板的語法規則,把之后要填入數據的部分用特殊的標識符標出即可。我們用<% %>
來包裹在html
代碼當中出現的js
代碼,對於html
代碼當中需要數據輸出的部分用<%= %>
來包裹表示,這些標識符內部出現的變量、數組、對象等均來源於后台數據。如index.html
當中示例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ejs-template</title> </head> <body> <h1>模板字符串<%= a %></h1> <ul> <% for(var i = 0; i < list.length; i++){ %> <li><%= list[i] %></li> <% } %> </ul> </body> </html>
3、后台模板引擎完成模板拼接
我們將前端模板index.html
文件,與主文件1.js
放在同一個目錄下,在1.js
當中使用http
模塊可以新建一個服務器,當用戶訪問指定ip
和指定端口號時,會利用fs
模塊去讀index.html
文件當中的內容,直接得到為buffer
類型,再使用.toString()
方法將其轉換為字符串類型。在后台利用ejs.render()
方法把模板字符串和json
數據拼接,生成完整的html
代碼字符串,然后設置好響應頭,把完整的內容通過響應體的方式呈遞給前端頁面。下面為主文件1.js
的示例代碼:
const ejs = require('ejs'); const http =require('http'); const fs = require('fs'); const path = require('path'); var server = http.createServer((req,res)=>{ var dictionary = { a:'ejs', list:['apple','banana','pear','tomato'] }; var target = path.join(__dirname,'./index.html'); fs.readFile(target,(err,data)=>{ if(err) throw err; var template = data.toString(); var html = ejs.render(template,dictionary); res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"}); res.end(html); }); }); server.listen(3000,'192.168.155.1');
開啟該服務器之后,訪問對應的網址,則呈遞的頁面結果如下圖所示:
二、前台模板引擎artTemplate
1、下載並引包
我們在github
上搜索artTemplate
,下載地址為 https://github.com/lhywork/ar...,下載完成之后在dist
文件夾下可以看到對應的四個js
源文件,由於artTemplate
支持兩種語法,簡潔語法版和原生語法版,其中js
文件名當中帶-native
的為原生語法版,帶-debug
的為帶注釋的js
文件。下面我們只介紹原生語法版的用法,為了使引入的文件盡可能的小,所以選擇template-native.js
文件進行引入。
由於是前台模板引擎,所以我們在前端文件index.html當中用<script src="template-native.js"></script>
的方式引入。
2、書寫模板
我們在該前端頁面當中在<script type="text/html" id="test"></script>
標簽對當中書寫html
模板字符串,其中給該script
標簽定義一個id
名,便於識別。我們用<% %>
來包裹在html
代碼當中出現的js
代碼,對於html
代碼當中需要數據輸出的部分用<%= %>
來包裹表示,這些標識符內部出現的變量、數組、對象等均來源於后台數據。這種用法與之前介紹的ejs
相類似。下面為模板的示例代碼:
<script type="text/html" id="test"> <h3><%= title %></h3> <ul> <% for(var i = 0; i < list.length; i++){ %> <li><%= list[i] %></li> <% } %> </ul> </script>
3、前台模板引擎完成模板拼接
在此我們在前端定義一個json
數據,實際上數據應該來自於ajax
請求的后台數據。再利用固定的方法名template()
,將模板字符串與json
數據進行模板拼接,形成完整的html
代碼,注入到dom
元素當中。其中index.html
的示例代碼為:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>artTemplate-demo</title> <script src="template-native.js"></script> <script type="text/html" id="test"> <h3><%= title %></h3> <ul> <% for(var i = 0; i < list.length; i++){ %> <li><%= list[i] %></li> <% } %> </ul> </script> <script> window.onload = function(){ var dictionary = { title : 'artTemplate-demo', list: ['apple','banana','pear','tomato'] }; var html = template('test',dictionary); document.getElementById('content').innerHTML = html; } </script> </head> <body> <div id="content"></div> </body> </html>
前端頁面渲染的結果如下圖所示: