Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 视图Nunjucks

iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 视图Nunjucks

作者头像
iKcamp
发布于 2018-03-30 04:42:19
发布于 2018-03-30 04:42:19
98500
代码可运行
举报
文章被收录于专栏:iKcampiKcamp
运行总次数:0
代码可运行

视频地址:https://www.cctalk.com/v/15114923888328

视图 Nunjucks

彩虹是上帝和人类立的约,上帝不会再用洪水灭人。

客户端和服务端之间相互通信,传递的数据最终都会展示在视图中,这时候就需要用到『模板引擎』。

什么是模板引擎?

模板引擎是为了使用户界面与业务数据分离而产生的,可以生成特定格式的文档。例如,用于网站的模板引擎会生成一个标准的 HTML 文档。

市面上常见的模板引擎很多,例如:SmartyJadeEjsNunjucks 等,可以根据个人喜好进行选择。koa-viewskoa-nunjucks-2 等支持 Koa 的第三方中间件也可以自行选择。

本项目中,我们使用 koa-nunjucks-2 作为模板引擎。NunjucksMozilla 开发的,纯 js 编写的模板引擎,既可以用在 Node 环境下,也可以运行在浏览器端。koa-nunjucks-2 是基于 Nunjucks 封装出来的第三方中间件,完美支持 Koa2

Nunjucks 介绍

首先我们需要了解 Nunjucks 的几个特性

简单语法

变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  {{ username }}

  {{ foo.bar }}
  {{ foo["bar"] }}

如果变量的值为 undefinednull ,将不予显示。

过滤器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  {{ foo | title }}
  {{ foo | join(",") }}
  {{ foo | replace("foo", "bar") | capitalize }}

if 判断

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  {% if variable %}
    It is true
  {% endif %}

  {% if hungry %}
    I am hungry
  {% elif tired %}
    I am tired
  {% else %}
    I am good!
  {% endif %}

for 循环

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  var items = [{ title: "foo", id: 1 }, { title: "bar", id: 2}]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <h1>Posts</h1>
  <ul>
  {% for item in items %}
    <li>{{ item.title }}</li>
  {% else %}
    <li>This would display if the 'item' collection were empty</li>
  {% endfor %}
  </ul>

macro

宏:定义可复用的内容,类似于编程语言中的函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  {% macro field(name, value='', type='text') %}
  <div class="field">
    <input type="{{ type }}" name="{{ name }}"
          value="{{ value | escape }}" />
  </div>
  {% endmacro %}

接下来就可以把 field 当作函数一样使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  {{ field('user') }}
  {{ field('pass', type='password') }}

更多语法内容请查阅官方文档

继承功能

网页常见的结构大多是头部、中间体加尾部,同一个网站下的多个网页,头部和尾部内容通常来说基本一致。于是我们可以采用继承功能来进行编写。

先定义一个 layout.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <html>
    <head>
      {% block head %}
      <link rel="stylesheet">
      {% endblock %}
    </head>  
    <body>
      {% block header %}
      <h1>this is header</h1>
      {% endblock %}

      {% block body %}
      <h1>this is body</h1>
      {% endblock %}

      {% block footer %}
      <h1>this is footer</h1>  
      {% endblock %}

      {% block content %}
      <script>
        //this is place for javascript
      </script>
      {% endblock %}
    </body>
  </html>

layout 定义了五个模块,分别命名为:headheaderbodyfootercontentheaderfooter 是公用的,因此基本不动。业务代码的修改只需要在 body 内容体中进行、业务样式表和业务脚本分别在头部 head 和底部 content 中引入。

接下来我们再定义一个业务级别的视图页面:home.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  {% extends 'layout.html' %}

  {% block head %}
  <link href="home.css">
  {% endblock %}

  {% block body %}
  <h1>home 页面内容</h1>
  {% endblock %}

  {% block content %}
  <script src="home.js"></script>
  {% endblock%}

最终的 home.html 输出后如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <html>
    <head>
      <link href="home.css">
    </head>  
    <body>
      <h1>this is header</h1>

      <h1>home 页面内容</h1>

      <h1>this is footer</h1>  

      <script src="home.js"></script>
    </body>
  </html>

安全性

请对特殊字符进行转义,防止 Xss 攻击。若在页面上写入 Hello World<script>alert(0)</script> 这类字符串变量,并且不进行转义,页面渲染时该脚本就会自动执行,弹出提示框。  

安装并运行

安装 koa-nunjucks-2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm i koa-nunjucks-2 -S

修改 app.js,引入中间件,并指定存放视图文件的目录 views

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  const Koa = require('koa')
  const path = require('path')
  const bodyParser = require('koa-bodyparser')
  const nunjucks = require('koa-nunjucks-2')

  const app = new Koa()
  const router = require('./router')

  app.use(nunjucks({
    ext: 'html',
    path: path.join(__dirname, 'views'),// 指定视图目录
    nunjucksConfig: {
      trimBlocks: true // 开启转义 防Xss
    }
  }));

  app.use(bodyParser())
  router(app)
  app.listen(3000, () => {
    console.log('server is running at http://localhost:3000')
  })

在之前的项目中,视图被写在了 controller/home 里面,现在我们把它迁移到 views 中:

新建 views/home/login.html:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <!DOCTYPE html>
  <html lang="en">

  <head>
    <title></title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>

  <body>
    <form action="/user/register" method="post">
      <input name="name" type="text" placeholder="请输入用户名:ikcamp" />
      <br/>
      <input name="password" type="text" placeholder="请输入密码:123456" />
      <br/>
      <button>{{btnName}}</button>
    </form>
  </body>

  </html>

重写 controller/home 中的 login 方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  login: async(ctx, next) => {
    await ctx.render('home/login',{
      btnName: 'GoGoGo'
    })
  },

注意: 这里我们使用了 await 来异步读取文件。因为需要等待,所以必须保证读取文件之后再进行请求的响应。

增加了 views 层之后,视图功能还不算完善,我们还需要增加静态资源目录。当然,如果能直接使用静态服务器的话更好。下一节中,我们将讲述下如何增加静态文件及美化项目视图。

推荐: 翻译项目Master的自述:

1. 干货|人人都是翻译项目的Master

2. iKcamp出品微信小程序教学共5章16小节汇总(含视频)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-01-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 处理静态资源
视频地址:https://www.cctalk.com/v/15114923882788 处理静态资源 无非花开花落,静静。 指定静态资源目录 这里我们使用第三方中间件: koa-static 安装并使用 安装 koa-static: npm i koa-static -S 修改 app.js,增加并指定 /public 目录为静态资源目录。 const Koa = require('koa') const path = require('path') const bodyParser = r
iKcamp
2018/03/30
1.2K0
iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 处理静态资源
iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 错误处理
沪江CCtalk视频地址:https://www.cctalk.com/v/15114923887518 处理错误请求 爱能遮掩一切过错。 当我们在访问一个站点的时候,如果访问的地址不存在(404)
iKcamp
2018/03/30
1.8K0
iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 错误处理
iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 解析JSON
视频地址:https://www.cctalk.com/v/15114923886141 JSON 数据 我颠倒了整个世界,只为摆正你的倒影。 前面的文章中,我们已经完成了项目中常见的问题,比如 路由请求、结构分层、视图渲染、静态资源等。 那么,JSON 呢?JSON 格式数据的传输,已经深入到了我们的码里行间,脱离了 JSON 的人想必是痛苦的。那么,复合吧! 如何设置 JSON 格式 伟大的武术家——李小龙先生——说过这样一段话: Empty your mind, Be formless,shape
iKcamp
2018/03/30
1.3K0
iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 规范与部署
沪江CCtalk视频地址:https://www.cctalk.com/v/15114923889450 规范与部署 懒人推动社会进步。 本篇中,我们会讲述三个知识点 定制书写规范 开发环境运行 如何部署运行 定制书写规范 文中所说的书写规范,仅供参考,非项目必需。 随着 Node 流行,JavaScript 编码规范已经相当成熟,社区也产生了各种各样的编码规范。但是在这里,我们要做的不是『限制空格的数量』,也不是『要不要加分号』。我们想要说的规范,是项目结构的规范。 目前我们的项目结构如下: ├─ c
iKcamp
2018/03/30
1.5K0
Web前端学习 第5章 node基础教程7 模板引擎概述
上一节我们通过Koa创建了一个web服务器,并可以根据用户请求路径的不同响应不同的页面,但是每一个页面的内容都是通过字符串的方式给送给浏览器的,这样的开发方式并不友好,我们更希望直接发送html页面。
学习猿地
2020/06/19
5800
Web前端学习 第5章 node基础教程7 模板引擎概述
node服务端渲染(完整demo)
项目源码 git clone https://gitee.com/wjj0720/nod...
random_wang
2019/09/11
2.2K0
Node.js学习笔记(三)——Node.js开发Web后台服务
Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。 使用 Express 可以快速地搭建一个完整功能的网站。使用Node.js作为AngularJS开发Web服务器的最佳方式是使用Express模块。
张果
2022/09/28
8.2K0
Node.js学习笔记(三)——Node.js开发Web后台服务
iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 代码分层
视频地址:https://www.cctalk.com/v/15114923889408 文章 在前面几节中,我们已经实现了项目中的几个常见操作:启动服务器、路由中间件、Get 和 Post 形式的请求处理等。现在你已经迈出了走向成功的第一步。 目前,整个示例中所有的代码都写在 app.js 中。然而在业务代码持续增大,场景更加复杂的情况下,这种做法无论是对后期维护还是对患有强迫症的同学来说都不是好事。所以我们现在要做的就是:『分梨』。 分离 router 路由部分的代码可以分离成一个独立的文件,并根据个人
iKcamp
2018/03/30
7500
【完结汇总】iKcamp出品基于Koa2搭建Node.js实战共十一堂课(含视频)
??  与众不同的学习方式,为你打开新的编程视角 独特的『同步学习』方式 文案讲解+视频演示,文字可激发深层的思考、视频可还原实战操作过程。 云集一线大厂有真正实力的程序员 iKcamp 团队
iKcamp
2018/03/30
7850
【完结汇总】iKcamp出品基于Koa2搭建Node.js实战共十一堂课(含视频)
iKcamp|基于Koa2搭建Node.js实战(含视频)☞ HTTP请求
POST/GET请求——常见请求方式处理 ?? iKcamp 制作团队 原创作者:大哼、阿干、三三、小虎、胖子、小哈、DDU、可木、晃晃 文案校对:李益、大力萌、Au、DDU、小溪里、小哈 风采主
iKcamp
2018/03/30
9430
iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 记录日志
沪江CCtalk视频地址:https://www.cctalk.com/v/15114923883523 log 日志中间件 最困难的事情就是认识自己。 在一个真实的项目中,开发只是整个投入的一小部分,版本迭代和后期维护占了极其重要的部分。项目上线运转起来之后,我们如何知道项目运转的状态呢?如何发现线上存在的问题,如何及时进行补救呢?记录日志就是解决困扰的关键方案。正如我们每天写日记一样,不仅能够记录项目每天都做了什么,便于日后回顾,也可以将做错的事情记录下来,进行自我反省。完善的日志记录不仅能够还原问题
iKcamp
2018/03/30
2K0
iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 记录日志
Koa2进阶:CMS系统实战开发秘籍:1.为什么选择Koa2?
本次的专栏是基于koa2作为服务端开发语言,由此我们简单介绍下koa2的相关内容。了解下什么是koa2。以及它的优势是什么。
微芒不朽
2024/07/30
1380
Koa2进阶:CMS系统实战开发秘籍:1.为什么选择Koa2?
简单而强大的swig.js
该文介绍了如何使用swig.js库实现JavaScript模板引擎的基本功能,包括变量、标签、继承和块等。同时,文章还介绍了如何利用该库进行模板继承,以及如何在FIS3构建中使用该库。
IMWeb前端团队
2018/01/08
1.5K0
用JS实现一个模板引擎
开始手写之前,我们先看看模板引擎应该是什么样的,在用koa开发后台服务的时候,我们用过ejs模板引擎,其作用是把模板渲染成html代码。下面是一个具体的使用例子。
luciozhang
2023/04/22
1.7K0
关于koa2,你不知道的事
koa 是一个基于 node 实现的一个新的 web 框架,它是由 express 框架的原班人马打造。特点是优雅、简洁、表达力强、自由度高。和 express 相比,它是一个更轻量的 node 框架,因为它所有的功能都通过插件来实现,这种插拔式的架构设计模式,很符合 unix 哲学。
lucifer210
2020/04/14
7500
关于koa2,你不知道的事
Python Django个人网站搭建5-编写文章详情页面并支持markdown语法
作者: zifanwang  发布于2020-05-09
zifan
2021/12/14
4780
Python Django个人网站搭建5-编写文章详情页面并支持markdown语法
Koa基于NodeJS的WEB框架
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。
码客说
2021/04/13
2.2K0
Koa基于NodeJS的WEB框架
Express使用手记:核心入门
IMWeb前端团队
2018/01/08
1.4K0
Express使用手记:核心入门
Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
前言   前面一有写到一篇Node.js+Express构建网站简单示例https://cloud.tencent.com/developer/article/1020656   这篇还是用以前的例子, 用Node.js+Koa2构建   Koa:   https://github.com/koajs/koa http://koa.bootcss.com  (中文)   Koa就不多介绍了,前面也写过Express,同一个团队打造,前面也过express文章,对比着看,自然可以看出些优点! 搭
Porschev
2018/01/16
4.4K0
Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
基于Koa2搭建Node.js实战(含视频)☞ 路由koa-router
iKcamp
2018/01/04
2.2K0
基于Koa2搭建Node.js实战(含视频)☞ 路由koa-router
推荐阅读
相关推荐
iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 处理静态资源
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验