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 同步方式提…

【miscellaneous】北斗短报文

北斗系统最大的特色在于有源定位和短报文特色服务&#xff0c;不止解决了中国有无卫星导航系统的问题&#xff0c;还能将短信和导航结合&#xff0c;是中国北斗卫星导航系统的独特发明&#xff0c;也是一大优势。 北斗的短报文功能&#xff0c;在国防、民生和应急救援等领域&am…

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文件作为…

Java中的流程控制语句

if语句 if语句 : if&#xff08;条件表达式&#xff09;{ 执行语句&#xff1b; } if..else语句&#xff1a;       if&#xff08;条件表达式&#xff09;{ 执行语句&#xff1b; }else{ 执行语句&#xff1b; } if..else if..else语句 :…

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; 目前有很多开源…

python 16bit转8bit的工具_利用python读取YUV文件 转RGB 8bit/10bit通用

注&#xff1a;本文所指的YUV均为YUV420中的I420格式(最常见的一种)&#xff0c;其他格式不能用以下的代码。位深为8bit时&#xff0c;每个像素占用1字节&#xff0c;对应文件指针的fp.read(1)&#xff1b;位深为10bit时&#xff0c;每个像素占用2字节&#xff0c;对应文件指针…

linux的几个文本内容查看命令小结

1cat可以查看文本内容&#xff0c;tac就是反向查看文本内容&#xff0c;但是文本内容多了就全部显示不出来 2nl查看文本内容可以显示行号 3more翻页查看以及less翻页查看 more filename 按键使用&#xff1a; enter一行一行的查看 空格键 向下翻页查看 b或者Ctrl b向上翻页 f或…

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

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

python公式计算器_Python-计算器

#计算器开发需求##1、实现加减乘除及拓号优先级解析#2、用户输入 1 - 2 * ( (60-30 (-40/5) * (9-2*5/3 7 /3*99/4*2998 10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后&#xff0c;#必须自己解析里面的(),,-,*,/符号和公式&#xff0c;运算后得出结果&#xff0c;结果必须…

网络流-SAP算法模板

node 表示当前讨论到的节点&#xff1b; flow 表示该节点被传入/要传出的流量&#xff1b;s, t, ver 分别是起点&#xff0c;终点&#xff0c;节点总数&#xff1b; SAP 函数返回增广路成功增大的流量&#xff1b; dlt 是当前已传出的流量&#xff1b; c 是残量。 1 const int …

python bp神经网络分类预测结果图_深度学习入门(四)BP神经网络——数字分类...

采用的是python中机器学习库sklearn图片数据sklearn简要介绍&#xff1a;#sklearn是Python中的一个机器学习包from sklearn.datasets import load_digits #载入Sklearnimport pylab as pldigitsload_digits()#载入数据集(都是数字图片)print(digits.data.shape)#一共有1797张图…

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…

SPOJ GSS2 Can you answer these queries II (线段树离线) - xgtao -

Can you answer these queries II 这是一道线段树的题目&#xff0c;维护历史版本&#xff0c;给出N(<100000)个数字(-100000<x<100000),要求求出在[l,r]区间里面的连续序列的最大值&#xff0c;并且重复的数字可以加入序列但是值不能再计算。 本题明显使用线段树,它只…

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;…