首页 > 编程语言 >node+express服务给前端提供markdown数据,前端渲染md文件在页面上

node+express服务给前端提供markdown数据,前端渲染md文件在页面上

时间:2023-11-13 14:58:34浏览次数:29  
标签:node md markdown bottom color 前端 font preview margin

本文介绍后端怎么把markdown文件发给前端,前端又怎么渲染在页面中。

先看效果图

md文件代码

 

前端网页渲染: 

先介绍node+express怎么提供接口:

const express = require("express");
const router = express.Router();
const fs = require("fs");

router.get("/api/getMarkDownContent", (req, res, next) => {
  //这里可以通过 query 拿到get请求的参数,可以实现根据参数返回不同的md文件等效果
  const { query } = req; 
  
  //拿到md文件的全路径
  let filePath = process.cwd() + "/routes/test.md";

  //利用node自带的fs模块------> 创建可读流
  let fileStream = fs.createReadStream(filePath);

  //想要读取到可读流的数据,需要监听data事件
  fileStream.on("data", function (data) {
    // res.write(data, "binary");  //直接返回
    //封装返回
    res.send({
      code: 200,
      data: data.toString(), //Buffer转换为字符串
      msg: '请求成功'
    })
  });

  //错误处理
  fileStream.on("error", (err) => {
    next(err);
  });

  //文件读取完毕
  fileStream.on("end", function () {
    res.end();
  });
});

module.exports = router;
View Code

再介绍前端axios获取数据以及渲染:

<template>
    <div class="markdown-preview">
      <div v-html="renderedMarkdown"></div>
    </div>
</template>

<script setup>
import hljs from 'highlight.js'; //需要 npm install highlight.js
import 'highlight.js/styles/atom-one-dark.css'; // 选择一个自己喜欢的样式风格
import MarkdownIt from 'markdown-it'; //需要 npm install markdown-it
import { getMdContentApi } from '@/xxx' //这里写你自己项目的http请求路径
import { ref, onMounted } from 'vue'

let renderedMarkdown = ref('')

onMounted(async () => {
  const md = new MarkdownIt({
    html: true, // 允许在 Markdown 中使用 HTML
    linkify: true, // 自动转换链接为可点击的链接形式
    typographer: true, // 启用智能引号等文本转换功能
    highlight: function (str, lang) {
      if (lang && hljs.getLanguage(lang)) {
        try {
          return `<pre class="hljs"><code>${hljs.highlight(lang, str, true).value}</code></pre>`;
        } catch (error) {
          console.log(error)
        }
      }
      return `<pre class="hljs"><code>${md.utils.escapeHtml(str)}</code></pre>`;
    },
  });
  const response = await getMdContentApi()
  renderedMarkdown.value = md.render(response.data);

})
</script>
  1. 上面的例子用的是vue3。vue2或其它框架用法类似。
  2. 到这一步,页面已经把后端返回的markdown文件数据渲染成了html了。
  3. 部分样式需要自己去写才能达到满意的效果,我给我上面效果图中,自己加的一个样式代码:
// highlight.js
.markdown-preview ul{
    list-style-type: disc;
}
.markdown-preview ol{
    list-style-type: decimal; 
}
.markdown-preview .hljs{
    font-size: 14px;
    padding: 14px 24px;
    overflow: auto;
    border-radius: 8px;
}
.markdown-preview li code,.markdown-preview p code{
    background-color: #f0f0f0;
    border-radius: 3px;
}

.markdown-preview code{
    line-height: 1.5;
    font-family: Menlo,Monaco,Consolas,'Courier New',monospace;
}

.markdown-preview h1,.markdown-preview h2,.markdown-preview h3,.markdown-preview h4,.markdown-preview h5,.markdown-preview h6 {
    line-height: 1.2;
    margin-top: 1em;
    margin-bottom: 16px;
    color: #000
}

.markdown-preview h1 {
    font-size: 2.25em;
    font-weight: 300;
    padding-bottom: .3em
}

.markdown-preview h2 {
    font-size: 1.75em;
    font-weight: 400;
    padding-bottom: .3em
}

.markdown-preview h3 {
    font-size: 1.5em;
    font-weight: 500
}

.markdown-preview h4 {
    font-size: 1.25em;
    font-weight: 600
}

.markdown-preview h5 {
    font-size: 1.1em;
    font-weight: 600
}

.markdown-preview h6 {
    font-size: 1em;
    font-weight: 600
}

.markdown-preview h1,.markdown-preview h2,.markdown-preview h3,.markdown-preview h4,.markdown-preview h5 {
    font-weight: 600
}

.markdown-preview h5 {
    font-size: 1em
}

.markdown-preview h6 {
    color: #5c5c5c
}

.markdown-preview strong {
    color: #000
}

.markdown-preview del {
    color: #5c5c5c
}

.markdown-preview a:not([href]) {
    color: inherit;
    text-decoration: none
}

.markdown-preview a {
    color: #08c;
    text-decoration: none
}

.markdown-preview a:hover {
    color: #00a3f5;
    text-decoration: none
}

.markdown-preview img {
    max-width: 100%
}

.markdown-preview>p {
    margin-top: 0;
    margin-bottom: 16px;
    word-wrap: break-word
}

.markdown-preview>ol,.markdown-preview>ul {
    margin-bottom: 16px
}

.markdown-preview ol,.markdown-preview ul {
    padding-left: 2em
}

.markdown-preview ol.no-list,.markdown-preview ul.no-list {
    padding: 0;
    list-style-type: none
}

.markdown-preview ol ol,.markdown-preview ol ul,.markdown-preview ul ol,.markdown-preview ul ul {
    margin-top: 0;
    margin-bottom: 0
}

.markdown-preview li {
    margin-bottom: 0
}

.markdown-preview li.task-list-item {
    list-style: none
}

.markdown-preview li>p {
    margin-top: 0;
    margin-bottom: 0
}

.markdown-preview .task-list-item-checkbox {
    margin: 0 .2em .25em -1.8em;
    vertical-align: middle
}

.markdown-preview .task-list-item-checkbox:hover {
    cursor: pointer
}

.markdown-preview blockquote {
    margin: 16px 0;
    font-size: inherit;
    padding: 0 15px;
    color: #5c5c5c;
    background-color: #f0f0f0;
    border-left: 4px solid #d6d6d6
}

.markdown-preview blockquote>:first-child {
    margin-top: 0
}

.markdown-preview blockquote>:last-child {
    margin-bottom: 0
}

.markdown-preview hr {
    height: 4px;
    margin: 32px 0;
    background-color: #d6d6d6;
    border: 0 none
}

.markdown-preview table {
    margin: 10px 0 15px 0;
    border-collapse: collapse;
    border-spacing: 0;
    display: block;
    width: 100%;
    overflow: auto;
    word-break: normal;
    word-break: keep-all
}

.markdown-preview table th {
    font-weight: 700;
    color: #000
}

.markdown-preview table td,.markdown-preview table th {
    border: 1px solid #d6d6d6;
    padding: 6px 13px
}

.markdown-preview dl {
    padding: 0
}

.markdown-preview dl dt {
    padding: 0;
    margin-top: 16px;
    font-size: 1em;
    font-style: italic;
    font-weight: 700
}

.markdown-preview dl dd {
    padding: 0 16px;
    margin-bottom: 16px
}

.markdown-preview blockquote,.markdown-preview dl,.markdown-preview ol,.markdown-preview p,.markdown-preview pre,.markdown-preview ul {
    margin-top: 0;
    margin-bottom: 16px
}

.markdown-preview kbd {
    color: #000;
    border: 1px solid #d6d6d6;
    border-bottom: 2px solid #c7c7c7;
    padding: 2px 4px;
    background-color: #f0f0f0;
    border-radius: 3px
}
View Code

 

ok,大功告成 。

 

标签:node,md,markdown,bottom,color,前端,font,preview,margin
From: https://www.cnblogs.com/wiliam/p/17829051.html

相关文章

  • 优秀的前端工具FinClip Studio 有哪些值得期待的价值点?
    现今,移动应用程序已成为一项重要的技术,人们几乎在所有方面都使用移动应用程序,包括社交媒体、电子商务、娱乐、健康和生产力等领域。用户对移动应用程序的体验和功能需求越来越高,这意味着开发人员需要花费更多的时间和精力来确保应用程序的质量和用户体验。幸运的是,现在有许多可用......
  • 轻量前端框架能否与小程序结合应用?
    前端框架一般指用于简化网页设计的框架,使用广泛的前端开发套件,比如,jquery,extjs,bootstrap等等,这些框架封装了一些功能,比如html文档操作,漂亮的各种控件(按钮,表单等等),使用前端框架可以帮助快速地搭建网站。框架是提供一套完整的解决方案,按照规定好的代码结构来做编排,使用前端框架可......
  • 第十一章、web前端架构师
    目录二十四、自研统计服务,使作品能实现分渠道统计1、二十四、自研统计服务,使作品能实现分渠道统计1、......
  • 正确的语法来在Node中查询MYSQL中的JSON_SET
    在Node.js中,我们可以使用mysql模块来查询MySQL数据库。但是,mysql模块并不直接支持JSON_SET函数,这是一个MySQL特有的函数,用于在JSON文档中插入或更新值。如果你需要在Node.js中使用JSON_SET,你可能需要使用mysql的预处理语句和JSON_EXTRACT函数来实现。以下是一个示例:varmysql=req......
  • 什么是前端应用开发的 LCP(Largest Contentful Paint) 指标
    在网页性能优化的领域里,LCP(LargestContentfulPaint,最大内容绘制)是一个非常重要的性能指标。它测量的是从页面开始加载到页面的"主要内容"完全呈现在屏幕上所需的时间。换句话说,LCP是测量用户何时看到页面的"主要内容"的指标。在理解LCP之前,我们需要知道一个概念,那就是......
  • 前端歌谣的刷题之路-第八十题-无重复数组
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • 前端歌谣的刷题之路-第八十一题-数组排序
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • 前端歌谣的刷题之路-第八十二题-新数组
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • cmd网络命令(七)
    上文介绍了ping命令,继续tracert和arptracertTracert命令就是个路由跟踪命令,是一个检测路由节点数的一个网络命令。举例说,如果我访问百度域名www.baidu.com,使用这个命令进行跟踪检测,该命令就可以列出从您自己的上网IP地址到访问www.baidu.com网站IP所经过的所有服务器(路由)。这就是路......
  • 前端建立WebSocket连接
    WebSockets是H5提供的在web应用程序中客户端与服务器端之间进行的非HTTP的通信机制。当服务器想向客户端发送数据时,可以立即将数据推送到客户端的浏览器中,无需重新建立连接。只要客户端有一个被打开的socket(套接字)并且与服务器建立了连接,服务器就可以把数据推送到这个socket上,......