react实现markdown文件预览

article/2025/7/3 23:33:20

文章目录

  • react实现markdown文件预览
    • 1、实现md文件预览
    • 2、解决图片不显示
    • 3、实现效果

react实现markdown文件预览

1、实现md文件预览

1️⃣第一步:安装依赖:

npm install react-markdown remark-gfm
  • react-markdown:将 Markdown 渲染为 React 元素。
  • remark-gfm:支持 GitHub 风格的 Markdown(如表格、任务列表等)。

2️⃣创建组件进行渲染:

你可以创建一个 MarkdownViewer.jsx 组件:

// MarkdownViewer.jsx
import React, { useEffect, useState } from 'react';
import ReactMarkdown from 'react-markdown';
import remarkGfm from 'remark-gfm';const MarkdownViewer = ({ filePath }) => {const [content, setContent] = useState('');useEffect(() => {fetch(filePath).then((res) => res.text()).then((text) => setContent(text)).catch((err) => console.error(err));}, [filePath]);return (<div className="prose max-w-none"><ReactMarkdown remarkPlugins={[remarkGfm]}>{content}</ReactMarkdown></div>);
};export default MarkdownViewer;

3️⃣第三步:使用组件

假设你有一个 README.md 文件放在 public 目录下:

// App.jsx
import React from 'react';
import MarkdownViewer from './MarkdownViewer';function App() {return (<div className="p-4"><h1 className="text-2xl font-bold mb-4">Markdown 文件预览</h1><MarkdownViewer filePath="/README.md" /></div>);
}export default App;

2、解决图片不显示

1️⃣使用代理服务器转发图片:

// server.js
const express = require('express');
const cors = require('cors');
const app = express();app.use(cors());app.get('/proxy', async (req, res) => {const imageUrl = req.query.url;if (!imageUrl) return res.status(400).send('No url');try {const response = await fetch(imageUrl);const contentType = response.headers.get('content-type');const buffer = await response.arrayBuffer();res.set('Content-Type', contentType);res.send(Buffer.from(buffer));} catch (e) {res.status(500).send('Image proxy failed');}
});app.listen(8080, () => {console.log('Image proxy running at http://localhost:80');
});

2️⃣请求方式:

![代理图](http://localhost:8080/proxy?url=https://gitee.com/durant7/piclist/raw/master/images/20250531074519.png)

3️⃣自定义图片渲染:

// 自定义 img 渲染
const MarkdownImage = ({ src, alt }) => {return (<imgsrc={'http://localhost:80/proxy?url='+src}alt={alt}style={{ maxWidth: '100%', height: 'auto' }}onError={() => console.warn('图片加载失败:', src)}/>);
};

4️⃣修改md文件渲染方式:

<ReactMarkdown
remarkPlugins={[remarkGfm]}
components={{img: MarkdownImage,}}>{content}
</ReactMarkdown>

3、实现效果

image-20250602230702062


http://www.hkcw.cn/article/vjSUSsYpmL.shtml

相关文章

AI大数据模型如何与thingsboard物联网结合

一、 AI大数据与ThingsBoard物联网的结合可以从以下几个方面实现&#xff1a; 1. 数据采集与集成 设备接入&#xff1a;ThingsBoard支持多种通信协议&#xff08;如MQTT、CoAP、HTTP、Modbus、OPC-UA等&#xff09;&#xff0c;可以方便地接入各种物联网设备。通过这些协议&am…

一张图,生成一个网站!

大家好&#xff01;我是羊仔&#xff0c;专注AI工具、智能体、编程。 最近羊仔在网上冲浪的时候&#xff0c;又发现一个超级有意思的AI工具&#xff0c;简直是效率神器&#xff01; 今天要跟大家聊聊的&#xff0c;就是这个最近在GitHub上爆火的开源项目—— LlamaCoder&#…

ToolsSet之:数值提取及批处理

ToolsSet是微软商店中的一款包含数十种实用工具数百种细分功能的工具集合应用&#xff0c;应用基本功能介绍可以查看以下文章&#xff1a; Windows应用ToolsSet介绍https://blog.csdn.net/BinField/article/details/145898264 ToolsSet中Number菜单下的Numeric Batch是一个数…

会计科目主数据:企业数字化转型的“数据总线“与财务核算基石

在数字化浪潮席卷全球的今天&#xff0c;企业数据管理面临前所未有的挑战与机遇。作为财务管理的核心要素&#xff0c;会计科目不仅是ERP系统的基础架构&#xff0c;更是连接企业各业务系统的"数据总线"。本文将深入解析会计科目作为主数据的本质特征、跨系统应用模式…

微服务-Sentinel

目录 背景 Sentinel使用 Sentinel控制台 Sentinel控制规则 Sentinel整合OpenFeign 背景 在微服务项目架构中&#xff0c;存在多个服务相互调用场景&#xff0c;在某些情况下某个微服务不可用时&#xff0c;上游调用者若一直等待&#xff0c;会产生资源的消耗&#xff0c;极端情…

机器学习知识图谱——逻辑回归算法(Logistic Regression)

目录 一、图解逻辑回归 (Logistic Regression)算法知识图谱 二、什么是逻辑回归? 三、应用场景 四、算法核心思想 五、数学表达式公式 六、分类规则 七、损失函数(Log Loss) 八、优点 与 缺点 九、与线性回归的区别 十、Python 简易代码示例 机器学习知识图谱——…

【机器学习基础】机器学习入门核心算法:Mini-Batch K-Means算法

机器学习入门核心算法&#xff1a;Mini-Batch K-Means算法 一、算法逻辑工作流程与传统K-Means对比 二、算法原理与数学推导1. 目标函数2. Mini-Batch更新规则3. 学习率衰减机制4. 伪代码 三、模型评估1. 内部评估指标2. 收敛性判断3. 超参数调优 四、应用案例1. 图像处理 - 颜…

前端框架Vue

vue基础知识点 首先介绍用 HTML 写结构 script 里写 Vue&#xff0c;不需要环境 1.差值表达式{{ }} <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>Hello Vue</title><script src"https://cdn.jsdeliv…

ESP32系列AT固件快速开发——Wi-Fi MQTT

目录 【烧录固件时硬件接线】 【烧录固件】 【AT指令WiFi部分】 设置 Wi-Fi 模式 (Station/SoftAP/StationSoftAP) 查询 Wi-Fi 状态和 Wi-Fi 信息 【AT指令MQTT部分】 Demo:已验证的Wi-Fi连接MQTT连接、发布与订阅 设置MQTT用户属性 设置MQTT连接属性&#xff08;测试…

重温经典算法——并归排序

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 基本原理 归并排序基于分治思想&#xff0c;递归地将数组拆分为两个子数组&#xff0c;分别排序后合并。时间复杂度为 O(n log n)&#xff0c;空间复杂度 O(n)&#xff08;…

05-power BI高级筛选器filter与Values人工造表

返回一个表&#xff0c;用于表示另一个表或表达的子集&#xff0c;不能够单独使用&#xff0c; fileter函数对筛选的表进行横向的逐行扫描&#xff0c;这样的函数也叫迭代函数 例&#xff1a;countrows(fileter(表筛选条件))filter的第一参数必须是唯一值得表&#xff0c; 如果…

贪心算法应用:欧拉路径(Fleury算法)详解

Java中的贪心算法应用&#xff1a;欧拉路径&#xff08;Fleury算法&#xff09;详解 一、欧拉路径与欧拉回路基础 1.1 基本概念 欧拉路径&#xff08;Eulerian Path&#xff09;是指在一个图中&#xff0c;经过图中每一条边且每一条边只经过一次的路径。如果这条路径的起点和…

【CF】Day73——Codeforces Round 887 (Div. 2) B (思维 + 模拟)

B. Fibonaccharsis 题目&#xff1a; 思路&#xff1a; 比C题有意思&#xff0c;但也么意思 对于这一题我们可以考虑最小的情况&#xff0c;即 f0 0&#xff0c;f1 1 时&#xff0c;然后看看什么时候会超过 n 的最大值&#xff0c;我们可以发现 k > 30 时就炸了&#xff…

工作流引擎-16-开源审批流项目之 整合Flowable官方的Rest包

工作流引擎系列 工作流引擎-00-流程引擎概览 工作流引擎-01-Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎&#xff0c;支持现实世界的流程自动化需求 工作流引擎-02-BPM OA ERP 区别和联系 工作流引擎-03-聊一聊流程引擎 工作流引擎-04-流程引擎 activiti 优…

Windows+VSCode搭建小智(xiaozhi)开发环境

作为一名DIY达人&#xff0c;肯定不会错过最近很火的“小智AI聊天机器人”&#xff0c;网上教程非常丰富&#xff0c;初级玩家可以直接在乐鑫官方下载ESP-IDF安装包并经过简单的菜单式配置后&#xff0c;即可进行代码编译和烧录&#xff08;详见&#xff1a;Docs&#xff09;。…

《仿盒马》app开发技术分享-- 购物车业务逻辑完善(端云一体)

开发准备 之前我们已经实现了购物车相关的内容&#xff0c;实现了购物车数据列表的展示&#xff0c;但是我们结算订单之后我们的购物车列表并没有刷新&#xff0c;而且底部的状态栏并没有明显的数据展示来提醒用户&#xff0c;而且当我们在商品详情页添加新商品&#xff0c;底…

谷歌CEO皮查伊眼中的“下一代平台“与未来图景

目录 前言 一、从"能力秀"到"平台重构"&#xff1a;AI的"第二乐章" 二、"万物皆可创"&#xff1a;AI如何引爆每个人的创造力&#xff1f; 三、AI走出屏幕&#xff1a;XR眼镜与机器人的未来交响曲 四、Web不死&#xff0c;只是换了…

DDC Learning Record(2)

这些是 “UV 生成策略”&#xff0c;决定了 Houdini 如何分析模型空间&#xff0c;并分配 UV 坐标。它们只影响 UV 坐标的生成方式&#xff0c;不影响后续贴图的读取行为。 face得到的结果是&#xff1a; 每个面都被映射到了整张贴图&#xff08;[0,1]&#xff09;&#xff0c;…

MySQL数据库从0到1

目录 数据库概述 基本命令 查询命令 函数 表的操作 增删改数据和表结构 约束 事务 索引 视图 触发器 存储过程和函数 三范式 数据库概述 SQL语句的分类&#xff1a; DQL&#xff1a;查询语句&#xff0c;凡是select语句都是DQL。 DML&#xff1a;insert,delete,up…

STM32CubeDAC及DMA配置

STM32CubeDAC及DMA配置 一&#xff0c;问题1二&#xff0c;解决11&#xff0c;宏观思路CubeMX配置2&#xff0c;HAL_TIM_Base_Start(&htim6) 的作用1&#xff0c;作用1&#xff1a;使能TIM6的时钟并让它开始计数2&#xff0c;作用2&#xff1a;当 TIM6 溢出时&#xff0c;会…