- 前端
- 图形学
【免费下载链接】svgedit
Powerful SVG-Editor for your browser
SVGEdit 是一款基于 Web、由 JavaScript 驱动的开源 SVG 绘图编辑器,可在任何现代浏览器中运行,其底层依赖强大的 SVG 画布库@svgedit/svgcanvas。本文以项目根目录 README.md 为主线,结合仓库源码与构建配置,系统讲解本地托管、集成到自有 Web 应用、基于 svgcanvas 自建编辑器、扩展开发与贡献流程,帮助你快速上手并二次开发这一浏览器端矢量绘图方案。
项目概述与架构
SVGEdit 由两大核心组件构成:
- svgcanvas:承担底层 SVG 编辑逻辑(绘图、选择、变换、历史记录、图层、路径编辑等),对应 npm 包
@svgedit/svgcanvas,可独立用于构建你自己的编辑器; - editor:负责编辑器 UI(菜单、按钮、面板、对话框等),即 src/editor 目录下的前端应用。
这种拆分在 package.json 的 workspaces 配置中体现得十分直接:
"workspaces": [ "packages/svgcanvas", "packages/react-test" ]仓库当前版本为7.4.2,要求 Node^20.19.0 || >=22.12.0,通过 Vite 构建,产物输出到dist/editor。编辑器入口Editor类位于 src/editor/Editor.js,它继承自EditorStartup,构造时会创建LeftPanel、BottomPanel、TopPanel、LayersPanel、MainMenu等 UI 模块,并将自身挂载为全局变量window.svgEditor,方便脚本调试与扩展调用。
在线体验
无需本地安装,可直接在浏览器中尝试构建版本:
- V7(master 分支开发版)与 V7(npm 最新发布版)均可在线访问;
- 若需兼容旧浏览器或某些已废弃功能,可访问 SVGEdit 6.1.0、5.1.0 等旧版本;
- 也可利用
unpkg直接访问任意 npm 发布版本,例如版本 3.2.0。
本地托管:从克隆到部署
若希望在自己的环境中托管 SVGEdit,README 给出了完整步骤,结合仓库脚本可进一步细化:
- 克隆或复制仓库内容;
- 执行
npm i安装依赖(含 npm workspaces 下的packages/svgcanvas与packages/react-test); - 执行
npm run build --workspace @svgedit/svgcanvas,先本地构建 svgcanvas 依赖; - 本地测试运行
npm run start启动开发服务器; - 用受支持的浏览器访问
http://localhost:8000/src/editor/index.html; - 执行
npm run build构建可部署到自有 Web 服务器的静态包。
从 package.json 的 scripts 可以看到更多细节:
"build": "vite build packages/svgcanvas && vite build packages/react-test && vite build", "postbuild": "node scripts/copy-static.mjs && node scripts/build-extensions.mjs", "start": "vite dev --host --port 8000 --strictPort", "prestart": "echo svgedit is available at http://localhost:8000/src/editor/index.html", "lint": "standard .", "test": "vitest run --coverage && node scripts/run-e2e.mjs"其中postbuild会通过 scripts/copy-static.mjs 复制静态资源并构建扩展,start强制使用 8000 端口。构建配置见 vite.config.mjs:以src/editor/Editor.js为库入口,同时输出 ES Module(Editor.js)与 IIFE(iife-Editor.js)两种格式,并处理src/editor/index.html、iife-index.html、xdomain-index.html三个页面入口。
将 SVGEdit 集成进自有 Web 应用
V7 显著改变了集成与定制方式:只需在 HTML 中插入一个div容器,再通过模块脚本导入Editor并将编辑器注入该容器即可。README 给出了完整示例:
<head> <!-- You need to include the CSS for SVGEdit somewhere in your application --> <link href="./svgedit.css" rel="stylesheet" media="all"></link> </head> <body> <!-- svgedit container can be positioned anywhere in the DOM but it must have a width and a height --> <div id="container" style="width:100%;height:100vh"></div> </body> <script type="module"> /* You need to call the Editor and load it in the <div> */ import Editor from './Editor.js' /* for available options see the file `docs/tutorials/ConfigOptions.md` */ const svgEditor = new Editor(document.getElementById('container')) /* set the configuration */ svgEditor.setConfig({ allowInitialUserOverride: true, extensions: [], noDefaultExtensions: false, userExtensions: [] }) /* initialize the Editor */ svgEditor.init() </script> </html>关键警告(README 原文强调):容器div可以位于 DOM 中的任意位置,但必须具有数值型的宽和高(不能是auto,例如当div处于隐藏状态时会出现auto)。这一点在 src/editor/index.html 的源码中同样有注释说明,集成时务必为容器显式设置width与height。
集成细节与配置入口
仓库自带的 src/editor/index.html 即为上述模式的真实实现:它引入./svgedit.css与./Editor.js,在div#container中注入编辑器,并通过setConfig设置扩展相关配置;userExtensions支持以对象数组形式按路径加载扩展,例如注释中展示的{ pathName: '/packages/react-test/dist/react-test.js' }。此外它还预留了跨域(xdomain)模式的配置分支:
svgEditor.setConfig({ canvasName: 'xdomain', allowedOrigins: ['*'] })Editor类(src/editor/Editor.js)的关键 API 包括:
new Editor(div):构造编辑器实例,div为挂载容器;svgEditor.setConfig(options):设置配置,底层委托给ConfigObj.setConfig(src/editor/ConfigObj.js),必须在页面/DOM 加载前调用,否则不生效;svgEditor.init():完成初始化并启动;svgEditor.ready(cb)/svgEditor.runCallbacks():在编辑器就绪后执行回调;svgEditor.loadFromString(str)/loadFromURL(url)/loadFromDataURI(uri):以字符串、URL 或 Data URI 方式预载 SVG;svgEditor.addExtension(name, initfn, initArgs):以编程方式添加扩展。
关于setConfig的完整可配置项(如dimensions、canvas_expansion、initFill、stylesheets、noStorageOnLoad等)的默认值与用途,见 docs/tutorials/ConfigOptions.md。
基于 svgcanvas 自建 SVG 编辑器
如果不想使用整套 Editor UI,可以只取底层画布,在自己喜欢的框架中搭建编辑器。安装方式:
npm i -s '@svgedit/svgcanvas'然后在应用中导入:
import svgCanvas from '@svgedit/svgcanvas'SvgCanvas类位于 packages/svgcanvas/svgcanvas.js,构造时接收容器元素与配置对象,内部按模块拆分实现了大量核心能力,对应 packages/svgcanvas/core 下的多个模块:
- 绘制与几何:
coords.js(坐标换算)、math.js(矩阵运算)、recalculate.js(变换重算); - 元素与属性:
elem-get-set.js、selected-elem.js、select.js、selection.js; - 历史与撤销:
history.js、historyrecording.js、undo.js; - 图层与路径:
layer.js、path.js、path-actions.js、path-method.js; - 数据与安全:
dataStorage.js(本地存储)、sanitize.js(SVG 消毒)、json.js(SVG/JSON 互转); - 文本、触摸、粘贴:
text-actions.js、touch.js、paste-elem.js、clipboard.js等。
该包的产物与类型声明见 packages/svgcanvas/package.json(main指向dist/svgcanvas.js,types指向svgcanvas.d.ts),其 API 文档由 docs/tutorials/CanvasAPI.md 提供。仓库中的demos目录与 svg-edit-react 仓库均提供了基于底层画布的自建示例。
扩展开发:React 扩展示例
SVGEdit 支持通过扩展(extension)机制增强功能。仓库中的示例扩展使用 React 构建,位于 packages/react-test,其核心组件 packages/react-test/src/ReactTest.js 展示了扩展与编辑器交互的典型方式:
- 从组件 props 中取得
svgEdit与svgCanvas; - 通过
document.addEventListener('svgedit', handler)订阅编辑器事件(如mouseDown、mouseUp),并在组件卸载时移除监听; - 在事件回调中读取
ev.detail(如vars.mouse_x、vars.mouse_y),结合svgCanvas.getZoom()换算画布坐标; - 通过
svgCanvas.setMode('hello_world')切换为自定义模式,渲染一个se-button自定义元素作为工具栏按钮。
激活该扩展的步骤:
- 在扩展目录执行
npm run build,生成扩展 bundle(packages/react-test的build脚本为vite build,产物输出到dist); - 修改
index.html,通过userExtensions激活扩展:
svgEditor.setConfig({ allowInitialUserOverride: true, extensions: [], noDefaultExtensions: false, userExtensions: ['./react-extensions/react-test/dist/react-test.js'] })仓库中 src/editor/extensions 目录还内置了大量官方扩展(如 ext-connector、ext-eyedropper、ext-grid、ext-polystar、ext-shapes、ext-storage 等),每个扩展均包含对应语言的 locale 目录与实现文件,可作为自定义扩展的参考范式;扩展开发规范详见 docs/tutorials/ExtensionDocs.md。
配置选项速览
编辑器行为可通过setConfig或 URL 参数定制,核心用法与优先级规则(详见 docs/tutorials/ConfigOptions.md):
- 编程方式设置:
svgEditor.setConfig({ dimensions: [320, 240], canvas_expansion: 5, initFill: { color: '0000FF' } }); - URL 方式设置:
.../svg-editor.html?dimensions=300,240&canvas_expansion=5&initFill[color]=0000FF; - 优先级:同时设置时,
setConfig的值优先生效(自 v2.7 起,出于安全考虑);可通过第二参数{ overwrite: false }禁止覆盖,或{ allowInitialUserOverride: true }允许后续被 URL 覆盖; - 样式定制:
svgEditor.setConfig({ stylesheets: ['@default', 'myStylesheet.css'] }),保留@default可同时加载默认样式; - 预载文件:
loadFromString('<svg xmlns="...">...</svg>')、loadFromDataURI('data:image/svg+xml;base64,...')、loadFromURL('images/logo.svg'),也可通过 URL 参数?source=/?url=预载。注意:预载时如需阻止本地存储覆盖,应设置noStorageOnLoad: true。
浏览器支持与贡献流程
开发与持续集成基于Chrome环境,同时支持近期的 Chrome、Firefox 与 Safari 版本(项目会尽力修复这些浏览器下的问题)。如需支持旧浏览器,可能需要使用更早版本的 npm 包;若你的浏览器版本有特殊需求,可通过 issue 与项目组沟通是否纳入最新版支持。
若想参与贡献,README 建议先在 GitHub 上 fork 仓库并按前述步骤本地安装,提交 PR 前请务必本地执行:
npm run lint:按 standardjs 规则检查代码风格;npm run test:运行 Vitest 单元测试与 locale 检查(pretest会自动先跑 lint)。
从源码看,测试体系覆盖单元测试(tests/unit)、e2e 测试(tests/e2e,由 scripts/run-e2e.mjs 驱动)与视觉回归示例(tests/visual),代码覆盖率由 Vitest v8 provider 生成(见 vite.config.mjs 的test.coverage配置)。更多项目背景可查阅 AUTHORS(作者列表)与 docs 目录下的各类教程文档(Editor.md、EditorAPI.md、Events.md 等)。
总结
从本地上手到生产部署,SVGEdit 提供了清晰的路径:npm i后即可通过开发服务器体验完整编辑器;将Editor注入带数值宽高的div即可嵌入自有 Web 应用;引入@svgedit/svgcanvas则可完全掌控底层绘图能力自建编辑器;而扩展机制与setConfig配置体系则让功能增强与外观定制变得灵活可控。无论是直接使用、二次开发还是贡献代码,本文所述的命令与源码路径均可作为后续查阅与调试的索引。
- 前端
- 图形学
【免费下载链接】svgedit
Powerful SVG-Editor for your browser
相关推荐
BentoPDF 快速上手指南:在浏览器内完成隐私优先的 PDF 工具集部署
BentoPDF 快速上手指南:在浏览器内完成隐私优先的 PDF 工具集部署 BentoPDF 是一个免费、开源、隐私优先的 PDF 工具集,所有处理都在浏览器
前端LangFlow可视化AI开发实战:零代码构建智能应用的完整指南
LangFlow可视化AI开发实战:零代码构建智能应用的完整指南 LangFlow是一款革命性的可视化AI应用开发平台,让你无需编写复杂代码就能快速构建和部署智
人工智能大模型AI AgentRAG后端前端MCP 服务工作流自动化Semi Design 快速上手指南:从安装到 Next.js / Remix / 浏览器 UMD 的完整集成方案
Semi Design 快速上手指南:从安装到 Next.js / Remix / 浏览器 UMD 的完整集成方案 Semi Design(@douyinfe/
前端UI组件设计系统
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考