当前位置: 首页 > news >正文

基于 Vue 的Tiptap 富文本编辑器使用指南

目录

🧰 技术栈

📦 所需依赖

📁 文件结构

🧱 编辑器组件实现(components/Editor.vue)

✨ 常用操作指令

🧠 小贴士

🧩 Tiptap 扩展功能使用说明(含快捷键与命令)

🔹 StarterKit(基础功能集)

🔹 Link(链接)

🔹 Table(表格)

🔹 CodeBlockLowlight(代码块 + 语法高亮)

🔹 Placeholder(占位提示)

🔹 Image(图片上传)

🔹 自定义 Attachment(附件上传)

tiptap collaborative 实时协作

网络实时通信

WebSocket 推荐

WebSocket 后端

多个服务器

显示光标

离线支持

🔗 推荐链接

✅ 总结


本文是针对零基础前端开发者撰写,目的是快速上手并集成一个功能完整的富文本编辑器(Tiptap)到你的 Vue 项目中。


🧰 技术栈

  • Vue 3 + <script setup>

  • Tiptap(基于 ProseMirror)

  • 多种 Tiptap 插件(Extension)支持


📦 所需依赖

npm install @tiptap/vue-3 @tiptap/starter-kit \@tiptap/extension-link \@tiptap/extension-table \@tiptap/extension-table-row \@tiptap/extension-table-cell \@tiptap/extension-table-header \@tiptap/extension-placeholder \@tiptap/extension-code-block-lowlight \@tiptap/extension-image \@tiptap/extension-character-count \lowlight

📁 文件结构

src/
├─ components/
│  └─ Editor.vue    # 编辑器组件
└─ App.vue

🧱 编辑器组件实现(components/Editor.vue)

<template><editor-content :editor="editor" class="editor" />
</template><script setup>
import { onBeforeUnmount } from 'vue'
import { Editor, EditorContent } from '@tiptap/vue-3'import StarterKit from '@tiptap/starter-kit'
import Link from '@tiptap/extension-link'
import Table from '@tiptap/extension-table'
import TableRow from '@tiptap/extension-table-row'
import TableCell from '@tiptap/extension-table-cell'
import TableHeader from '@tiptap/extension-table-header'
import Placeholder from '@tiptap/extension-placeholder'
import CodeBlockLowlight from '@tiptap/extension-code-block-lowlight'
import { lowlight } from 'lowlight/lib/common'
import Image from '@tiptap/extension-image'
import CharacterCount from '@tiptap/extension-character-count'const editor = new Editor({extensions: [StarterKit,Link,Placeholder.configure({ placeholder: '请输入内容…' }),Table.configure({ resizable: true }),TableRow,TableCell,TableHeader,CodeBlockLowlight.configure({ lowlight }),Image,CharacterCount.configure({ limit: 500 }),],content: '<p>Hello Tiptap!</p>',
})onBeforeUnmount(() => {editor.destroy()
})
</script><style scoped>
.editor {border: 1px solid #ccc;padding: 16px;border-radius: 8px;min-height: 200px;
}
</style>

✨ 常用操作指令

  • 获取 HTML 内容:

editor.getHTML()
  • 获取 JSON 内容:

editor.getJSON()
  • 执行命令示例(如设置为加粗):

editor.commands.toggleBold()

🧠 小贴士

  • 所有 Extension 都可以配置和拓展,官方文档中提供了详细 API。

  • 菜单栏需要你自行实现,可以通过组合 editor.commands 来制作按钮。

  • 可自定义 CSS 样式,支持暗色模式、响应式布局等。


🧩 Tiptap 扩展功能使用说明(含快捷键与命令)

以下内容将详细列出各个 Tiptap 扩展的使用方式,包括:

  • 如何引入

  • 如何注册(放进 extensions)

  • 快捷键(如有)

  • 使用 editor.commands 如何触发


🔹 StarterKit(基础功能集)

  • 引入

import StarterKit from '@tiptap/starter-kit'
  • 注册

extensions: [ StarterKit ]
  • 快捷键(默认):

    • 加粗:Mod-b

    • 斜体:Mod-i

    • 标题:Ctrl-Alt-1~6

    • 列表:Shift-Ctrl-8/9

  • 命令示例

editor.commands.toggleBold()
editor.commands.toggleItalic()
editor.commands.toggleHeading({ level: 2 })
editor.commands.toggleBulletList()

🔹 Link(链接)

  • 引入

import Link from '@tiptap/extension-link'
  • 注册

extensions: [ Link.configure({ openOnClick: true }) ]
  • 快捷键:无默认

  • 命令示例

editor.commands.setLink({ href: 'https://example.com' })
editor.commands.unsetLink()

🔹 Table(表格)

  • 引入

import Table from '@tiptap/extension-table'
import TableRow from '@tiptap/extension-table-row'
import TableHeader from '@tiptap/extension-table-header'
import TableCell from '@tiptap/extension-table-cell'
  • 注册

extensions: [Table.configure({ resizable: true }),TableRow,TableHeader,TableCell,
]
  • 快捷键:无默认

  • 命令示例

editor.commands.insertTable({ rows: 3, cols: 3 })
editor.commands.addColumnAfter()
editor.commands.deleteTable()

🔹 CodeBlockLowlight(代码块 + 语法高亮)

  • 引入

import CodeBlockLowlight from '@tiptap/extension-code-block-lowlight'
import { lowlight } from 'lowlight/lib/common'
  • 注册

extensions: [CodeBlockLowlight.configure({ lowlight }),
]
  • 快捷键

    • `Ctrl + Shift + ``

  • 命令示例

editor.commands.toggleCodeBlock()

🔹 Placeholder(占位提示)

  • 引入

import Placeholder from '@tiptap/extension-placeholder'
  • 注册

extensions: [Placeholder.configure({ placeholder: '请输入内容…' })
]
  • 快捷键:无

  • 命令示例:无,主要是展示效果


🔹 Image(图片上传)

  • 引入

import Image from '@tiptap/extension-image'
  • 注册

extensions: [ Image ]
  • 快捷键:无

  • 命令示例

editor.commands.setImage({ src: 'https://example.com/image.jpg' })

通常结合 <input type="file"> 使用,将图片上传到服务器后获取链接插入。


🔹 自定义 Attachment(附件上传)

Tiptap 没有内建“附件”类型,可自定义扩展:

  • 引入(自定义 Node):

async handleFileUpload(e) {const file = e.target.files[0];if (!file) return;try {// 1. 上传文件到服务器(假设 uploadImage 支持所有类型或调整为通用上传函数)const url = await this.uploadImage(file);// 2. 根据文件类型插入内容if (file.type.startsWith('image/')) {// 插入图片this.editor.chain().focus().setImage({ src: url }).run();} else {// 非图片类型插入“附件”文本(可带链接)this.editor.chain().focus().insertContent('附件').run();// 如需插入链接:this.editor.chain().focus().insertContent(`<a href="${url}">附件</a>`).run();}} catch (error) {console.error("上传失败:", error);alert("上传失败,请重试");} finally {e.target.value = null;}
}
    • 快捷键:无

    • 命令示例

    editor.commands.insertContent({type: 'attachment',attrs: {href: 'https://example.com/file.pdf',filename: '报告文件.pdf',},
    })

    上传方式与图片类似,使用 file input 或拖拽上传后插入链接。


    tiptap collaborative 实时协作

    tiptap 支持实时协作、让不同设备之间的同步和离线工作。通过与 Y.js 配合使用无需多少代码即可实现多人在线实时协作,不过在大部分的实践工作中,实时协作并不是一个强需求。

    网络实时通信

    WebRTC仅使用服务器让各个客户端(浏览器)击行相互通讯。服务器并不参与数据的传输。
    安装依赖项:

    npm install @tiptap/extension-collaboration yjs y-webrtc y-prosemirror

    然后创建一个 Y 文档,并注册到 Tiptap:

    import { WebrtcProvider } from 'y-webrtc'// A new Y document
    const ydoc = new Y.Doc()
    // Registered with a WebRTC provider
    const provider = new WebrtcProvider('example-document', ydoc)const editor = new Editor({extensions: [StarterKit.configure({// The Collaboration extension comes with its own history handlinghistory: false,}),// Register the document with TiptapCollaboration.configure({document: ydoc,}),],
    })

    到此为止你就可以让不同的用户进行实时协作了,它是如何运行的呢?WebRTC程序通过公共服务器将客户端连接在一起,服务器并不同步实际的更改,然而这个也有两个缺点。
    1,浏览器拒绝连接太多客户端,对于同一文档中超过 100+ 个并发客户端,它不能很好的支持。
    2,服务器没有参与文档记录的更改,因为WebRTC信令服务器不会收到更改,因此不知道文档中的内容。
    如果你想更深入地研究,请前往GitHub上的Y WebRTC存储库

    WebSocket 推荐

    对于大多数情况,tiptap建议使用 WebSocket ,因为它更灵活,也可以很好地扩展。为了更容易使用,tiptap发布了Hocuspocus作为Tiptap的官方后端程序。

    对于客户端示例几乎相同,只不过驱动程序不同。首先,让我们安装依赖项:

    npm install @tiptap/extension-collaboration @hocuspocus/provider y-prosemirror

    然后向 Tiptap 注册 WebSocket 供应程序:

    import { Editor } from '@tiptap/core'
    import StarterKit from '@tiptap/starter-kit'
    import Collaboration from '@tiptap/extension-collaboration'
    import { HocuspocusProvider } from '@hocuspocus/provider'// Set up the Hocuspocus WebSocket provider
    const provider = new HocuspocusProvider({url: 'ws://127.0.0.1:1234',name: 'example-document',
    })const editor = new Editor({extensions: [StarterKit.configure({// The Collaboration extension comes with its own history handlinghistory: false,}),// Register the document with TiptapCollaboration.configure({document: provider.document,}),],
    })

    如你所见此示例不是开箱即用的。它需要配置为与WebSocket服务器通信,因此需要安装WebSocket 后端程序Hocuspocus。

    WebSocket 后端

    为了使服务器部分尽可能简单,tiptap提供了一个node.js的服务器包 Hocuspocus。它是一个灵活的 Node.js 包,可用于构建后端。
    下面的命令用来启动这个服务:

    npx @hocuspocus/cli --port 1234 --sqlite

    运行 Hocuspocus 命令行,启动侦听1234端口并将更改存储在内存中(一旦停止命令,它就会消失),输出如下所示:

    Hocuspocus v1.0.0 running at:> HTTP: http://127.0.0.1:1234
    > WebSocket: ws://127.0.0.1:1234Ready.

    尝试在浏览器中打开 http://127.0.0.1:1234 网址,如果一切运行正常,你应该会看到一个纯文本。
    然后返回 Tiptap 编辑器并F5刷新网页,它将连接到 Hocuspocus WebSocket 服务器,这时就可以与其他用户进行实时协作了。

    多个服务器

    你可以注册多个服务器保证服务的稳定,当一个服务器宕机客户端将连接另外一个服务器

    new WebrtcProvider('example-document', ydoc)
    new HocuspocusProvider({url: 'ws://127.0.0.1:1234',name: 'example-document',document: ydoc,
    })

    显示光标

    当多个人进行在线编辑,你可以设置每个人的昵称显示在编辑器光标位置

    import { Editor } from '@tiptap/core'
    import StarterKit from '@tiptap/starter-kit'
    import Collaboration from '@tiptap/extension-collaboration'
    import CollaborationCursor from '@tiptap/extension-collaboration-cursor'
    import { HocuspocusProvider } from '@hocuspocus/provider'// Set up the Hocuspocus WebSocket provider
    const provider = new HocuspocusProvider({url: 'ws://127.0.0.1:1234',name: 'example-document',
    })const editor = new Editor({extensions: [StarterKit.configure({// The Collaboration extension comes with its own history handlinghistory: false,}),Collaboration.configure({document: provider.document,}),// Register the collaboration cursor extensionCollaborationCursor.configure({provider: provider,user: {name: 'Cyndi Lauper',color: '#f783ac',},}),],
    })

    离线支持

    基于Y IndexedDB 你可以实现关闭浏览器后所有更改都将存储在浏览器中,下次联机时,WebSocket 提供程序将尝试查找连接并最终同步更改。

    如需添加更多扩展(如任务列表、缩进、emoji 等),可以继续在此格式基础上扩展。

    🔗 推荐链接

    • tiptap 自定义扩展 | 抠丁客
    • 官方网站:Tiptap - Dev Toolkit Editor Suite

    • GitHub:https://github.com/ueberdosis/tiptap

    • ProseMirror 引擎:ProseMirror

    ✅ 总结

    本文总结了一个基于 Vue3 + Tiptap 的富文本编辑器完整实现过程,涵盖依赖安装、扩展配置、编辑器初始化与常用操作,适合新手开发者快速上手。如果你希望快速搭建一个功能完整的编辑器,完全可以直接复制本文结构并根据需求调整内容。

    相关文章:

    基于 Vue 的Tiptap 富文本编辑器使用指南

    目录 &#x1f9f0; 技术栈 &#x1f4e6; 所需依赖 &#x1f4c1; 文件结构 &#x1f9f1; 编辑器组件实现&#xff08;components/Editor.vue&#xff09; ✨ 常用操作指令 &#x1f9e0; 小贴士 &#x1f9e9; Tiptap 扩展功能使用说明&#xff08;含快捷键与命令&am…...

    【音视频】AAC-ADTS分析

    AAC-ADTS 格式分析 AAC⾳频格式&#xff1a;Advanced Audio Coding(⾼级⾳频解码)&#xff0c;是⼀种由MPEG-4标准定义的有损⾳频压缩格式&#xff0c;由Fraunhofer发展&#xff0c;Dolby, Sony和AT&T是主 要的贡献者。 ADIF&#xff1a;Audio Data Interchange Format ⾳…...

    vue中将elementUI和echarts转成pdf文件

    若要将包含 ElementUI 组件数据和多个 ECharts 图表的数据转换为 PDF 文档&#xff0c;可结合 html2canvas、jspdf 以及 dom-to-image 来实现。其中&#xff0c;html2canvas 和 dom-to-image 可将 ECharts 图表转换为图片&#xff0c;jspdf 则用于生成 PDF 文档。对于 ElementU…...

    基于 Electron、Vue3 和 TypeScript 的辅助创作工具全链路开发方案:涵盖画布系统到数据持久化的完整实现

    基于 Electron、Vue3 和 TypeScript 的辅助创作工具全链路开发方案&#xff1a;涵盖画布系统到数据持久化的完整实现 引言 在数字内容创作领域&#xff0c;高效的辅助工具是连接创意与实现的关键桥梁。创作者需要一款集可视化画布、节点关系管理、数据持久化于一体的专业工具&…...

    本地部署DeepSeek-R1模型接入PyCharm

    以下是DeepSeek-R1本地部署及接入PyCharm的详细步骤指南,整合了视频内容及官方文档核心要点: 一、本地部署DeepSeek-R1模型 1. 安装Ollama框架 ​下载安装包 访问Ollama官网(https://ollama.com/download)或通过视频提供的百度云盘链接下载对应系统的安装包。Windows用户…...

    基于LightGBM-TPE算法对交通事故严重程度的分析与可视化

    基于LightGBM-TPE算法对交通事故严重程度的分析与可视化 原文&#xff1a; Analysis and visualization of accidents severity based on LightGBM-TPE 1. 引言部分 文章开篇强调了道路交通事故作为意外死亡的主要原因&#xff0c;引起了多学科领域的关注。分析事故严重性特…...

    音视频小白系统入门课-3

    本系列笔记为博主学习李超老师课程的课堂笔记&#xff0c;仅供参阅 往期课程笔记传送门&#xff1a; 音视频小白系统入门笔记-0音视频小白系统入门笔记-1音视频小白系统入门笔记-2 视频&#xff1a; 由一组图像组成&#xff1a;像素、分辨率、RGB 8888(24位) 、RGBA(32位)为…...

    考研系列-计算机网络-第五章、传输层

    一、传输层提供的服务 1.重点知识...

    将Ubuntu系统中已有的Python环境迁移到Anaconda的虚拟环境中

    需求&#xff1a;关于如何将Ubuntu系统中已有的Python环境迁移到Anaconda的虚拟环境test2里&#xff0c;而且他们提到用requirements.txt 安装一直报错&#xff0c;所以想尝试直接拷贝的方法。 可以尝试通过直接拷贝移植的方式迁移Python环境到Anaconda虚拟环境&#xff0c;但…...

    AI 数字短视频数字人源码开发:多维赋能短视频生态革新​

    在短视频行业深度发展的进程中&#xff0c;AI 数字短视频数字人源码开发凭借其独特的技术优势&#xff0c;从多个维度为行业生态带来了革命性的变化&#xff0c;重塑短视频创作、传播与应用的格局。 数据驱动&#xff0c;实现内容精准化创作 AI 数字短视频数字人源码开发能够深…...

    ffmpeg 硬解码相关知识

    一&#xff1a;FFMPEG 支持的硬解方式&#xff1a;如下都是了解知识 DXVA2 - windows DXVA2 硬件加速技术解析‌ ‌一、核心特性与适用场景‌ ‌技术定义‌&#xff1a;DXVA2&#xff08;DirectX Video Acceleration 2&#xff09;是微软推出的基于 DirectX 的硬件加速标准…...

    Ubuntu数据连接访问崩溃问题

    目录 一、分析问题 1、崩溃问题本地调试gdb调试&#xff1a; 二、解决问题 1. 停止 MySQL 服务 2. 卸载 MySQL 相关包 3. 删除 MySQL 数据目录 4. 清理依赖和缓存 5.重新安装mysql数据库 6.创建程序需要的数据库 三、验证 1、动态库更新了 2、头文件更新了 3、重新…...

    边缘计算全透视:架构、应用与未来图景

    边缘计算全透视&#xff1a;架构、应用与未来图景 一、产生背景二、本质三、特点&#xff08;一&#xff09;位置靠近数据源&#xff08;二&#xff09;分布式架构&#xff08;三&#xff09;实时性要求高 四、关键技术&#xff08;一&#xff09;硬件技术&#xff08;二&#…...

    迅为iTOP-RK3576开发板/核心板6TOPS超强算力NPU适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品

    迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片&#xff0c;集成了4个Cortex-A72和4个Cortex-A53核心&#xff0c;以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。 支持INT4/INT8/INT16/FP16/BF16/TF32混合运算&a…...

    前沿分享|技术雷达202504月刊精华

    本期雷达 ###技术部分 7. GraphRAG 试验 在上次关于 检索增强生成&#xff08;RAG&#xff09;的更新中&#xff0c;我们已经介绍了GraphRAG。它最初在微软的文章中被描述为一个两步的流程&#xff1a; &#xff08;1&#xff09;对文档进行分块&#xff0c;并使用基于大语言…...

    [创业之路-380]:企业法务 - 企业经营中,企业为什么会虚开増值税发票?哪些是虚开増值税发票的行为?示例?风险?

    一、动机与风险 1、企业虚开增值税发票的动机 利益驱动 骗抵税款&#xff1a;通过虚开发票虚增进项税额&#xff0c;减少应纳税额&#xff0c;降低税负。公司套取国家的利益。非法套现&#xff1a;虚构交易开具发票&#xff0c;将资金从公司账户转移至个人账户&#xff0c;用…...

    嵌入式:ARM公司发展史与核心技术演进

    一、发展历程&#xff1a;从Acorn到全球算力基石 1. ​起源&#xff08;1978-1990&#xff09;​ 1978年​&#xff1a;奥地利物理学家Hermann Hauser与工程师Chris Curry创立剑桥处理器公司&#xff08;CPU Ltd.&#xff09;&#xff0c;后更名为**艾康电脑&#xff08;Acor…...

    ubuntu的各种工具配置

    1.nfs&#xff1a;虚拟机桥接模式下&#xff0c;开发板和虚拟机保持在同一网段下&#xff0c;开发板不要直连电脑 挂载命令&#xff1a;mount -v -t nfs 192.168.110.154:/home/lhj /mnt -o nolock (1) 安装 NFS 服务器 sudo apt update sudo apt install nfs-kernel-server -y…...

    Go 剥离 HTML 标签的三把「瑞士军刀」——从正则到 Bluemonday

    1 为什么要「剥皮」&#xff1f; 安全&#xff1a;去掉潜在的 <script onload…> 等恶意标签&#xff0c;防止存储型 XSS。可读性&#xff1a;日志、消息队列、搜索索引里往往只需要纯文本。一致性&#xff1a;不同富文本编辑器生成的 HTML 五花八门&#xff0c;统一成「…...

    【Java面试笔记:基础】6.动态代理是基于什么原理?

    1. 反射机制 定义&#xff1a;反射是 Java 语言提供的一种基础功能&#xff0c;允许程序在运行时自省&#xff08;introspect&#xff09;&#xff0c;直接操作类或对象。功能&#xff1a; 获取类定义、属性和方法。调用方法或构造对象。运行时修改类定义。 应用场景&#xff…...

    docker容器中uv的使用

    文章目录 TL;DRuv简介uv管理项目依赖step 1step 2WindowsLinux/Mac step 3依赖包恢复 在Docker容器中使用uv TL;DR 本文记录uv在docker容器中使用注意点, uv简介 uv是用rust编写的一个python包管理器&#xff0c;特点是速度快&#xff0c;且功能强大&#xff0c;目标是替代p…...

    分部积分选取u、v的核心是什么?

    分部积分选取u、v的核心是什么&#xff1f;是反对幂指三吗&#xff1f; 不全是&#xff0c;其实核心是&#xff1a;v要比u更容易积分&#xff0c;也就是更容易求得原函数&#xff0c;来看一道例题&#xff1a;...

    Android Studio调试中的坑二

    下载新的Android studio Meerkat后&#xff0c;打开发现始终无法更新对应的SDK&#xff0c;连Android 15的SDK也无法在SDK Manger中显示出来&#xff0c;但是Meerkat必须要使用新版本SDK。 Android studio下载地址 命令行工具 | Android Studio | Android Developers 解决…...

    【Redis】缓存三剑客问题实践(上)

    本篇对缓存三剑客问题进行介绍和解决方案说明&#xff0c;下篇将进行实践&#xff0c;有需要的同学可以跳转下篇查看实践篇&#xff1a;&#xff08;待发布&#xff09; 缓存三剑客是什么&#xff1f; 缓存三剑客指的是在分布式系统下使用缓存技术最常见的三类典型问题。它们分…...

    2025年4月22日(平滑)

    在学术和工程语境中&#xff0c;表达“平滑”需根据具体含义选择术语。以下是专业场景下的精准翻译及用法解析&#xff1a; 1. 数学/信号处理中的「平滑」&#xff08;消除噪声&#xff09; Smooth (verb/noun/adjective) “Apply a Gaussian filter to smooth the noisy signa…...

    给vue-admin-template菜单栏 sidebar-item 添加消息提示

    <el-badge :value"200" :max"99" class"item"><el-button size"small">评论</el-button> </el-badge> <!-- 在 SidebarItem.vue 中 --> <template><div v-if"!item.hidden" class&q…...

    C++(初阶)(十二)——stack和queue

    十二&#xff0c;stack和queue 十二&#xff0c;stack和queueStackQueuepriority_queue 简单使用模拟实现deque Stack 函数说明stack()构造空栈empty()判断栈是否为空size()返回栈的有效元素个数top()返会栈顶元素的引用push()将所给元素val压入栈中pop()将栈的尾部元素弹出 …...

    数据采集:AI 发展的基石与驱动力

    人工智能&#xff08;AI&#xff09;无疑是最具变革性的技术力量之一&#xff0c;正以惊人的速度重塑着各行各业的格局。从智能语音助手到自动驾驶汽车&#xff0c;从精准的医疗诊断到个性化的推荐系统&#xff0c;AI 的广泛应用已深刻融入人们的日常生活与工作的各个层面。而在…...

    Kubernetes Docker 部署达梦8数据库

    Kubernetes & Docker 部署达梦8数据库 一、达梦镜像获取 目前达梦官方暂未在公共镜像仓库提供Docker镜像&#xff0c;需通过达梦官网联系获取官方镜像包。 二、Kubernetes部署方案 部署配置文件示例 apiVersion: apps/v1 kind: Deployment metadata:labels:app: dm8na…...

    宏碁笔记本电脑怎样开启/关闭触摸板

    使用快捷键&#xff1a;大多数宏碁笔记本可以使用 “FnF7” 或 “FnF8” 组合键来开启或关闭触摸板&#xff0c;部分型号可能是 “FnF2”“FnF9” 等。如果不确定&#xff0c;可以查看键盘上的功能键图标&#xff0c;一般有触摸板图案的按键就是触摸板的快捷键。通过设备管理器…...

    计算机组成与体系结构:缓存(Cache)

    目录 为什么需要 Cache&#xff1f; &#x1f9f1; Cache 的分层设计 &#x1f539; Level 1 Cache&#xff08;L1 Cache&#xff09;一级缓存 &#x1f539; Level 2 Cache&#xff08;L2 Cache&#xff09;二级缓存 &#x1f539; Level 3 Cache&#xff08;L3 Cache&am…...

    【VS Code】打开远程服务器Docker项目或文件夹

    1、配置SSH连接 在VS Code中&#xff0c;按CtrlShiftP打开命令面板。 输入并选择Remote-SSH: Connect to Host...。 输入远程服务器的SSH地址&#xff08;例如userhostname或userip_address&#xff09;。 如果这是您第一次连接到该主机&#xff0c;VS Code可能会要求您配置…...

    docker 常见命令

    指定服务名查看日志 docker-compose logs -f doc-cleaning docker inspect id 启动所有服务 在docker-compose目录下 docker-compose up -d docker-compose down会删除容器和网络 docker compose stop redis rabbitmq docker compose stop可以快速停止服务&#xff0c;方…...

    C#抽象类和虚方法的作用是什么?

    抽象类 (abstract class)&#xff1a; 不能直接实例化&#xff0c;只能被继承。 用来定义一套基础框架和规范&#xff0c;强制子类必须实现某些方法&#xff08;抽象方法&#xff09;。 可用来封装一些共通的逻辑&#xff0c;减少代码重复。 虚方法 (virtual)&#xff1a; …...

    redis数据类型-基数统计HyperLogLog

    redis数据类型-基数统计HyperLogLog 文档 redis单机安装redis常用的五种数据类型redis数据类型-位图bitmap 说明 官网操作命令指南页面&#xff1a;https://redis.io/docs/latest/commands/?nameget&groupstringHyperLogLog介绍页面&#xff1a;https://redis.io/docs…...

    音视频学习 - MP3格式

    环境 JDK 13 IDEA Build #IC-243.26053.27, built on March 16, 2025 Demo MP3Parser MP3 MP3全称为MPEG Audio Layer 3&#xff0c;它是一种高效的计算机音频编码方案&#xff0c;它以较大的压缩比将音频文件转换成较小的扩展名为.mp3的文件&#xff0c;基本保持源文件的音…...

    Oracle--PL/SQL编程

    前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 PL/SQL&#xff08;Procedural Language/SQL&#xff09;是Oracle数据库中的一种过程化编程语言&#xff0c;构建于SQL之上&#xff0c;允许编写包含S…...

    【愚公系列】《Python网络爬虫从入门到精通》063-项目实战电商数据侦探(主窗体的数据展示)

    &#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…...

    DAPP(去中心化应用程序)开发全解析:构建去中心化应用的流程

    去中心化应用&#xff08;DApp&#xff09;凭借其透明性、抗审查性和用户数据主权&#xff0c;正重塑金融、游戏、社交等领域。本文基于2025年最新开发实践&#xff0c;系统梳理DApp从需求规划到部署运维的全流程&#xff0c;并融入经济模型设计、安全加固等核心要点&#xff0…...

    Spark与Hadoop之间有什么样的对比和联系

    一、什么是Spark Spark 是一个快速、通用且可扩展的大数据处理框架&#xff0c;最初由加州大学伯克利分校的AMPLab于2009年开发&#xff0c;并于2010年开源。它在2013年成为Apache软件基金会的顶级项目&#xff0c;是大数据领域的重要工具之一。 Spark 的优势在于其速度和灵活…...

    spark和Hadoop之间的对比和联系

    Spark 诞生主要是为了解决 Hadoop MapReduce 在迭代计算以及交互式数据处理时面临的性能瓶颈问题。 一&#xff0c;spark的框架 Hadoop MR 框架 从数据源获取数据&#xff0c;经过分析计算后&#xff0c;将结果输出到指定位置&#xff0c;核心是一次计算&#xff0c;不适合迭…...

    LeetCode 第 262 题全解析:从 SQL 到 Swift 的数据分析实战

    文章目录 摘要描述题解答案&#xff08;SQL&#xff09;Swift 题解代码分析代码示例&#xff08;可运行 Demo&#xff09;示例测试及结果时间复杂度分析空间复杂度分析总结未来展望 摘要 在实际业务中&#xff0c;打车平台要监控行程的取消率&#xff0c;及时识别服务质量的问…...

    “融合Python与机器学习的多光谱遥感技术:数据处理、智能分类及跨领域应用”​

    随着遥感技术的快速发展&#xff0c;多光谱数据凭借其多波段信息获取能力&#xff0c;成为地质、农业及环境监测等领域的重要工具。相较于高光谱数据&#xff0c;Landsat、哨兵-2号等免费中分辨率卫星数据具有长时间序列、广覆盖的优势&#xff0c;而无人机平台的兴起进一步补充…...

    JavaScript的JSON处理Map的弊端

    直接使用 Map 会遇到的问题及解决方案 直接使用 Map 会导致数据丢失&#xff0c;因为 JSON.stringify 无法序列化 Map。以下是详细分析及解决方法&#xff1a; 问题复现 // 示例代码 const myMap new Map(); myMap.set(user1, { name: Alice }); myMap.set(user2, { name: B…...

    python的深拷贝浅拷贝(copy /deepcopy )

    先说结论&#xff1a; 浅拷贝&#xff1a; 浅拷贝对在第一层的操作都是新建&#xff0c;不改变原对象。 浅拷贝对于原拷贝对象中的嵌套的可变对象是引用&#xff0c;对原拷贝对象中的嵌套的不可变对象是新建。 对新建的对象操作不会影响原被拷贝对象。 对引用对象操作会影…...

    新能源汽车充电桩:多元化运营模式助力低碳出行

    摘 要:以新能源汽车民用充电桩为研究对象&#xff0c;在分析充电桩建设运营的政府推动模式、电网企业推动模式、汽车厂商推动模式等三种模式利弊的基础上&#xff0c;结合我国的实际情况&#xff0c;提出我国现阶段应实行汽车厂商与电网企业联盟建设充电桩的模式。建立一个考虑…...

    Python 设计模式:享元模式

    1. 什么是享元模式&#xff1f; 享元模式是一种结构型设计模式&#xff0c;旨在通过共享对象来减少内存使用和提高性能。它特别适用于需要大量相似对象的场景&#xff0c;通过共享相同的对象来避免重复创建&#xff0c;从而节省内存和提高效率。 享元模式的核心思想是将对象的…...

    文献×汽车 | 基于 ANSYS 的多级抛物线板簧系统分析

    板簧系统是用于减弱或吸收动态系统中发生的应力、应变、偏转和变形等破坏性因素的机械结构。板簧系统可能对外力产生不同的响应&#xff0c;具体取决于其几何结构和材料特性。板簧系统的计算机辅助分析对于高精度确定系统的变形特性和结构特性至关重要。 在这项工作中&#xff…...

    Element UI、Element Plus 里的表单验证的required必填的属性不能动态响应?

    一 问题背景 想要实现&#xff1a; 新增/修改对话框中(同一个)&#xff0c;修改时“备注”字段非必填&#xff0c;新增时"备注"字段必填 结果发现直接写不生效-初始化一次性 edit: [{ required: true, message: "请输入备注", trigger: "blur" }…...

    【架构】ANSI/IEEE 1471-2000标准深度解析:软件密集型系统架构描述推荐实践

    引言 在软件工程领域&#xff0c;架构设计是确保系统成功的关键因素之一。随着软件系统日益复杂化&#xff0c;如何有效描述和沟通系统架构成为了一个亟待解决的问题。ANSI/IEEE 1471-2000&#xff08;正式名称为"推荐软件密集型系统架构描述实践"&#xff09;应运而…...