美文网首页
前后端交互-模板引擎artTemplate

前后端交互-模板引擎artTemplate

作者: 小边_leo | 来源:发表于2022-07-06 13:20 被阅读0次

    一. 模板引擎的基础概念

    文档:http://aui.github.io/art-template/zh-cn/
    Github: https://github.com/aui/art-template

    1 - 模板引擎 (art-template)

    模板引擎是腾讯公司开发的第三方模块,让开发者以更加友好的方式拼接字符串,使项目代码更加清晰、更加易于维护。

    // 未使用模板引擎的写法
    var ary = [{ name: '张三', age: 20 }];
    var str = '<ul>';
    for (var i = 0; i < ary.length; i++) {
       str += '<li>\
           <span>'+ ary[i].name +'</span>\
           <span>'+ ary[i].age +'</span>\
       </li>';
    }
    str += '</ul>';
    
    
    <!-- 使用模板引擎的写法 -->
    <ul>
       {{each ary}}
           <li>{{$value.name}}</li>
           <li>{{$value.age}}</li>
       {{/each}}
    </ul>
    
    

    2 - 模板引擎的基本使用

    1. 在命令行工具中使用 npm install art-template 命令进行下载
    2. 使用const template = require('art-template')引入模板引擎
    3. 告诉模板引擎要拼接的数据和模板在哪 const html = template(‘模板路径’, 数据);
    4. 使用模板语法告诉模板引擎,模板与数据应该如何进行拼接

    注意:模板路径推荐使用绝对路径,更安全,可以使用 __dirname 拼接

    代码示例:

    index.art 模板文件代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
        {{ name }}
        {{ age }}
    </body>
    </html>
    
    

    app.js 代码:

    // 导入模板引擎
    const template = require('art-template');
    const path = require('path');
    
    const views = path.join(__dirname, 'views', 'index.art');
    
    // template方法是用来拼接字符串的
    // 1\. 模板路径 绝对路径
    // 2\. 要在模板中显示的数据 对象类型
    // 返回拼接好的字符串
    const html = template(views, {
        name: '张三',
        age: 20
    })
    
    console.log(html);
    // 服务端返回拼接好的字符串给客户端
    res.end(html);
    
    

    使用 node app.js 命令执行上面代码,打印如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
        张三
        20
    </body>
    </html>
    
    

    可以发现,template方法把拼接好的字符串返回了。

    二. 模板引擎的语法

    1 - 标准语法和原始语法

    art-template同时支持两种模板语法:标准语法和原始语法。
    标准语法可以让模板更容易读写,原始语法具有强大的逻辑处理能力。

    标准语法: {{ 数据 }}
    原始语法:<%= 数据  %>
    
    

    2 - 输出

    将某项数据输出在模板中,标准语法和原始语法如下:

    <!-- 标准语法 -->
    <h2>{{value}}</h2>
    <h2>{{a ? b : c}}</h2>
    <h2>{{a + b}}</h2>
    
    <!-- 原始语法 -->
    <h2><%= value %></h2>
    <h2><%= a ? b : c %></h2>
    <h2><%= a + b %></h2>
    
    

    3 - 原文输出

    如果数据中携带HTML标签,默认模板引擎不会解析标签,会将其转义后输出,如果想要解析,可以使用如下语法。

    标准语法:{{@ 数据 }}l
    原始语法:<%- 数据 %>
    
    

    比如在 js 文件中我们这样定义:

    const html = template(views, {
        name: '张三',
        age: 20,
        content: '<h1>我是标题</h1>'
    })
    
    

    在.art文件中,想要解析就要如下这样写:

    <!-- 标准语法 -->
    <h2>{{@ content }}</h2>
    <!-- 原始语法 -->
    <h2><%- content %></h2>
    
    

    最后打印结果为:

    <h2> <h1>我是标题</h1> </h2>
    
    

    4 - 条件判断

    在模板中可以根据条件来决定显示哪块HTML代码,如果条件成立则会显...之内的数据。

    <!-- 标准语法 -->
    {{if 条件}} ... {{/if}}
    {{if v1}} ... {{else if v2}} ... {{/if}}
    <!-- 原始语法 -->
    <% if (value) { %> ... <% } %>
    <% if (v1) { %> ... <% } else if (v2) { %> ... <% } %>
    
    

    注意:一个 <% 和一个 %> 是一对,他们总是成对出现的。

    示例代码如下:

    .art文件代码如下:

    {{if age > 18}}
        年龄大于18
    {{else if age < 15 }}
        年龄小于15
    {{else}}
        年龄不符合要求
    {{/if}}
    
    <% if (age > 18) { %>
        年龄大于18
    <% } else if (age < 15) { %>
        年龄小于15
    <% } else { %>
        年龄不符合要求
    <% } %>
    
    

    5 - 循环

    标准语法:{{each 数据}} {{/each}}
    原始语法:<% for() { %> <% } %>
    
    
    <!-- 标准语法 -->
    {{each target}}
        {{$index}} {{$value}}
    {{/each}}
     <!-- 原始语法 -->
    <% for(var i = 0; i < target.length; i++){ %>
        <%= i %> <%= target[i] %>
    <% } %>
    
    

    示例代码如下:

    .art文件代码:

    <!-- 标准语法 -->
    <ul>
        {{each users}}
            <li>
                {{$value.name}}
                {{$value.age}}
                {{$value.sex}}
            </li>
        {{/each}}
    </ul>
    
    <!-- 原始语法 -->
    <ul>
        <% for (var i = 0; i < users.length; i++) { %>
            <li>
                <%=users[i].name %>
                <%=users[i].age %>
                <%=users[i].sex %>
            </li>
        <% } %>
    </ul>
    
    

    .js文件代码:

    const template = require('art-template');
    const path = require('path');
    
    const views = path.join(__dirname, 'views', '03.art');
    
    const html = template(views, {
        users: [{
            name: '张三',
            age: 20,
            sex: '男'
        },{
            name: '李四',
            age: 30,
            sex: '男'
        },{
            name: '玛丽',
            age: 15,
            sex: '女'
        }]
    });
    
    console.log(html);
    
    

    执行js文件,打印如下:

    <ul>
            <li>
                张三
                20
                男
            </li>
    
            <li>
                李四
                30
                男
            </li>
    
            <li>
                玛丽
                15
                女
            </li>
    </ul>
    
    

    6 - 子模版

    使用子模板可以将网站公共区块(头部、底部)抽离到单独的文件中。

    标准语法:{{include '模板'}}
    原始语法:<%include('模板') %>
    
    
    <!-- 标准语法 -->
    {{include './header.art'}}
    <!-- 原始语法 -->
    <% include('./header.art') %>
    
    

    7 - 模板继承

    使用模板继承可以将网站HTML骨架抽离到单独的文件中,其他页面模板可以继承骨架文件。

    image

    比如,首页页面模板,可以继承HTML骨架模板,然后再包含子模板,页面自己的一些东西就可以通过下面的坑来填充,如下:

    image

    8 - 模板继承示例

    HTML骨架模板layout.art文件:

    <!doctype html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>HTML骨架模板</title>
            {{block 'head'}}{{/block}}
        </head>
        <body>
            {{block 'content'}}{{/block}}
        </body>
    </html>
    
    

    index.art 首页模板:

    <!--index.art 首页模板-->
    {{extend './layout.art'}} <!-- extend是继承layout.art模板的意思 -->
    {{block 'head'}} <link rel="stylesheet" href="custom.css"> {{/block}} <!-- 填充head坑位 -->
    {{block 'content'}} <p>This is just an awesome page.</p> {{/block}} <!-- 填充content坑位 -->
    
    

    9 - 模板配置 & 导入变量

    // 向模板中导入变量
    template.defaults.imports.变量名 = 变量值;
    // 设置模板根目录
    template.defaults.root = 模板目录
    // 设置模板默认后缀
    template.defaults.extname = '.art'
    
    

    如果我们想要在模板中使用dateformat方法,首先使用npm install dateformat下载第三方模块,其他详细代码如下:

    .js文件代码:

    const template = require('art-template');
    const path = require('path');
    // 引入dateformat模块
    const dateFormat = require('dateformat');
    
    // 设置模板的根目录
    // 设置之后,在下面就可以直接写模板的名字了,就不用写绝对路径了,比如:template('06.art', {})
    template.defaults.root = path.join(__dirname, 'views');
    
    // 导入模板变量
    // 导入之后在.art文件中就可以使用dateFormat方法了
    template.defaults.imports.dateFormat = dateFormat;
    
    // 配置模板的默认后缀
    // 配置之后就可以直接写名字了,不用写后缀了,比如:template('06', {})
    template.defaults.extname = '.art';
    
    const html = template('06', {
        time: new Date()
    });
    
    console.log(html);
    
    

    .art文件代码:

    // 导入之后在.art文件中就可以使用dateFormat方法了
    {{ dateFormat(time, 'yyyy-mm-dd')}}
    
    

    三. 案例:学生档案管理

    1 - 案例介绍

    目标:模板引擎应用,强化 node.js 项目制作流程。
    知识点:http请求响应、数据库、模板引擎、静态资源访问。

    image

    2 - 制作流程

    1. 建立项目文件夹并生成项目描述文件(使用npm init -y生成package.json文件)
    2. 创建网站服务器实现客户端和服务器端通信
    3. 连接数据库并根据需求设计学员信息表
    4. 创建路由并实现页面模板呈递
    5. 实现静态资源访问
    6. 实现学生信息添加功能
    7. 实现学生信息展示功能

    3 - 第三方模块 router

    功能:实现路由

    使用步骤:

    1. 使用npm install router下载第三方模块 router
    2. 获取路由对象
    3. 调用路由对象提供的方法创建路由
    4. 启用路由,使路由生效
    // 创建路由
    const getRouter = require('router')
    const router = getRouter();
    router.get('/add', (req, res) => {
        res.end('Hello World!')
    })
    
    server.on('request', (req, res) => {
        // 启用路由功能 outer方法有三个参数,第三个参数是回调函数,请求完成之后会调用这个回调函数
        router(req, res, () => {})
    })
    
    

    4 - 第三方模块 serve-static

    功能:实现静态资源访问服务,比如访问html里面链接的css文件

    使用步骤:

    1. 使用npm install serve-static下载第三方模块 serve-static
    2. 引入serve-static模块获取创建静态资源服务功能的方法
    3. 调用方法创建静态资源服务并指定静态资源服务目录
    4. 启用静态资源服务功能
    const serveStatic = require('serve-static')
    // public就是静态资源的目录
    const serve = serveStatic('public')
    server.on('request', () => {
        // 启用静态资源访问服务功能
            serve(req, res, () => {})
    })
    server.listen(3000)
    
    

    5 - 添加学生信息功能步骤分析

    1. 在模板的表单中指定请求地址与请求方式
    2. 为每一个表单项添加name属性,方便后端接收请求参数
    3. 添加实现学生信息功能路由
    4. 接收客户端传递过来的学生信息
    5. 将学生信息添加到数据库中
    6. 将页面重定向到学生信息列表页面

    6 - 学生信息列表页面分析

    1. 从数据库中将所有的学生信息查询出来
    2. 通过模板引擎将学生信息和HTML模板进行拼接
    3. 将拼接好的HTML模板响应给客户端

    代码地址:https://github.com/iamkata/art-template_case

    项目目录如下:

    image

    其中:

    1. app.js是项目的入口文件
    2. model里面是各种模块,connect.js是数据库连接模块,user.js是创建集合模块
    3. public里面是各种静态资源,比如css文件
    4. route里面是路由模块
    5. views里面是模板引擎文件

    作者:Imkata
    链接:https://www.jianshu.com/p/4e316a0811bd
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    相关文章

      网友评论

          本文标题:前后端交互-模板引擎artTemplate

          本文链接:https://www.haomeiwen.com/subject/xptebrtx.html