前后端渲染详解

前端渲染

访问网页时,先请求到 html 内容,并渲染出来。然后根据需要发送 ajax 请求获取后台返回的数据来更新页面。

前端渲染的优势

  1. 局部刷新。无需每次都进行完整页面请求
  2. 懒加载。如在页面初始时只加载可视区域内的数据,滚动后rp加载其它数据,可以通过 react-lazyload 实现
  3. 富交互。使用 JS 实现各种酷炫效果
  4. 节约服务器成本。省电省钱,JS 支持 CDN 部署,且部署极其简单,只需要服务器支持静态文件即可
  5. 天生的关注分离设计。服务器来访问数据库提供接口,JS 只关注数据获取和展现
  6. JS 一次学习,到处使用。可以用来开发 Web、Serve、Mobile、Desktop 类型的应用

前端渲染演示

前端渲染就是先请求到页面的数据,再去发ajax请求拿到数据,再把拿到的数据去更新页面

//这里实现一个小案例
index.html
<body>
    <h1>
        hello 我喜欢的水果
    </h1>
    <ul id="myUl">
        <!-- <li>apple</li>
        <li>banana</li>
        <li>pear</li> -->
    </ul>
</body>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js"></script>
<script>
    //直接发起ajax请求
    $(function () {
        $.get('http://localhost:3000/getFruits', function (res) {
            //1.循环遍历res这个数组
            for (var i = 0; i < res.length; i++) {
                //1.1创建li元素
                let li = document.createElement('li')
                //设置li元素的文本
                li.innerHTML = res[i]
                //1.3讲这个li元素追加到ul元素中
                document.getElementById('myUl').appendChild(li)
            }
        })
    })
</script>
index.js
//后端服务代码
const express = require('express')

const app = express()

//静态资源托管
app.use(express.static('./public'))

app.get('/getFruits', (req, res) => {
    let fruits = [
        'apple',
        'banana',
        'pear'
    ]
    res.send(fruits)
})


app.listen(3000, () => {
    console.log('服务启动成功')
})

???
localhost:3000是渲染的前端页面
localhost:3000/getFruits是数组

后端渲染

访问网页时,后端将 html 内容与 json 数据拼接好之后再返回到客户端来渲染。

后端渲染的优势

  1. 服务端渲染不需要先下载一堆 js 和 css 后才能看到页面(首屏性能)
  2. SEO
  3. 服务端渲染不用关心浏览器兼容性问题(随意浏览器发展,这个优点逐渐消失)
  4. 对于电量不给力的手机或平板,减少在客户端的电量消耗很重要

后端渲染的准备工作

EJS模板引擎

ejs官网

后端渲染演示

案例1

index.ejs
<body>
    <h1>这里是ejs</h1>
    <ul>
        <% for(var i=0;i<fruits.length;i++){ %>
        <li><%= fruits[i] %></li>
        <% } %>

    </ul>
</body>

index.js
const express = require('express')
const app = express()
//设置模板引擎的配置
app.set('view engine', 'ejs') //设置当前使用的模板引擎是ejs
app.set('views', './views') //设置当前项目在何处存放模板页面,views目录下


//GET http:localhost:3000/
//访问这个地址的时候,讲模板页面的内容输出
app.get('/', (req, res) => {
    /**
     * 渲染模板页面
     * res.render(view,locals)
     * -view    要渲染的模板页面的名字,直接写文件名即可,可以省略后缀
     * -locals  要携带到模板页面中的数据
     */
    res.render('index.ejs', {
        /**
         * key:value
         * key  就是后续可以在模板页面中使用的模板变量
         * value    就是这个模板变量的值
         */
        fruits: ['HELLO', 'HI', 'HOW ARE YOU']
    })
    //模板变量可以传到模板页面中
})
app.listen(3000, () => {
    console.log('服务启动成功')
})

页面渲染成果:
在这里插入图片描述
案例2

hello.ejs
<body>
    <h1>hello,这里是ejs参数的获取</h1>
    <!-- 要把携带过来的name和age用上 -->
    <p>姓名:<%= name %></p>
    <p>年龄:<%= age %></p>
</body>
index.js
const express = require('express')
const app = express()
//设置模板引擎的配置
app.set('view engine', 'ejs') //设置当前使用的模板引擎是ejs
app.set('views', './views') //设置当前项目在何处存放模板页面,views目录下
//GET http:localhost:3000/hello
//http://localhost:3000/hello?name=zhangsan&age=17
app.get('/hello', (req, res) => {
    //问号后面的参数不可以写死
    //构造函数相当于req.query.name=name
    const { name, age} = req.query
    res.render('hello.ejs', {
        name,
        age
    })
})
app.listen(3000, () => {
    console.log('服务启动成功')
})

页面渲染成果
在这里插入图片描述
案例3

world.ejs
<body>
    <h1>这里是world</h1>
    <%- str %>
</body>
index.js
app.get('/world', (req, res) => {
    res.render('world', {
        str: '<button>点我</button>'
    })
})

页面渲染成果
在这里插入图片描述
案例4

world.ejs
<body>
    <h1>这里是world</h1>
    <table>
        <thead>
            <tr>
                <th>id</th>
                <th>名字</th>
                <th>价格</th>
            </tr>
        </thead>
        <tbody>
            <%  for(var i=0;i<list.length;i++){  %>
            <tr>
                <td><%= list[i].id %></td>
                <td><%= list[i].name %></td>
                <td><%= list[i].price %></td>
            </tr>
            <% } %>

        </tbody>
    </table>
</body>

index.js
app.get('/world', (req, res) => {
    res.render('world', {
        list: [{
                id: 1,
                name: 'Apple',
                price: 10
            },
            {
                id: 2,
                name: 'banana',
                price: 20
            },
            {
                id: 3,
                name: 'pear',
                price: 30
            }
        ]
    })
})

页面渲染成果在这里插入图片描述

前后端分离是一种常见的Web开发模式,它的主要思想是将前端后端分离开来,前端负责展示数据和交互逻辑,后端负责处理数据和业务逻辑。这种模式有助于提高开发效率、降低开发成本、提高系统的可维护性和可扩展性。 在Python Flask中实现前后端分离可以采用以下步骤: 1. 定义API接口:使用Flask框架定义API接口,可以使用Flask-Restful扩展,也可以自己编写路由和控制器。 2. 实现前端页面:可以使用Vue、React等前端框架,也可以直接使用HTML、CSS、JavaScript等技术实现页面。 3. 发送请求前端页面通过AJAX或者Fetch等技术向后端API发送请求,获取数据。 4. 处理数据后端API接收到前端请求后,处理数据并返回JSON格式的数据前端。 5. 显示数据前端页面接收到后端返回的数据后,使用Vue、React等技术将数据渲染到页面上。 在实现前后端分离时,需要注意以下几点: 1. 接口设计:API接口的设计需要考虑到前端的需求,保证前端能够方便地获取和使用数据。 2. 跨域问题:由于前后端分离的模式下,前端后端通常运行在不同的域名下,因此需要解决跨域问题,可以使用Flask-CORS扩展或者其他解决方案。 3. 安全问题:由于前端后端分离,前端页面可以直接访问API接口,因此需要考虑安全问题,可以使用JWT等认证和授权技术。 4. 系统架构:前后端分离的模式需要考虑系统的架构,通常需要使用Nginx等反向代理服务器进行管理。 总之,Python Flask实现前后端分离是一种非常流行和实用的开发模式,可以提高开发效率和系统的可维护性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值