art-template模板引擎

671 阅读3分钟

1. nodejs中使用

1.1 安装 art-template

 npm install art-template --save

1.2 在需要使用的文件模块中加载 art-template

var template = require('art-template')

1.3 使用

/**
 * app.js  在nodejs中使用art-template
 */var fs = require('fs')
// 引入第三方模块 art-template
var template = require('art-template') 
​
// 读取index.html 模板文件
fs.readFile('./index.html', function(err, data) {
    /**
     * data默认读取到的是 二进制数据,而模板引擎的 render 方法需要接收的是字符串,所以在这里需要把 data 二进制数据转为 字符串
     */
    if (err) {
        return console.log('读取文件失败了')
    }
    // 模板引擎的 render 方法需要接收的是字符串
    var ret = template.render(data.toString(), {
        name: '李思雨',
        age: 18,
        province: '北京市',
        hobbies: [
            '写代码',
            '唱歌',
            '打游戏'
        ],
        title: '个人信息'
    })
    console.log(ret)
})

index.html 模板文件

<!DOCTYPE html>
<html lang="en"><head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>在nodejs中使用art-template</title>
</head><body>
    <h1>这是我的 {{title}}</h1>
    <h3>大家好,我的名字是 {{name}}</h3>
    <h3>我今年 {{age}} 岁了</h3>
    <h3>我现在在{{province}}上学呢</h3>
    <h3>我最喜欢: {{each hobbies}} {{$value}} {{/each}}
    </h3>
</body></html>

1.4 执行

node app.js

2. 在浏览器中使用

template-web.js : 引入第三方文件(或者从node_module中引入 node_module/art-template/lib/art-template

模板引擎不关心你的字符串内容,只关心自己能认识的模板标记语法,例如 {{}} 。在

<!DOCTYPE html>
<html lang="en"><head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>在浏览器中使用art-template</title>
</head><body>
​
    <!-- 1.  引入art-template.js -->
    <script src="./template-web.js"></script>
​
    <!-- 2. 定义模板 -->
    <script id="tpl-user" type="text/html">
        <p>大家好,我叫:{{ name }}</p>
        <p>我今年 {{ age }} 岁了</p>
        <h1>我来自 {{ province }}</h1>
        <p>我的爱好是:{{each hobbies}} {{ $value }} {{/each}}</p>
    </script>
​
    <!-- 3. 定义源数据 -->
    <script type="text/javascript">
        var user = template('tpl-user', {
            name: '李思雨',
            age: 20,
            province: '北京市',
            hobbies: [
                '写代码',
                '唱歌',
                '打游戏'
            ]
        })
        console.log(user)
    </script>
</body></html>                                         

3. nodejs结合express使用express-art-template(重点)

3.1 下载安装包

npm install --save express
npm install --save art-template
npm install --save express-art-template

3.2 引入并创建http服务器

var path = require('path')
var express = require('express')
var app = express()

3.3 指定.html使用的解析引擎(官方给出的是art)

app.engine('html', require('express-art-template'))

3.4 使用模板传值

// 请求与响应
app.get('/', function(req, res) {
    // 使用模板传值
    res.render('index.html', {
        name: '李思雨',
        age: 18,
        province: '北京市',
        hobbies: [
            '写代码',
            '唱歌',
            '打游戏'
        ],
        title: '个人信息'
    });
});
​

3.5 案例展示

/www/index.html 模板文件

<!DOCTYPE html>
<html lang="en"><head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>在nodejs中结合express使用art-template</title>
</head><body>
    <h1>这是我的 {{title}}</h1>
    <h3>大家好,我的名字是 {{name}}</h3>
    <h3>我今年 {{age}} 岁了</h3>
    <h3>我现在在{{province}}上学呢</h3>
    <h3>我最喜欢: {{each hobbies}} {{$value}} {{/each}}
    </h3>
</body></html>

app.js

var path = require('path')
var express = require('express')
​
// 创建web服务器
var app = express()
​
// 指定.html使用的解析引擎(官方给出的是art),表示当渲染以 .html 结尾的文件的时候,使用 art-template 模板引擎
app.engine('html', require('express-art-template'))
​
// express-art-template 默认的渲染的目录是 views下面的,如果需要修,则设置如下:
app.set('views', path.join(__dirname, 'www')); // www目录是放置模板html的位置// 4. 统一处理网站静态资源,你就可以直接通过 /public/xx 的方式访问 public 目录中的所有资源了
//    当以 /public/ 开头的时候,去 ./public/ 目录中找找对应的资源
app.use('/public/', express.static('./public/'))
​
// 请求与响应
app.get('/', function(req, res) {
    // 使用模板传值
    res.render('index.html', {
        name: '李思雨',
        age: 18,
        province: '北京市',
        hobbies: [
            '写代码',
            '唱歌',
            '打游戏'
        ],
        title: '个人信息'
    });
});
app.listen(3000, function() {
    console.log('server is running ......')
})
​

3.6 解析

3.6.1 加载解析模板引擎art-template,需要配合 render使用

// Express 为 Response 相应对象提供了一个方法:render
// render 方法默认是不可以使用,但是如果配置了模板引擎就可以使用了
// res.render('html模板名', {模板数据})render("文件名",{模板数据})
​

注意:第一个参数不能写路径,一般会默认去项目中的views文件夹下去找模板文件,这是Express的约定

3.6.2 配置模板引擎的后缀名

app.engine('html', require('express-art-template'));

第一个参数表示将使用模板引擎文件的后缀名,默认是art,在我们的项目中,我们使用的是html

3.6.3 修改默认的模板文件目录

app.set('views', path.join(__dirname, 'www')); // www目录是放置模板html的位置
​
__dirname : 就是你执行项目 node app.js 的 所在目录
​

express-art-template 默认的渲染的目录是 views下面的,如果修改,则参考上面

4. art-template使用模板继承和子模板案例

4.1 项目初始化

npm init -y

4.2 安装项目包

# 安装express服务框架包
npm i express
​
# 安装art-template 和 express-art-template
npm i art-template express-art-template

4.3 项目其他文件

app.js

var express = require('express')
var path = require('path')
​
// 创建web服务器
var app = express()
​
// 开放网站统一静态资源
app.use('/public/', express.static(path.join(__dirname, './public')))
app.use('/node_modules/', express.static(path.join(__dirname, './node_modules')))
​
// 配置art-template模板引擎
app.engine('html', require('express-art-template'))
// express-art-template 默认的渲染的目录是 views
app.set('views', path.join(__dirname, './views'));
​
app.get('/', function(req, res) {
    res.render('index.html', {
        name: 'hello nodejs'
    })
})
​
app.listen(3000, function() {
    console.log('Server is runing at http://localhost:3000/')
})
​

views目录文件

header.html

<link rel="stylesheet" type="text/css" href="/public/css/header.css" />
<header class="section_header">
	<h1>公共头部</h1>
</header>

footer.html

<link rel="stylesheet" type="text/css" href="/public/css/footer.css" />
<footer class="section_footer">
	<h1>公共尾部</h1>
</footer>

index.html

<!-- 1.  继承模板 layout.html -->
{{extend './layout.html'}}

<!-- 2. 设置自定义模块title -->
{{block 'title'}}
<title>首页</title>
{{/block}}

<!-- 2. 设置自定义模块head -->
{{block 'head'}}
<link rel="stylesheet" type="text/css" href="/public/css/index.css" />
{{/block}}

<!-- 2. 设置自定义模块cont -->
{{block 'cont'}}
<h1 class="title">{{name}}</h1>
{{/block}}

layout.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        {{block 'title'}}
        <title>art-template模板继承和子模板</title>
        {{/block}}
        <link rel="stylesheet" type="text/css" href="/public/css/reset.css" />
        <link rel="stylesheet" type="text/css" href="/public/css/general.css" />
        {{block 'head'}}{{/block}}
    </head>
    <body>
        <!-- 引入公共头部---子模板 -->
        {{include './header.html'}}
        
        <article class="section_container">
            {{block 'cont'}}{{/block}}
        </article>
        
        <!-- 引入公共尾部---子模板 -->
        {{include './footer.html'}}
    </body>
</html>
​
​