一杯茶的时间,带你使用Express框架在服务端渲染图片

前言

大家好,我是南木元元,热衷分享有趣实用的文章。大家知道前端如何绘制出下面这个三角形吗?

在这里插入图片描述

相信很多人的答案都是canvas,使用canvas确实很容易就能实现上面的效果,代码如下:

<canvas id="canvas" width="400" height="400"></canvas>
<script>
    var canvas = document.getElementById('canvas');// 获取canvas元素
    var ctx = canvas.getContext('2d');// 获取绘图上下文
    //绘制一个三角形
    ctx.moveTo(100, 100);
    ctx.lineTo(200, 200);
    ctx.lineTo(50, 100);
    ctx.lineTo(100, 100);
    ctx.stroke();
</script>

对canvas不了解的可以去看我的这篇文章,那你知道在Node.js服务端中如何实现吗,本文就来聊聊在node中进行绘图。

node-canvas库

node中是没有DOM的,怎么绘图呢?这就得用到node-canvas这个库,来实现在node中进行canvas渲染。

不过,使用node-canvas这个库,不同的系统需要安装对应的依赖环境,如下图所示:
在这里插入图片描述
具体环境配置可以参考node-canvas官网

搭建node服务端环境

初始化项目

创建一个文件夹draw,执行npm init命令,该命令的作用就是初始化一个 package.json 文件,将项目变成一个npm项目:

npm init

接着可以一路回车下去,就会发现 package.json 文件已经创建好了。

  • 安装node-canvas

安装node-canvas库,执行如下命令:

npm install canvas
  • 安装nodemon

nodemon是一个流行的开发服务器,能够检测工作区代码的变化,并自动重启。执行下面命令进行安装 :

npm install nodemon --save-dev

这里将nodemon安装为开发依赖 devDependencies,因为仅仅只有在开发时才需要用到。同时可以配置start命令,package.json文件如下:

{
  "name": "draw",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "nodemon server.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "nodemon": "^3.0.1"
  },
  "dependencies": {
    "canvas": "^2.11.2"
  }
}

使用内置http模块创建服务

在文件夹下新建一个server.js文件,代码如下:

//server.js
//1.导入 http 模块
const http = require('http');

const hostname = 'localhost';
const port = 3000;
//2.创建 HTTP 服务器
const server = http.createServer((req, res) => {
  res.end('Hello World');
});
//3.监听端口, 启动服务
server.listen(port, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

运行npm start开启服务器:

npm start

浏览器打开http://localhost:3000/,可以看到如下效果:

在这里插入图片描述

直接用内置的 http 模块搭建服务器有个明显的缺点,就是没有专门的路由机制,即不能根据客户端不同URL及HTTP方法来返回相应内容。因此,我们可以对上述代码进行改进,使用Express来开发Web服务器。

使用Express创建服务

Express是一个基于Node.js的快速、极简的流行Web开发框架,封装了很多功能,如路由和中间件等,可以更加方便的进行开发。

安装Express

npm install express

改写上述server.js代码,如下:

//server.js
//1.导入 express
const express = require('express');

const hostname = 'localhost';
const port = 3000;
//2.创建应用对象
const app = express();
//3.创建路由规则
app.get('/', (req, res) => {
  res.send('Hello World');
});
//4.监听端口 启动服务
app.listen(port, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

运行npm start开启服务器,同样可以看到如下效果:

在这里插入图片描述
到这里,环境就基本搭建好了,下面正式开始绘图。

服务端渲染图片

创建Express路由

Express路由的官方定义:确定应用程序如何响应客户端对特定端点的请求,端点是 URI(路径)和HTTP请求方法(GET、POST 等)。通俗来讲就是服务器根据客户端访问的端点选择相应处理逻辑的机制。一个路由的组成有请求方法,路径和回调函数,如下所示:

app.METHOD(PATH, HANDLER)

因此,我们可以创建一个用于绘图的路由:

app.get('/drawTriangle', (req, res) => {
  //在这里写代码逻辑
});

绘制三角形

这里我们先来实现一下上面这个三角形的例子。

首先需要通过node-canvas提供的createCanvas方法创建画布,代码如下:

//引入createCanvas创建画布方法
const { createCanvas } = require("canvas");
//创建一个400 * 400的canvas
const canvas = createCanvas(400, 400);

其实node中绘图和前端绘图最主要的区别就在这里,node中需要通过node-canvas来创建canvas元素,接下来的绘图就和前端一致了:

...
//获取渲染上下文
const ctx = canvas.getContext("2d");
//绘制三角形
ctx.moveTo(100, 100);
ctx.lineTo(200, 200);
ctx.lineTo(50, 100);
ctx.lineTo(100, 100);
ctx.stroke();

完成绘图后,需要把绘制结果返回给前端。

静态资源中间件

Express内置了处理静态资源的中间件函数express.static,可以提供图片、CSS 文件、JS 文件这类静态文件的服务。

  • 什么是中间件?

中间件本质就是一个回调函数,作用就是使用函数封装能够适用多个应用场景、可复用性良好的代码。

通过如下代码就可以设置一个静态文件中间件,指定当前文件夹下的public目录作为静态资源根目录:

app.use(express.static('./public'));

这样我们就可以访问public目录中的所有文件了,如:

http://localhost:3000/images/bg.png
http://localhost:3000/css/style.css
http://localhost:3000/js/app.js

写入图片文件

接下来我们只需要把绘制好的图片写入到public目录下即可,我们可以通过fs模块来实现。fs模块是Node.js中的内置模块,可以对计算机中的磁盘进行操作,如文件写入、读取、删除等。

文件写入可以使用fs.writeFileSync或fs.writeFile,两者区别:前者是同步写入,js主线程会等待其他线程的执行结果,然后再继续执行主线程的代码,效率较低;后者是异步写入,js主线程不会等待其他线程的执行结果,直接执行后续的主线程代码,效率较好。

这里我们使用fs.writeFile异步写入,其语法格式为:

fs.writeFile(file, data[, options], callback)

参数说明:

  • file 文件名
  • data 待写入的数据
  • options 选项设置(可选)
  • callback 写入回调

fs.writeFile的详细参数可以参考node官网。绘制三角形的完整代码如下:

const express = require("express");
//引入创建画布方法
const { createCanvas } = require("canvas");
//引入fs模块
const fs = require('fs');

const hostname = "localhost";
const port = 3000;

const app = express();
//静态资源中间件的设置
app.use(express.static("./public"));

//创建绘图路由
app.get("/drawTriangle", (req, res) => {
  //创建画布
  const canvas = createCanvas(400, 400);
  //获取渲染上下文
  const ctx = canvas.getContext("2d");
  //绘制三角形
  ctx.moveTo(100, 100);
  ctx.lineTo(200, 200);
  ctx.lineTo(50, 100);
  ctx.lineTo(100, 100);
  ctx.stroke();
  //定义写入的目录和文件名
  const imagePath = "./public/images";
  const imageName = "triangle.png";
  //如果不存在images图片目录就创建一个
  if (!fs.existsSync(imagePath)) {
    fs.mkdirSync(imagePath);
  }
  //将绘制结果写入指定文件,这里toBuffer创建一个Buffer表示画布中包含的图像对象,Buffer对象专门用来处理二进制数据
  fs.writeFile(`${imagePath}/${imageName}`, canvas.toBuffer(), function (err) {
    if (err) {
      console.log("写入失败");
    } else {
      console.log("写入成功");
    }
  });
});

app.listen(port, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

当请求http://localhost:3000/drawTriangle时,就会进行三角形的绘制,并写入public静态资源目录:

在这里插入图片描述

然后浏览器就可以访问这个图片,如下所示:

在这里插入图片描述
到这你以为结束了吗?绘图怎么能少得了Echarts呢,下面就来讲讲Echarts的渲染。

渲染Echarts图表

安装echarts库

npm install echarts

引入echarts库

const echarts = require("echarts");

渲染Echarts图表,代码如下:

//server.js
...
const options = {
  title: {
    text: "第一个 ECharts 实例",
  },
  tooltip: {},
  legend: {
    data: ["销量"],
  },
  xAxis: {
    data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],
  },
  yAxis: {},
  series: [
    {
      name: "销量",
      type: "bar",
      data: [5, 20, 36, 10, 10, 20],
    },
  ],
};
app.get("/drawChart", (req, res) => {
  const canvas = createCanvas(400, 400);
  const imagePath = "./public/images";
  const imageName = "chart.png";
  //初始化echarts,使用创建的canvas作为初始化容器
  const chart = echarts.init(canvas);
  chart.setOption(options);
  //写入文件,chart.getDom()即获取绘制好的canvas
  fs.writeFile(`${imagePath}/${imageName}`, chart.getDom().toBuffer(), function (err) {
    if (err) {
      console.log("写入失败");
    } else {
      console.log("写入成功");
    }
  });
});
...

当请求http://localhost:3000/drawChart时,就会进行图表的渲染:

在这里插入图片描述
渲染完成后浏览器就可以进行访问:

在这里插入图片描述

结语

🔥如果此文对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏、✍️评论,支持一下博主~

  • 113
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 179
    评论
要实现Vue表单弹窗服务端渲染,需要注意以下几点: 1.使用Vue SSR(服务端渲染)来渲染模板,这样可以在服务端将Vue组件渲染成HTML字符串,然后将其发送到浏览器。 2.在应用程序中使用Vue的客户端和服务端代码,并确保组件在两个环境中都可以运行。这意味着您需要将所有组件的依赖项作为外部资源加载到HTML中。 3.在服务端使用Node.js来构建应用程序,使用Express或Koa等框架来处理HTTP请求和响应。 4.在客户端使用Vue.js来处理用户交互和动态渲染。 下面是一个简单的示例代码,以Vue.js和Node.js为例: 首先,我们需要安装Vue.js和Vue Server Renderer: ``` npm install vue vue-server-renderer --save ``` 接下来,我们需要创建一个Vue组件来表示表单弹窗: ```vue <template> <div class="dialog-box" v-if="show"> <div class="dialog"> <h3>{{ title }}</h3> <form @submit.prevent="submit"> <div class="form-group"> <label for="username">Username</label> <input type="text" id="username" v-model="username"> </div> <div class="form-group"> <label for="password">Password</label> <input type="password" id="password" v-model="password"> </div> <button type="submit">Submit</button> </form> </div> </div> </template> <script> export default { data() { return { show: false, title: 'Login', username: '', password: '' } }, methods: { submit() { // handle form submission } } } </script> ``` 然后,我们需要创建一个服务器端渲染的入口文件: ```js const Vue = require('vue') const serverRenderer = require('vue-server-renderer').createRenderer() const express = require('express') const app = express() const App = require('./App.vue') app.get('*', (req, res) => { const vm = new Vue({ render: h => h(App) }) serverRenderer.renderToString(vm, (err, html) => { if (err) { res.status(500).send('Server Error') } else { res.send(` <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue Form Dialog SSR</title> <script src="/bundle.js"></script> </head> <body> ${html} </body> </html> `) } }) }) app.listen(3000, () => { console.log(`Server started at http://localhost:3000`) }) ``` 在这个文件中,我们首先引入了Vue、Vue Server Renderer和Express。然后,我们创建了一个Express应用程序,并为所有路由配置了一个基本的处理程序。在处理程序中,我们创建了一个Vue实例,并使用Vue Server Renderer将其渲染为HTML字符串。最后,我们将HTML字符串包装在一个完整的HTML模板中,其中包含对我们应用程序的客户端代码的引用。 最后,我们需要创建一个客户端入口文件,该文件将启动Vue应用程序并挂载它到DOM中: ```js import Vue from 'vue' import App from './App.vue' new Vue({ render: h => h(App) }).$mount('#app') ``` 这里的代码很简单,我们只是从Vue导入Vue和我们的App组件,并创建了一个Vue实例,并使用它将我们的应用程序挂载到DOM中。 现在,我们可以使用以下命令来启动我们的应用程序: ``` node server.js ``` 这将启动我们的应用程序,并将其监听在端口3000上。要在浏览器中查看它,请导航到http://localhost:3000。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 179
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南木元元

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值