美文网首页让前端飞
koa2入门系列 Part 3

koa2入门系列 Part 3

作者: 郁南 | 来源:发表于2020-02-07 14:00 被阅读0次

koa页面渲染

上一节我们通过koa的路由中间件,在上下文的body属性中渲染页面内容,但那只是基本的一些字符串内容,而我们前端所用的页面,或者浏览器所渲染的,基本都是html标签的页面文件,如果想在koa路由中渲染标签内容,又如何做呢,接下来看代码

1、渲染html内容

就是在body中渲染标签文本,用es6的模版语法把html文本包起来就可以了。

const Koa = require('koa');
const Router = require('koa-router');

const app = new Koa();
const router = new Router();

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

router.get('/', async ctx => {
  ctx.type = `text/html;charset=utf-8`;
  ctx.body = `
  <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <title></title>
      </head>
      <body>
        <h2>test</h2>
      </body>
    </html>

  `;
});

//启动路由
app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3000);

重启服务,刷新浏览器,就会看到浏览器显示加粗的test字样。
众所周知,日常开发中,页面需要展示的标签内容有时候是很庞大的,而这时候body又不可能去填写那么多的内容,这时候就得益于编程中的模块化思想了:就是把想要的内容当成一个模块引入。

2、渲染js标签文件

接下来新建一个html.js文件,把上面要展示的html内容复制过去

module.exports = `
<!DOCTYPE html>
  <html lang="en">
    <head>
      <meta charset="UTF-8" />
      <title></title>
    </head>
    <body>
      <h2>test</h2>
    </body>
  </html>
`;

然后在app.js中引入

const Koa = require('koa');
const Router = require('koa-router');

const testTpl = require('./html.js');
console.log(testTpl);
const app = new Koa();
const router = new Router();

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

router.get('/', async ctx => {
  ctx.type = `text/html;charset=utf-8`;
  ctx.body = testTpl;
});

//启动路由
app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3000);

重启服务器,刷新浏览器,这样页面就能展示同样的内容。

3、模版渲染

虽然当作模块引入也能达到我们想要的效果,但html.js毕竟只是一个js文件,跟我们正常使用的html文件还是不一样,如果想要使用html文件,就要使用本节需要用到的koa-views中间件了。

  • 首先下载yarn add koa-views ejs,其中ejs是模版库,用来渲染模版文件的,具体用法参考官网
  • 然后在项目根目录新建views文件夹,并在该目录下新建index.ejsnews.ejsblocks/header.ejs文件,文件内的内容如下
<!DOCTYPE html>
<html lang="en">
  <!-- index.ejs -->
  <head>
    <meta charset="UTF-8" />
    <title>首页</title>
  </head>
  <body>
    <!-- 模版语法,include包含的路径是以views配置的文件夹为准的 -->
    <%- include('blocks/header.ejs') %>
    <p><%= commonData %></p>
    <p><%= title %></p>
    <ul>
      <% for(var i = 0;i < list.length;i++){ %>
      <li><%= list[i] %></li>
      <% } %>
    </ul>
  </body>
</html>
<!DOCTYPE html>
<html lang="en">
  <!-- news.ejs -->
  <head>
    <meta charset="UTF-8" />
    <title>首页</title>
  </head>
  <body>
    <!-- 模版语法,include包含的路径是以views配置的文件夹为准的 -->
    <%- include('blocks/header.ejs') %>
    <p><%= commonData %></p>
    <p><%= title %></p>
    <ul>
      <% for(var i = 0;i < list.length;i++){ %>
      <li><%= list[i] %></li>
      <% } %>
    </ul>
  </body>
</html>
<!-- header.ejs -->
<h1>这是一个头部模块</h1>
  • 最后配置app.js文件,使用模版文件
const Koa = require('koa');
const Router = require('koa-router');
const Views = require('koa-views');

const testTpl = require('./html.js');

const app = new Koa();
const router = new Router();

// 配置模版引擎中间件,.html和.ejs配置取其一
// 匹配.html后缀模版文件
// app.use(
//   Views('views', {
//     map: { html: 'ejs' }
//   })
// );

// 匹配.ejs后缀模版文件
app.use(
  Views('views', {
    extension: 'ejs'
  })
);

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

// 配置公共信息的中间件
app.use(async (ctx, next) => {
  ctx.state.commonData = '中间件:公共信息配置,其中commonData是随意起的名字';
  ctx.state.commonData2 =
    '中间件2:公共信息配置,其中commonData2是随意起的名字';
  // 要显式向下继续执行
  await next();
});

// 配置首页模版信息
router.get('/', async ctx => {
  const title = 'Hello world !';
  const list = ['Charles', 'Jack', 'Black', 'Lusy'];

  /**
   * 利用上下文的render函数渲染匹配到的文件
   * index:匹配的中间件views文件夹下的文件名,后缀是.html或.ejs
   * {title,list}:匹配的文件中使用的变量
   */
  await ctx.render('index', { title, list });
});

router.get('/news', async ctx => {
  await ctx.render('news', {});
});

router.get('/html', async ctx => {
  ctx.type = `text/html;charset=utf-8`;
  ctx.body = testTpl;
});

//启动路由
app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3000);

重启node,刷新浏览器


输入对应的/news/html也能看到对应的内容,完美!。
到这里,koa模版渲染中间件的基本使用就完成了。

Ps

模版文件报错,要注意模版文件中路径的引入

  /*
  出现类似这个错误:
      SyntaxError: Unexpected token . in /PATH/index.ejs while compiling ejs  
If the above error is not helpful, you may want to try EJS-Lint:
https://github.com/RyanZim/EJS-Lint
Or, if you meant to create an async function, pass `async: true` as an option.
  是写法  <% include ../PATH/files.ejs %> 导致
  要改成 <%- include('../PATH/files.ejs') %>

  而且模版文件不能写注释: <!-- 注释内容 -->
*/

下一节

相关文章

  • koa2入门系列

    koa2入门系列(一) koa2入门系列(二) koa2入门系列(三) koa2入门系列(四) koa2入门系列(...

  • koa2入门系列 Part 3

    koa页面渲染 上一节我们通过koa的路由中间件,在上下文的body属性中渲染页面内容,但那只是基本的一些字符串内...

  • koa2入门系列 Part 1

    对于koa就不过多介绍了,具体可以自行百度或者看官方文档。 1、初始化项目 首先创建项目文件夹mkdir koa2...

  • koa2入门系列 Part 4

    koa静态文件配置 上一节讲述了在koa中的模版渲染,也就是html文件在koa中的应用,但作为前端的渲染文件,光...

  • koa2入门系列 Part 2

    路由中间件koa-router 在我们使用vue或者react的时候,页面跳转都会有对应都路由中间件如vue-ro...

  • Koa2教程(初识篇)

    目录一、定义二、安装三、koa中间件 系列教程Koa2教程(入门篇)Koa2教程(常用中间件篇) 一、定义 一个简...

  • koa 洋葱模型

    分析 1、首先这是koa2最简单的入门例子,我将通过这个入门例子来演示koa2的洋葱模型 在这里面,app首先是调...

  • Gradle入门系列

    Gradle入门系列(1):简介Gradle入门系列(2):第一个Java项目Gradle入门系列(3):依赖管理...

  • koa2入门系列(六)

    上一节[https://www.jianshu.com/p/6f2fb8d04378]实现了get和post的接口...

  • koa2入门系列(五)

    模拟接口请求,以及数据处理中间件 突然踏入node相关的学习,你或许曾经会有这样的疑问:前端既然已经有了React...

网友评论

    本文标题:koa2入门系列 Part 3

    本文链接:https://www.haomeiwen.com/subject/nqumxhtx.html