Express与传统Web应用(服务端渲染、art-template模板引擎、配置静态资源托管)

一、服务端渲染相关的概念

什么是渲染?
例如对于我们前端开发者来说最常见的一种场景就是:请求后端接口数据,然后将数据通过模板绑定语法绑定到页面中,最终呈现给用户。

数据:
在这里插入图片描述
模板:
在这里插入图片描述

渲染(数据+模板)结果:
在这里插入图片描述
把(数据+模板)拼接到一起的这事儿就是我们这里所指的渲染。

二、传统的Web应用

最早期,Web页面渲染都是在服务端完成的,即服务端运行过程中将所需的数据结合页面模板渲染为HTML,响应给客户端浏览器。所以浏览器呈现出来的是直接包含内容的页面。

工作流程:
在这里插入图片描述
这种方式的代表性技术有:ASP、PHP、JSP等,再到后来的一些相对高级一点的服务端框架配合一些模板引擎。
无论如何这种方式对于没有玩儿过后端开发的来说可能会比较陌生,所以下面通过我们前端比较熟悉的Node.js来了解一下这种方式。

这也就是最早的网页渲染方式,也就是动态网站的核心工作步骤。在这样的一个工作过程中,因为页面中的内容不是固定的,它有一些动态的内容。

const express = require('express')
const fs = require('fs')
const app = express()app.get('/', (req, res) => {// 1. 普通文本// res.send('Hello World')// 2. HTML 格式文本// res.send('<h2>Hello World</h2>')// 3. 为了便于开发和维护,把文件内容放到单独文件// fs.readFile('./views/index.html', (err, data) => {//     if(err) {//         return res.status(404).send('404 Not Found')//     }//     res.end(data)// })// 4. 动态页面渲染const todos = [{id: 1,title: '吃饭1'},{id: 2,title: '吃饭2'},{id: 3,title: '吃饭3'},{id: 4,title: '吃饭4'}]fs.readFile('./views/index.html', 'utf8', (err, data) => {if(err) {return res.status(404).send('404 Not Found')}// 获取数据// 获取页面模板// 数据 + 模板 = 完整页面let str = ''todos.forEach(todo => {str += `<li>${todo.title}</li>`})const ret = data.replace('(*^▽^*)', str)res.end(ret)})// 5. 使用模板引擎
})app.listen(3000, () => {console.log(`Server running at http://localhost:3000/`)
})

在这里插入图片描述
在这里插入图片描述

在今天看来,这种渲染模式是不合理或者说不先进的。因为在当下这种网页越来越复杂的情况下,这种模式存在很多明显的不足:

  • 应用的前后端部分完全耦合在一起,在前后端协同开发方面会有非常大的阻力;
  • 前端没有足够的发挥空间,无法充分利用现在前端生态下的一些更优秀的方案;
  • 由于内容都是在服务端动态生成的,所以服务端的压力较大;
  • 相比目前流行的SPA应用来说,用户体验一般;

但是不得不说,在网页应用并不复杂的情况下,这种方式也是可取的。

三、art-template 模板引擎

npm install art-template --save

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

const express = require('express')
const fs = require('fs')
const path = require('path')
const app = express()
const template = require('art-template')// 当渲染以 .art结尾的资源文件的时候 使用express-art-template
app.engine('art', require('express-art-template'))
// art-template 模板引擎的配置
app.set('view options', {debug: process.env.NODE_ENV !== 'production'
})
// 配置模板文件的存储目录
app.set('views', path.join(__dirname, 'views'))
// 可以省略的模板文件后缀名
app.set('view engine', 'art')app.get('/', (req, res) => {// 1. 普通文本// res.send('Hello World')// 2. HTML 格式文本// res.send('<h2>Hello World</h2>')// 3. 为了便于开发和维护,把文件内容放到单独文件// fs.readFile('./views/index.html', (err, data) => {//     if(err) {//         return res.status(404).send('404 Not Found')//     }//     res.end(data)// })// 4. 动态页面渲染// const todos = [//     {//         id: 1,//         title: '吃饭1'//     },//     {//         id: 2,//         title: '吃饭2'//     },//     {//         id: 3,//         title: '吃饭3'//     },//     {//         id: 4,//         title: '吃饭4'//     }// ]// fs.readFile('./views/index.html', 'utf8', (err, data) => {//     if(err) {//         return res.status(404).send('404 Not Found')//     }//     // 获取数据//     // 获取页面模板//     // 数据 + 模板 = 完整页面//     let str = ''//     todos.forEach(todo => {//         str += `<li>${todo.title}</li>`//     })//     const ret = data.replace('(*^▽^*)', str)//     res.end(ret)// })// 5. 使用模板引擎// 1.读取模板内容// fs.readFile('./views/index.html', 'utf8', (err, templateStr) => {//     if(err) {//         return res.status(404).send('404 Not Found')//     }//     // 2.获取数据const todos = [{id: 1,title: '吃饭1'},{id: 2,title: '吃饭2'},{id: 3,title: '吃饭3'},{id: 4,title: '吃饭4'}]//     // 3.渲染这件事是在服务端完成的//     const ret = template.render(templateStr, { // 模板中使用的数据//         foo: 'bar',//         todos//     })//     res.end(ret)// })// 1.读取模板文件// 2.渲染// 3.发送响应res.render('index.art', {foo: 'bar',todos: todos})})
app.listen(3000, () => {console.log(`Server running at http://localhost:3000/`)
})

四、在Express 中托管静态资源

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.1 配置选项

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2 托管多个资源目录

在这里插入图片描述
注意:
建议加上前缀,防止出现比如
/node_modules里面有css/main.css
/public里面也有css/main.css,
如果这时没有加前缀的话,默认访问的是前面的那个(也就是上面代码中第一行的)目录里面的css/main.css

4.3 页面中的资源路径问题

在这里插入图片描述
关于页面中的静态资料路径,建议使用 绝对路径 / , / 代表的就是当前网站的根目录。
如果使用相对路径的话,./相对的并不是文件中的路径,而是请求的url,这样容易出现静态资源访问不到的问题
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

税收分类编码2020_增值税开票系统你会吗?2020最新开票(金税盘版)图文教程详细版...

做会计的都或多或少的涉及到增值税&#xff0c;增值税也算是我们税务里面占比比较大的&#xff0c;那么增值税发票怎么开&#xff1f;增值税开票软件怎么操作&#xff1f;你都会吗&#xff1f;你曾经会是不是都忘记了&#xff1f;今天会计君和大家分享一份完整的增值税发票开票…

传统Web应用案例(采用服务端渲染)

一、准备静态页面 https://www.expressjs.com.cn/resources/middleware/errorhandler.html 静态页面&#xff1a; https://github.com/gothinkster/realworld-starter-kit/blob/master/FRONTEND_INSTRUCTIONS.md 二、提取控制器模块 三、用户注册的表单提交 3.1 同步方式提…

teamviewer无法建立连接原因未知_3389远程无法连接的5种原因分析

3389无法连接的5种原因分析1、服务器在内网。2、做了tcp/ip筛选。先执行下面cmd命令&#xff1a;cmd /c regedit -e c:1.reg HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesTcpip&#xff0c;导出注册表里关于TCP/IP筛选的第一处cmd /c regedit -e c:2.reg HKEY_LOCAL_MACHINE…

Express框架实现原理

一、Express 源码的目录结构 首先&#xff0c;会去package.json项目&#xff08;包&#xff09;描述文件中寻找main属性的值&#xff0c; main&#xff1a;入口文件。这个main的值就是入口文件所在的路径。 这里并没有配置main属性的值&#xff0c;默认会去找index.js文件作为…

nginx集群_使用Nginx+Tomcat+keepalived 搭建高性能高可用性负载均衡集群

在互联网项目中&#xff0c;往往面临着高用户量、高并发的问题&#xff0c;造成服务器的压力非常大&#xff0c;特别是电商项目&#xff0c;以淘宝天猫为例&#xff0c;近年双十一的成交量屡创新高&#xff0c;可想而知淘宝天猫的服务器面临的并发量有多大&#xff0c;单一服务…

Nodejs之http模块详解

一、Web服务器 什么是Web服务器&#xff1f; 当应用程序&#xff08;客户端&#xff09;需要某一个资源时&#xff0c;可以向一个台服务器&#xff0c;通过Http请求获取到这个资源&#xff1b;提供资源的这个服务器&#xff0c;就是一个Web服务器&#xff1b; 目前有很多开源…

iOS开源照片浏览器框架SGPhotoBrowser的设计与实现

简介 近日在制作一个开源加密相册时附带着设计了一个照片浏览器&#xff0c;在进一步优化后发布到了GitHub供大家使用&#xff0c;该框架虽然没有MWPhotoBrowser那么强大&#xff0c;但是使用起来更为方便&#xff0c;操作更符合常规相册习惯&#xff0c;自定义和修改源码也十分…

Koa框架

一、认识Koa 前面我们已经学习了express&#xff0c;另外一个非常流行的Node Web服务器框架就是Koa。 Koa官方的介绍&#xff1a; koa&#xff1a;next generation web framework for node.js&#xff1b;koa&#xff1a;node.js的下一代web框架&#xff1b; 事实上&#x…

Node使用MySQL

一、认识mysql2 如何可以在Node的代码中执行SQL语句来&#xff0c;这里我们可以借助于两个库&#xff1a; mysql&#xff1a;最早的Node连接MySQL的数据库驱动&#xff1b;mysql2&#xff1a;在mysql的基础之上&#xff0c;进行了很多的优化、改进&#xff1b;目前相对来说&a…

java安装后在哪里打开_冷却塔声屏障安装后降噪效果不理想,原因出在哪里?...

现有冷却塔大部分产品都不能满足噪音环保标准&#xff0c;只有少数几种低吨位超低噪声型号的冷却塔可以满足少部分区域噪声标准要求。在一些商住混合区&#xff0c;冷却塔的出风口强烈的噪声和热气往往干扰附近居民不得安宁&#xff0c;所以冷却塔的噪声问题成为环境投诉的热点…

iOS10 权限崩溃问题

iOS10 权限崩溃问题 原文: http://blog.csdn.net/runleelrg/article/details/51673025 今天 手机升级了 iOS10 Beta&#xff0c;然后用正在开发的项目 装了个ipa包&#xff0c;发现点击有关 权限访问 直接Crash了&#xff0c;并在控制台输出了一些信息&#xff1a; This app h…

Koa框架——coderhub实战

https://github.com/zep03/koa-coderhub/commits/main 一、coderhub功能接口说明 Coderhub旨在创建一个程序员分享生活动态的平台。 完整的项目接口包括&#xff1a; 面向用户的业务接口&#xff1b;面向企业或者内部的后台管理接口&#xff1b; 完成的功能如下&#xff1a;…

python 协程_Python多任务协程

协程协程&#xff0c;又称微线程&#xff0c;纤程。英文名Coroutine。协程是python个中另外一种实现多任务的方式&#xff0c;只不过比线程更小占用更小执行单元(理解为需要的资源)。为啥说它是一个执行单元&#xff0c;因为它自带CPU上下文。这样只要在合适的时机&#xff0c;…

JavaScript高级之构造函数和原型

1.1 概述 在典型的 OOP 的语言中&#xff08;如 Java&#xff09;&#xff0c;都存在类的概念&#xff0c;类就是对象的模板&#xff0c;对象就是类的实例&#xff0c;但在 ES6之前&#xff0c; JS 中并没用引入类的概念。 ES6&#xff0c; 全称 ECMAScript 6.0 &#xff0c;2…

JavaScript高级之继承

ES6之前并没有给我们提供 extends 继承。我们可以通过构造函数原型对象模拟实现继承&#xff0c;被称为组合继承。 2.1 call() 调用这个函数, 并且修改函数运行时的 this 指向 fun.call(thisArg, arg1, arg2, …) thisArg &#xff1a;当前调用函数 this 的指向对象arg1&…

【代码笔记】iOS-UILable电子表显示

一&#xff0c;效果图。 二&#xff0c;代码。 RootViewController.h #import <UIKit/UIKit.h>interface RootViewController : UIViewController {UILabel *label;NSDateFormatter *dateFormatter ; } end RootViewController.m #import "RootViewController.h&qu…

JavaScript高级之ES5 中的新增方法

3.1 ES5 新增方法概述 ES5 中给我们新增了一些方法&#xff0c;可以很方便的操作数组或者字符串&#xff0c;这些方法主要包括&#xff1a; 数组方法字符串方法对象方法 3.2 数组方法 迭代(遍历)方法&#xff1a;forEach()、map()、filter()、some()、every()&#xff1b; …

JavaScript高级之函数进阶

1. 函数的定义和调用 1.1 函数的定义方式 函数声明方式 function 关键字 (命名函数)函数表达式 (匿名函数)new Function() Function 里面参数都必须是字符串格式第三种方式执行效率低&#xff0c;也不方便书写&#xff0c;因此较少使用所有函数都是 Function 的实例(对象)…

react 前端解析二进制流_一年半前端跳槽面试经验(头条、微信、shopee)

在2019年末的时候&#xff0c;突然想搞点大事&#xff0c;思来想去&#xff0c;感觉只有跳槽是最刺激的。由于我比较懒&#xff0c;不想换城市&#xff0c;所以这次只面试了头条、微信和 shopee。十分幸运&#xff0c;都拿到了 offer。接下来就简单的说下大家关心的面试题吧。问…

国内app快速生成平台对比

泰格老虎 2013-03-07 00:39:10 这是海恒CEO高鹏写的一篇国内app快速生成平台对比文章&#xff0c;介绍了国内快速生成APP的平台与自己平台的对比&#xff0c;很有参考价值。同类网站安米网 http://www.appbyme.org/追信 http://app.zhui.cn/简网app工厂 http://app.cutt.com/ap…