1. 程式人生 > >render()函式進行伺服器端渲染(詳細)

render()函式進行伺服器端渲染(詳細)

使用 Express 做服務端框架的時候,如果選擇一種類似於 EJS這種模板引擎渲染前端頁面的時候,經常服務端在響應 http 請求的時候呼叫 res.render({options}) 去向模板中渲染資料, 可以把檢視響應給客戶端.

框架
在這裡插入圖片描述
怎麼來的?

安裝package.json => npm init
新建app.js
安裝express框架 => npm install express --save
模組什麼時候用什麼時候安裝
node app
新建public資料夾/index.html(客戶端渲染)
建立views資料夾/product.js order.js

app.js

const express = require('express');
const app = express();
app.use(express.static('public'));
app.listen(7000,function(){
    console.log('服務已經啟動,請訪問http://localhost:7000');
    // 訪問http://localhost:7000 
})

報錯cannot get/ 原因沒有設定靜態資源目錄 管線
就是加入管線 app.use(express.static('public'));

為什麼能找到public資料夾?
把app.use看成管道,第一道網就是public,帶進入這個資料夾,預設進入index.js

index.html

<body>
    <h1>我是主頁</h1>
    <a href="http://www.baidu.com">百度</a>
    <a href="/user.html">使用者</a>
    <!-- 跳轉使用render函式 -路由 -->
    <a href="/order/list">訂單列表</a>
    <a href="/product/list">產品列表</a>  
    <a href="/api/product/list">產品列表</a>  
</body>

1打通路
在這裡插入圖片描述
加入管線
在這裡插入圖片描述
效果:返回一個json
在這裡插入圖片描述

2.怎麼讓他返回一個HTML頁面?

express約定的檢視資料夾views
在這裡插入圖片描述
node app
效果:找不到檔案
在這裡插入圖片描述
缺少一道網 -->檢視模板 必須用它來找views/.html並且可以解析它->安裝ejs

npm install ejs --save

引入 const ejs = require('ejs');
加入管線(設定檢視引擎) app.engine('ejs',ejs.renderFile);
在這裡插入圖片描述
3.怎麼讓他去找到views資料夾? app.set('views','views'); set和use功能一樣
// 第一個引數是檢視模板(固定),第二個引數是檢視模板所在的位置,預設express框架把views資料夾當成檢視檔案的位置

app.engine('ejs',require('ejs').renderFile);//優化

查文件 http://www.expressjs.com.cn/4x/api.html#app.engine

如果想讓他解析jsp檔案(安全性高)
app.engine(‘jsp’,require(‘ejs’).renderFile);//優化
views/ order.jsp
router/order.js ->res.render(‘order.jsp’)//ejs字尾可以省略
在這裡插入圖片描述
改成ejs
app.engine(‘ejs’,require(‘ejs’).renderFile);
views/ order.ejs
router/order.js ->res.render(‘order’)
在這裡插入圖片描述
錯誤表示沒有解析器,設定一個解析器
app.set(‘view engine’,‘ejs’);

相當於

解析HTML,js

app.engine('ejs',require('ejs').renderFile);

解析ejs

app.set('view engine','ejs');

兩個作用一樣
4.怎麼讓檢視動態化?

原來:檢視模板裡面發起ajax請求 ,指令碼,jQuery $.get 獲取資料,繫結到檢視上(dom繫結)

現在:要動態渲染,需要資料

資料從哪裡來?

回到render函式

res.render('order',[option]);

// 第一個引數是檢視的名稱,如果是.ejs檔案,必須省略字尾名,如果是.html,.jsp,.abc,.def等自己定義的字尾名時,必須加字尾。
 // 第二個引數是檢視需要的資料

資料傳過去了如何使用?

ejs語法

<%= title %>

app.js

app.set('views','views');//可以省略。預設
app.set('view engine','ejs');//與下兩行等效  如果是.ejs檔案,可省略字尾名,
// 需要使用檢視模板引擎,讓他解析views檔案中的.html檔案
// 需要安裝檢視模板引擎:npm install ejs --save
	//      const ejs = require('ejs');
	//      app.engine('ejs',ejs.renderFile);
	// 設定檢視引擎
	// 加()立即執行了,沒有加()相當於繫結到前面
	// app.engine('ejs',require('ejs').renderFile);//要在order.js里加 res.render('order.ejs')  如果是.ejs檔案,必須加上字尾名,
//------------------------------------------------------
app.use(require('./router/order.js'));
app.use(require('./router/product.js'));
// 理解在介面前多加一個字首
app.use('/api',require('./router/product.js'));

router/order.js

const express = require('express');
const route = express.Router(); 

// 方盒子-屬性,不加括號、 立方體-方法加括號
// a標籤發起的是get請求,如果要讓他發起post請求,要設定監聽事件
route.get('/order/list',function(req,res,next){
    // res.json({code:200});
  
    res.render('order',{
        title:'我是訂單列表頁',
        content:'<h2>我是標題2</h2>',
        person:{
            name:'張三',
            age:20,
            sex:true,
            fav:['讀書','聽音樂','唱歌']
        }
    });
});

module.exports = route;

模板用ejs渲染
views/order.ejs

<body>
    訂單列表
    <!-- 帶=的不會解析HTML標籤,
        帶-的會解析HTML標籤 
        判斷語句注意:1.不能加=號 2.閉合{}-->
    <%= title %>
    <hr>
    <%- content %>
    <hr>
    姓名:<%= person.name %><br />
    年齡:<%= person.age %><br />
    姓別:<%= person.sex?"男":"女" %><br />
    姓別:<% if(person.sex){ %>
                <span style="color: red">男</span>
          <% }else{     %>
                女
          <% } %>
    <hr>
    愛好:
    <% for(var i = 0; i < person.fav.length ;i++){%>
    <%=     person.fav[i]%>
    <%  }%>
</body>

在這裡插入圖片描述

router/product.js

const express = require('express');

const route = express.Router();

route.get("/product/list",function(req,res,next){
    res.render('product',{
        id:1,
        name:'華為',
        price:2000,
        amount:309,
        products:[
            {id:2,name:'華為1',price:200, amount:309},
            {id:3,name:'華為2',price:20, amount:309}
        ]
    });
});

module.exports = route;

product.ejs

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        table{
            /* 為表格設定合併邊框模型 */
            border-collapse: collapse;
            width: 600px;
        }
        th,td{
            border:1px solid #ccc;
            height:40px;
            text-align: center;
        }
    </style>
</head>
<body>
    <h2>產品列表</h2>
    <table>
        <tr>
            <td>編號</td>
            <th>產品名稱</th>
            <th>單價</th>
            <th>庫存量</th>
        </tr>
        <tr>
            <td><%=id%></td>
            <td><%=name%></td>
            <td><%=price%></td>
            <td><%=amount%></td>
        </tr>
        <% for(var i = 0;i < products.length;i++ ){ %>
        <tr>
            <td><%= products[i].id %></td>
            <td><%= products[i].name %></td>
            <td><%= products[i].price %></td>
            <td><%= products[i].amount %></td>
        </tr>   
        <% } %>
    </table>
</body>
</html>

在這裡插入圖片描述