我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Express框架view对象如何使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Express框架view对象如何使用

本篇内容主要讲解“Express框架view对象如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Express框架view对象如何使用”吧!

    Expess View 从指定渲染引擎开始

    以 mustache 渲染引擎为例,需要初始化一些代码

    const app = express()app.set("view engine", "mustache");app.engine("mustache", mustacheExpress());app.set("views", toAbsolutePath("./views"));
    • 指定视图引擎

    • 指定引擎工具

    • 指定视图位置

    安装依赖

    pnpm install mustache mustache-express

    从 res.render 函数开始

    render 函数接收两个参数,第一个 view 的路径,第二个渲染数据。

    res.render = function render(view, options, callback) {   // 调用 app.render  app.render(view, opts, done);};

    下面是 app.render 代码实现

    app.render = function render(name, options, callback) {  // view  if (!view) {    var View = this.get('view');    view = new View(name, {      defaultEngine: this.get('view engine'),      root: this.get('views'),      engines: engines    });    if (!view.path) {      var dirs = Array.isArray(view.root) && view.root.length > 1        ? 'directories "' + view.root.slice(0, -1).join('", "') + '" or "' + view.root[view.root.length - 1] + '"'        : 'directory "' + view.root + '"'      var err = new Error('Failed to lookup view "' + name + '" in views ' + dirs);      err.view = view;      return done(err);    }    // prime the cache    if (renderOptions.cache) {      cache[name] = view;    }  }  // render  tryRender(view, renderOptions, done);};

    在 view 不在的情况下,会用 View 实例化 view, 最后调用 tryRender 函数,tryRender 函数会调用 view.render 方法:

    View 的实现

    module.exports = View;function View(name, options) {  // store loaded engine  this.engine = opts.engines[this.ext];  // lookup path  this.path = this.lookup(fileName);}

    跟一般的构造函数一样,初始化一些属性,用传入的 opts 合并一些属性。

    • View 扩展方法

    View.prototype.lookup = function lookup(name) {}View.prototype.render = function render(options, callback) {    this.engine(this.path, options, callback);}View.prototype.resolve = function resolve(dir, file) {}

    render 的具体实现就交给第三方引擎来实现了。

    mustache 的render 方法的实现

    Writer.prototype.render = function render (template, view, partials, config) {  var tags = this.getConfigTags(config);  var tokens = this.parse(template, tags);  var context = (view instanceof Context) ? view : new Context(view, undefined);  return this.renderTokens(tokens, context, partials, template, config);};

    render 函数调用 renderTokens 方法来解析,具体 renderTokens 方法的实现,就不做深入的分析了。

    一个案例切图案例

    需求是这样的,后端使用费 Node.js 开发,没有 JS 运行时,为了能够快速的完成项目,页面的切头由前端完成。此时页面多,任务重,React/Vue 这种现代框架,需要服务端渲染,后端不想用 Node.js,增加复杂度。因为前端 Node.js 能够使用模板渲染,并且模板种类很多,模板能够解决复用的问题,所以前端功能化能够解决,现代前端能结局的问题。

    使用 exprss 服务 + mustache 模板引擎为基础实现一个简单的切图服务

    • Express 创建服务和路由

    • Nodemon 监听文件变化,重新启动路由

    • esno + TypeScript + es Module 编写服务端代码

    • prettier 格式化文件

    在 express 中使用 mustache

    import express from "express";import mustacheExpress from "mustache-express";app.engine("mustache", mustacheExpress());app.set("view engine", "mustache");app.set("views", toAbsolutePath("./views")); // 指定视图路径
    • 渲染一个视图

    app.get(url, async (_, res) => {    res.render(url, data);});

    mustache 拆分模板的基本能用法

    • 定义模板文件

    • 引用模板文件,以及引入文件下的模板的方法

    • 在模板中使用变量

    • 条件判断

    • 列表渲染

    mustache 官方 Github 仓库,需要研究的可以自己访问学习,更多具体的用法。

    示例

    形成一个约定:因为只做简单的切图工作,view + data 文件使用 render 函数渲染的时候一一对应,这样就减少了很多的样板代码。 ·

    • main.server.ts

    读取 views/ 文件夹下的所有视图文件,布局文件不包含(简化),将 /static 目录设置为静态文件夹目录。路由不在单独的写了,此处统一处理为与视图相同命名用于简单的渲染。

    // expressimport express from "express";import mustacheExpress from "mustache-express";// configimport cutConfig from "./cut.config";import defineVars from "iesmo";// nodeimport { resolve } from "path";import fs from "node:fs";const { __dirname } = defineVars(import.meta);export const toAbsolutePath = (p) => resolve(__dirname, p);const routes = fs  .readdirSync(toAbsolutePath("./views/"))  .map((file) => {    if (!/\.mustache$/.test(file)) return null;    return file.replace(/\.mustache$/, "").toLowerCase();  })  .filter((i) => i !== null);const app = express();app.engine("mustache", mustacheExpress());app.set("view engine", "mustache");app.set("views", toAbsolutePath("./views"));app.use("/static", express.static("static"));routes.forEach((route) => {  let url = route === "index" ? "/" : `/${route}`;  app.get(url, async (_, res) => {    let data = (await import(`./data/${route}.ts`)).default;    res.render(route as string, data);  });});app.listen(cutConfig.port, () => {  console.log("server listening on port: ", cutConfig.port);});

    以 index.mustache 模板为示例:

    数据存在 /data 文件夹下,默认输出一个 JS 对象

    <!DOCTYPE html><html lang="en">  <head>    <meta charset="UTF-8" />    <meta http-equiv="X-UA-Compatible" content="IE=edge" />    <meta name="viewport" content="width=device-width, initial-scale=1.0" />    <title>{{{title}}}</title>    {{#links}}     <link href="{{{href}}}" rel="external nofollow"  rel="external nofollow"  rel="stylesheet" />    {{/links}}    {{#scriptsHead}}    <script class="lazy" data-src="{{{class="lazy" data-src}}}"></script>    {{/scriptsHead}}  </head>  <body>    {{>tpls/list }}    {{>layout/footer}}    {{#scriptBody}}    <script class="lazy" data-src="{{{class="lazy" data-src}}}"></script>    {{/scriptBody}}  </body></html>
    • {{{title}}} 插入数据

    • 根据 html 渲染出数据

    {{#links}}<link href="{{{href}}}" rel="external nofollow"  rel="external nofollow"  rel="stylesheet" />{{/links}}
    • 使用文件夹中的模板

    <body>    {{>tpls/list }}    {{>layout/footer}}  </body>

    以上行为表示 tpls 目录下的 list 模板文件和 layout 目录下的 footer 模板文件

    到此,相信大家对“Express框架view对象如何使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Express框架view对象如何使用

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Express框架view对象如何使用

    本篇内容主要讲解“Express框架view对象如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Express框架view对象如何使用”吧!Expess View 从指定渲染引擎开始以 m
    2023-07-05

    一文解析Express框架view对象使用

    这篇文章主要介绍了Express框架view对象使用解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-10

    Express框架req res对象如何使用

    这篇文章主要讲解了“Express框架req res对象如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Express框架req res对象如何使用”吧!Express 请求 req
    2023-07-05

    Express框架Router、Route和Layer对象如何使用

    今天小编给大家分享一下Express框架Router、Route和Layer对象如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了
    2023-07-05

    Express框架reqres对象使用详解

    这篇文章主要为大家介绍了Express框架reqres对象使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-24

    Express框架中_router对象数据结构如何使用

    这篇文章主要介绍了Express框架中_router对象数据结构如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Express框架中_router对象数据结构如何使用文章都会有所收获,下面我们一起来看看吧
    2023-07-05

    Express框架Router Route Layer对象使用示例详解

    这篇文章主要为大家介绍了Express框架Router Route Layer对象使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-24

    Express框架app函数如何使用

    本篇内容主要讲解“Express框架app函数如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Express框架app函数如何使用”吧!express 函数来源首先要搞明白 express
    2023-07-05

    如何配置ABP框架使用对象映射

    小编给大家分享一下如何配置ABP框架使用对象映射,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!DTO和实体实体实体是领域驱动设计(Domain Driven De
    2023-06-29

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录