11.模板引擎来实现类似Apache的www目录页

实现Apache的www目录页

  • 要实现Apachewww目录页,我们首先要读取到目录页文件的名称,然后在利用模板引擎替换掉,最后将替换好的页面渲染到浏览器中

1. 第一个问题出现了,如何获取文件夹里面的目录,即文件名

readdir了解下 (●ˇ∀ˇ●)

  • 作用: 读取文件的目录;
  • 语法: fs.readdir('要读取的文件的路径',function(error, files) {...}),其中回调函数中的error还是错误对象,files是一个数组,里面存放着文件夹的目录信息,即文件名。
  • 注意: readdir(...)都是小写的字母

例:

  • 首先,创建一个readdir.js文件
**readdir.js**

const fs = require('fs');
fs.readdir('E:/day day up/14Nodejs教程精讲(7天+5天赠送)/www', function(error, files) {
    if(error) {
        return console.log('404 not found')
    }
    console.log(files);
})
  • 然后在命令行中运行readdir.js文件
PS E:\good good study\NodeJs> node .\readdir.js
[ 'index.html', 'timg.jpg' ]
  • 这是www目录中的文件
image.png

2.第二个问题,模板引擎是什么?

模板引擎有很多,这里我们用的是art-template

  • 模板引擎在浏览器端的应用
    例:
<!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>
    <script src="./art-template.js"></script>
</head>
<body>
    <div id="content"></div>
    <script id="test" type="text/html">
        <div>
            {{if mark == 0}}
            <h1>刘备</h1>
            {{else if mark == 1}}
            <h1>关羽</h1>
            {{else}}
            <h1>张飞</h1>
            {{/if}}
        </div>
    </script>
    <script>
       var data = {
           'mark':3
       };
       var html = template('test', data);
       document.getElementById('content').innerHTML = html;
    </script>
</body>
</html>

总结:在浏览器应用模板引擎,首先引入art-template.js,然后定义一个模板用<script>包裹,type可以随便写,只要不是type=text/javascript就行,防止被当成js来解析,然后定义一个<script>标签,这里面写的是js

  • 模板引擎在服务端的应用

1. 首先,const template = require(art-template) , 这是一个第三方包,所以使用之前要先安装一下,npm install art-template,这里就默认装好了,直接引入了
然后,var htmlStr = template.render('渲染模板',{渲染的数据}),这样就可以得到渲染之后的字符串了

例:

  • 首先,创建一个template-demo.js文件
**template-demo.js**

const template = require('art-template');
let res = template.render('hello {{name}}', {
    name: 'jason'
})
console.log(res);
  • 然后,在命令行窗口运行这个文件
PS E:\good good study\NodeJs> node .\template-demo.js
hello jason

2. 如果传入的模板比较多,可以定义一个变量来保存字符串模板

例:

  • 首先,将template-demo.js文件修改一下
**template-demo.js**

const template = require('art-template');
var htmlStr = `
<p>我的名字是 {{name}}</p>
<p>我的年龄是 {{age}}</p>
<p>我的爱好是 {{each hobbies}} {{ $value }} {{/each}}</p>
`
let res = template.render(htmlStr, {
    name: 'jason',
    age:18,
    hobbies: ['睡觉', '吃饭', '打豆豆']
})
console.log(res);
  • 然后,在命令行运行template-demo.js文件
PS E:\good good study\NodeJs> node .\template-demo.js

<p>我的名字是 jason</p>
<p>我的年龄是 18</p>
<p>我的爱好是  睡觉  吃饭  打豆豆 </p>

3. 继续,我们总不能每次都粘贴一大堆字符串吧,这时联系之前学习的读文件操作,就好做了,我们可以将模板定义为一个html文件,然后读取这个文件,就可以拿到字符串模板,这样就可以渲染了 <( ̄︶ ̄)↗[GO!]

  • 首先,创建一个template.html以及修改之后的template-demo.js
**template.html**

<!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>
</head>
<body>
    <p>我的名字是 {{name}}</p>
    <p>我的年龄是 {{age}}</p>
    <p>我的爱好是 {{each hobbies}} {{ $value }} {{/each}}</p>
</body>
</html>
**template-demo.js**

const template = require('art-template');
const fs = require('fs');
fs.readFile('./template.html', function(error, data) {
    if(error) {
        return console.log('not found')
    }
    let res = template.render(data.toString(), {
        name: 'jason',
        age:18,
        hobbies: ['睡觉', '吃饭', '打豆豆']
    })
    console.log(res);
})
  • 然后,在命令行运行template-demo.js文件
PS E:\good good study\NodeJs> node .\template-demo.js
<!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>
</head>
<body>
    <p>我的名字是 jason</p>
    <p>我的年龄是 18</p>
    <p>我的爱好是  睡觉  吃饭  打豆豆 </p>
</body>
</html>

4. 服务端模板引擎的应用

例:

  • 首先,改写template-demo.js文件,template.html文件不变
**template.html**

<!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>
</head>
<body>
    <p>我的名字是 {{name}}</p>
    <p>我的年龄是 {{age}}</p>
    <p>我的爱好是 {{each hobbies}} {{ $value }} {{/each}}</p>
</body>
</html>
**template-demo.js**

const http = require('http');
const fs = require('fs');
const template = require('art-template');
let server = http.createServer();
server.on('request', function(request, response) {
   var url = request.url;
   fs.readFile('./template.html', function(error, data) {
       if(error) {
           return response.end('404 not found');
       }
       var htmlStr = template.render(data.toString(), {
           name: 'jason',
           age: 18,
           hobbies: ['吃饭', '睡觉', '打豆豆']
       })
       response.end(htmlStr);
   })
})
server.listen(8080, function() {
    console.log('Server is running...')
})
  • 然后,在命令行运行template-demo.js文件
PS E:\good good study\NodeJs> node .\template-demo.js
Server is running...
-
  • 接着,在浏览器输入localhost:8080
image.png

总结: 这就是服务端模板引擎的使用,将模板定义在一个新的文件,把他理解为字符串,然后通过fs读取这个文件,然后将读取到的数据当作模板,利用模板引擎渲染,最后将渲染之后的字符串返回。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,486评论 1 45
  • 33、JS中的本地存储 把一些信息存储在当前浏览器指定域下的某一个地方(存储到物理硬盘中)1、不能跨浏览器传输:在...
    萌妹撒阅读 2,083评论 0 2
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,197评论 0 3
  • Beetl2.7.16中文文档 Beetl作者:李家智 <xiandafu@126.com> 1. 什么是Beet...
    西漠阅读 2,681评论 0 0
  • 等待中,时光是慢下来的 雪纷纷的慢,雨霏霏的慢 让时间的点滴医冶愁肠百结的慢 少小离家 双鬓从立春到霜降的慢 一页...
    万象更新_f742阅读 278评论 2 5