koa2 引擎模版html,koa2 动态模板渲染引擎中间件 koa-views + pug

koa2 的模板渲染有很多,比如pug(原 jade)、ejs 等等,这里以 pug 为例。同时使用 koa-views 中间件,将动态模板渲染集成到 koa2 中。

安装:npm install koa-views pug -s

新建一个简单的 server/index.js,代码如下:

const Koa = require('koa');

const app = new Koa();

const views = require('koa-views');

const { resolve } = require('path');

// view 接受两个参数,一个是根路径,一个是配置项

// 根路径我们可以设置成为 上一层的 views 文件夹,把所有 .pug 模板文件都到里面

// extension 是我们要使用的工具,这里使用 pug

app.use(views(resove(__dirname, './views'), {

extension: 'pug'

}));

// 上一个中间件,会对 context 注入 render 方法,我们可以直接使用 render 方法渲染模板

// index 指的是 views 文件夹里面的 index.pug 文件,后缀名可以省略

// render 的第二个参数我们可以向模板文件传递变量。

app.use(async (ctx, next) => {

await ctx.render('index', {

name: 'bluescurry'

});

})

views 文件夹中的 index.pug:

doctype html

html

head

meta(charset='utf-8')

meta(name='viewport', content='width=device-width, initial-scale=1')

title Koa Server Pug

link(href='https://cdn.bootcss.com/twitter-bootstrap/4.1.3/css/bootstrap.min.css' rel='stylesheet')

script(src='https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js')

script(src='https://cdn.bootcss.com/twitter-bootstrap/4.1.3/js/bootstrap.bundle.min.js')

body

.container

.row

.col-md-8

p I am #{name}

.col-md-4

p 测试动态 Pug 模板引擎

简单说一下 koa-views 的源码实现:

源码如下:

'use strict'

const { resolve } = require('path')

const debug = require('debug')('koa-views')

// 核心包,Template engine consolidation library.

const consolidate = require('consolidate')

// 发送静态文件

const send = require('koa-send')

// 获取路径

const getPaths = require('get-paths')

// 美化代码格式

const pretty = require('pretty')

module.exports = viewsMiddleware

function viewsMiddleware(

path,

{ engineSource = consolidate, extension = 'html', options = {}, map } = {}

) {

return function views(ctx, next) {

if (ctx.render) return next()

// 将 render 注入到 context 和 response 对象中

ctx.response.render = ctx.render = function(relPath, locals = {}) {

return getPaths(path, relPath, extension).then(paths => {

const suffix = paths.ext

const state = Object.assign(locals, options, ctx.state || {})

// deep copy partials

state.partials = Object.assign({}, options.partials || {})

debug('render `%s` with %j', paths.rel, state)

ctx.type = 'text/html'

// 如果是 html 文件,不编译直接 send 静态文件

if (isHtml(suffix) && !map) {

return send(ctx, paths.rel, {

root: path

})

} else {

const engineName = map && map[suffix] ? map[suffix] : suffix

// 使用 engineSource 配置的渲染引擎 render

const render = engineSource[engineName]

if (!engineName || !render)

return Promise.reject(

new Error(`Engine not found for the ".${suffix}" file extension`)

)

return render(resolve(path, paths.rel), state).then(html => {

// since pug has deprecated `pretty` option

// we'll use the `pretty` package in the meanwhile

if (locals.pretty) {

debug('using `pretty` package to beautify HTML')

html = pretty(html)

}

ctx.body = html

})

}

})

}

// 中间件执行结束

return next()

}

}

function isHtml(ext) {

return ext === 'html'

}

很简单,一共就60多行代码,主要的功能是把 consolidate 改造为 koa2 的中间件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
koa-body中间件是一个解析HTTP请求body的中间件,用于获取POST请求或PUT请求提交的数据。它可以解析多种格式的数据,如JSON、表单以及多部分数据等。 koa-body中间件使用了co-body来解析HTTP请求body。co-body是一个用于对HTTP请求body进行解析的库,它支持多种格式的数据解析,包括JSON、URL-encoded表单、多部分form-data等。 使用koa-body中间件非常简单,只需要在应用程序中引入并挂载它即可: ``` const Koa = require('koa'); const koaBody = require('koa-body'); const app = new Koa(); app.use(koaBody()); ``` 这样,koa-body中间件就被挂载到了应用程序中,并且在每个HTTP请求到达时自动处理请求的body数据。 koa-body中间件的常用配置选项包括: - `patchNode`:指定在解析JSON对象时是否使用Object.assign()函数进行patch操作,缺省为true。 - `jsonLimit`:指定解析JSON数据的最大字节数,默认为1MB。 - `formLimit`:指定解析表单数据的最大字节数,默认为56KB。 - `textLimit`:指定解析纯文本数据的最大字节数,默认为1MB。 - `encoding`:指定请求体编码,默认为utf-8。 - `multipart`:指定是否解析multipart请求体,默认为false。 - `urlencoded`:指定是否解析URL-encoded表单请求体,默认为true。 - `formidable`:指定是否启用formidable解析multipart请求体,默认为true。 举例: ``` app.use(koaBody({ jsonLimit: '1mb', multipart: true, formidable:{ keepExtensions: true, // 保留扩展名 maxFieldsSize: 2 * 1024 * 1024, // 文件上传大小 } })) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值