koa --- nunjucks在Koa中的使用、中間件的配置

Nunjucks在Koa中的應用

  • app.js
const koa = require('koa');
const app = new koa();
const router = require('./router')
const nunjucks = require('koa-nunjuncks-2');
app.use(nunjucks({ext: 'html',  // 指定視圖文件默認后綴path: path.join(__dirname, 'views'),  // 指定視圖目錄nunjucksConfig:{trimBlocks: true   // 開啟轉義,防止XSS}
}))

注: 配置要在router前面

  • 使用 (ctx.render(path))
  • /controller/home.js
user: async (ctx, next) =>{await ctx.render('home/login',{btnName: 'GoGoGo'})
}

關鍵代碼

  • 使用&&掛載&&配置nunjucks
const nunjucks = require('koa-nunjucks-2');
app.use(nunjucks({ext: 'html',   // 默認的后綴名path: path.join(__dirname, 'views'),nunjucksConfig:{trimBlocks: true   // 開啟轉義,防止XSS}
}));
  • views的目錄結構如下
    在這里插入圖片描述
  • 例如使用 /views/home/login.html 模板進行渲染
async (ctx, next) =>{awaite ctx.render('home/login',{btnName: 'GoGoGo'})
}
  • /views/home/login.html
{% extends "common/layout-home.html" %}
{% block homeBanner %}
<div class="banner_box"><div class="banner_inner"><h2 class="slogan">匯聚天下英才</h2><p class="des">吃貨吃貨 Marron<br>好吃不貴,多吃不胖!!!</p><a href="/login" title="gogogo" class="btn" id="gogogo">進入戰場</a></div>
</div>
{% endblock %}
{% block content %}
<div class="hp-dialog"><div class="hp-box"><form action="/user/login" method="post"><h1>到達戰場</h1><p class="error">{{content}}</p><input type="text" name="name" placeholder="請輸入用戶名:marron"><input type="password" name="password" placeholder="請輸入密碼:123456"><button>GoGoGo</button></form></div>
</div>
<div class="hp-overlay"></div>
{% endblock %}

Nunjucks語法介紹

一般情況下,模板引擎都需要具備以下功能: 變量、邏輯表達式、循環、layout、include、宏和擴展等.

1.文件擴展名

Nunjucks支持用任意擴展名來命名模板文件,但Nunjucks社區還是推薦使用’.njk’為后綴進行命名

2.變量

變量會從模板文件運行時的上下文獲取,如果需要顯示一個變量,代碼如下:
{{username}}
模板文件運行時,會從上下文對象中查找username屬性,然后顯示。模板語法也支持像JavaScript一樣獲取變量的屬性(可使用點操作符或中括號操作符),代碼如下:

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

如果變量的值為undefined或null將不予顯示,引用的對象為undefined或null也是如此,

3.注釋

在Nunjucks模板語法中,可以使用語法{# 注釋內容 #}來編寫注釋,注釋不會被編譯,示例代碼如下:

{# Loop through all the users #}
{% for user in users %}...{% endfor %}

模板文件運行后只會渲染第2行的文本內容。

4.標簽

標簽是一些特殊的區塊,應用標簽可以對模板執行一些操作。Nunjucks包含一些內置的標簽,同時也支持自定義標簽。

  • if標簽
    if為分支語句,與JavaScript中的if語句類似,代碼如下:
{% if variable %}It is true
{% endif %}
如果variable已經被定義且為true,則會顯示"It is true",否則什么也不顯示。
注意: 這里并非布爾值,和JavaScript的處理是一樣的。
````javascript
{% if hungry %}I am hungry!
{% elif tired %}I am tired!
{% else %}I am good!
{% endif %}
  • for標簽
    for可以用來遍歷數組和對象。假設遍歷如下數組:
var items = [{ title: "foo", id: 1}, { title: "bar", id:2 }];

對應的模板代碼如下:

<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>
上面的示例通過for循環調用items數組中的每個元素,并將對應元素的title屬性顯示出來。如果items是空數組,則會渲染else語句中的內容。- macro()標簽
宏: 定義可復用的內容,類似于編程語言中的函數,示例代碼如下:
````javascript
{% macro field(name, value='', type='text') %}
<div class="field">
<input type="{{ type }}" name="{{ name }}" value="{{ value | escape }}" />
</div>
{% endmacro %}

接下來就可以把field當作函數一樣使用了,代碼如下:

{{ field('user') }}
{{ field('pass', type='password') }}
  • Extends/Block標簽
    Extends用來指定模板繼承,被指定的模板為父級模板。Block(區塊)定義了模板片段并標識一個名字,在模板繼承中使用。父級模板可指定一個區塊,子模板覆蓋這個區塊。Extends標簽和Block標簽相互搭配,在模板繼承場景中經常會被用到。在實戰項目中,經常需要設定一個固定的公用模板Layout,然后開發人員再創建一個業務級的模板文件,并把Layout繼承過來。公用模板文件layout.html的示例代碼如下:
<!DOCTYPE html>
<html>
<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">{% 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>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250493.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250493.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250493.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2018福大軟工實踐第六次作業

目錄 NABCD分析引用N(Need&#xff0c;需求)&#xff1a;A(Approach&#xff0c;做法)&#xff1a;B(Benefit&#xff0c;好處)&#xff1a;C(Competitors&#xff0c;競爭)&#xff1a;D(Delivery&#xff0c;交付)&#xff1a;初期中期個人貢獻分評定原則評定細則本組現場答辯…

day32—CSS多列布局學習

轉行學開發&#xff0c;代碼100天——2018-04-17 關于多列布局&#xff0c;前期已經梳理過&#xff0c;今天的培訓課程學習中再次提及&#xff0c;趁此也做個總結和檢驗。 多列布局的介紹參考&#xff1a; day08—css布局解決方案之多列布局關于多列布局的類型和方法&#xff1…

JDBC 事物處理

JDBC 事物處理 ?事務&#xff1a;指構成單個邏輯工作單元的操作集合 ?事務處理&#xff1a;保證所有事務都作為一個工作單元來執行&#xff0c;即使出現了故障&#xff0c;都不能改變這種執行方式。當在一個事務中執行多個操作時&#xff0c;要么所有的事務都被提交(commit…

centos6上安裝mysql8.0版本

本博客是采用yum源的方式安裝&#xff0c;非常的方便和快捷。(redhat 與centos7 等操作系統都可以采用此方法&#xff0c;步驟大體一致) mysql官網地址: https://dev.mysql.com 開始安裝&#xff1a; 1.清理環境&#xff0c;查看有沒有之前安裝過的mysql記錄&#xff0c;清理…

koa --- 使用koa-multer上傳文件+elementUI

核心代碼 const upload require(koa-multer) ({dest: ./public/images}); router.post(/upload, upload.single(file), ctx>{console.log(file, ctx.req.file);console.log(body, ctx.req.body);ctx.body 上傳成功; })目錄結構如下 基本思路 1.通過瀏覽器訪問url: http:…

[bzoj4003][JLOI2015]城池攻占_左偏樹

城池攻占 bzoj-4003 JLOI-2015 題目大意&#xff1a;一顆n個節點的有根數&#xff0c;m個有初始戰斗力的騎士都站在節點上。每一個節點有一個standard&#xff0c;如果這個騎士的戰斗力超過了這個門檻&#xff0c;他就會根據城池的獎勵增加自己的戰斗力。具體地&#xff1a;每一…

Java Web Servlet

Java Web Servlet Servlet是在服務器上運行的小程序。一個Servlet就是一個Java類&#xff0c;并且可以通過“請求-響應”編程模型來訪問的這個駐留在服務器內存里的Servlet程序。 Servlet可完成以下功能&#xff1a; 讀取客戶端&#xff08;瀏覽器&#xff09;發送的顯式的數…

第二篇 python基礎知識總結:數據、運算符

引子 我們跟任何人交流&#xff0c;說的每一句都是都一些文字組成&#xff0c;包含名詞、動詞、語句、標點符號等&#xff0c;組成我們說普通話構成的基本要素。同理我們學習python語言也要明白這些基本要素&#xff0c;也就是我們常說的基本語法&#xff0c;這是我們必須掌握的…

【BZOJ1797】[AHOI2009]最小割(網絡流)

【BZOJ1797】[AHOI2009]最小割&#xff08;網絡流&#xff09; 題面 BZOJ洛谷 題解 最小割的判定問題&#xff0c;這里就當做記結論吧。&#xff08;源自\(lun\)的課件&#xff09; 我們先跑一遍最小割&#xff0c;求出殘量網絡。然后把所有還有流量的邊拿出來跑\(Tarjan\)縮\(…

koa --- 使用Sequelize連接mysql

Sequelize介紹 為了快捷開發,社區出現了一系列的ORM(Object Relational Mapping)類庫ORM的字面意思為對象關系映射,它提供了概念性的、易于理解的模型化數據的方法。通過ORM,可以降低操作數據庫的成本。開發者不需要通過編寫SQL腳本來操作數據庫,直接通過訪問對象的方式來查詢…

Java Web Jsp

Java Web Jsp JSP全稱Java Server Pages&#xff0c;是一種動態網頁開發技術。它使用JSP標簽在HTML網頁中插入Java代碼。標簽通常以<%開頭以%>結束。 JSP是一種Java servlet&#xff0c;主要用于實現Java web應用程序的用戶界面部分。網頁開發者們通過結合HTML代碼、XHT…

Android gravity和layout_gravity的區別

一、gravity和layout_gravity相同處 兩者都是設置對齊方式的屬性。內部的屬性值相同。 根據英文意思也能理解其中的意思。如center_horizontal表示在水平方向上的位置為中間。 二、gravity和layout_gravity的不同處 gravity是設置自身內部元素的對齊方式。比如一個TextView&…

koa --- mongoose連接mongoDB

使用Mongoose對MongoDB進行操作 const mongoose require(mongoose); mongoose.connect(mongodb://localhost/test,{ })Mongoose中的Schema 定義Schema categorySchema const categorySchema new mongoose.Schema({name:String,description: String,createdAt:{type: Date,…

Java Web 請求轉發與請求重定向

Java Web 請求轉發與請求重定向 請求轉發 服務器行為&#xff0c;即用戶向服務器發送了一次http請求&#xff0c;該請求可能會經過多個信息資源處理以后菜返回給用戶&#xff0c;各個信息資源使用請求轉發機制互相轉發請求&#xff0c;但是用戶是感覺不到請求轉發的。通過req…

05.RDD詳解

05.Spark--RDD詳解 RDD詳解--groupByKey--reduceByKey [MapPartitionRDD單詞統計] 單詞統計 import org.apache.spark.{SparkConf,SparkContext} object WordCountScala{def main(args:Array[String]):Unit{//創建spark配置對象val confnew SparkConf()conf.setAppName("W…

Mininet

首先&#xff0c;我折騰了兩周多的東西終于弄出一點眉目了。 有以下幾個內容需要學習記憶一下。 1.虛擬機&#xff0c;弄不出來共享文件夾&#xff0c;就用U盤吧&#xff0c;賊快還不用安裝配置各種東西&#xff0c;virtualbox和VMware都支持。 2.ubantu安裝軟件中途失敗&#…

docker --- 使用docker-compose.yml生成redis,并連接redis-cli

docker.compose.yml 配置 version: 3.1 services:redis:image: redisports:- 6379:6379命令行:docker-compose up 查看: docker ps 進入redis-cli,輸入以下 docker exec -it 7dc0a redis-cli -h localhost -p 6379 操作Redis數據 設置 namemarron set name marron 獲取nam…

淺談javaweb三大框架和MVC設計模式

淺談javaweb三大框架和MVC設計模式轉載自&#xff1a;http://blog.csdn.net/sunpeng19960715/article/details/50890705 小序&#xff1a;博主以前在學javaweb的時候開始總不理解javaweb三大框架和MVC框架模式&#xff0c;雖然沒有把兩者混為一談&#xff0c;但是也是很暈菜。…

win下配置nginx

1.下載:http://nginx.org/en/download.html 2.在安裝目錄cmd: start nginx.exe 啟動nginx 3.修改默認運行端口80(nginx.conf): HTTP 數據分發 修改配置文件nginx.conf相應節點: 修改完后重啟服務: nginx -s reload TCP 數據分發: nginx 1.9以上版本支持tcp轉發 配置文件中增加:…

在springBoot中配置web.xml中配置的servlet

第一種 web.xml (截取的需要轉換的) 當攔截到 /socke t時執行該servlet <servlet><servlet-name>websocket</servlet-name><servlet-class>org.ldd.ssm.hangyu.socket.MyWebSocketServlet</servlet-class></servlet><servlet-mapping&g…