<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://ydesign.dev/blog</id>
    <title>Ydesign Blog</title>
    <updated>2024-03-24T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://ydesign.dev/blog"/>
    <subtitle>Ydesign Blog</subtitle>
    <icon>https://ydesign.dev/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Ydesign SDK v1.0 正式发布 🎉]]></title>
        <id>https://ydesign.dev/blog/ydesign-sdk-v1</id>
        <link href="https://ydesign.dev/blog/ydesign-sdk-v1"/>
        <updated>2024-03-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[大家好，我是 冰河末日。经过近两年的开发与打磨，我非常激动地宣布：Ydesign SDK v1.0 正式发布！ 🎉]]></summary>
        <content type="html"><![CDATA[<p>大家好，我是 <strong>冰河末日</strong>。经过近两年的开发与打磨，<strong>我非常激动地宣布：Ydesign SDK v1.0 正式发布！</strong> 🎉</p>
<p>从这个版本开始，我们会严格遵循语义化版本（SemVer）发布规则，让大家的升级更稳定、更可预测。</p>
<p><em>当然也别完全信任现代前端 —— 请假设任何一次升级都有可能踩到新的惊喜。</em> 😅</p>
<h2 class="anchor anchorTargetStickyNavbar_paSG" id="什么是-ydesign-sdk">什么是 Ydesign SDK？<a href="https://ydesign.dev/blog/ydesign-sdk-v1#%E4%BB%80%E4%B9%88%E6%98%AF-ydesign-sdk" class="hash-link" aria-label="什么是 Ydesign SDK？的直接链接" title="什么是 Ydesign SDK？的直接链接" translate="no">​</a></h2>
<p><strong>Ydesign SDK</strong> 是一套用于构建「Canva / 创客贴一类在线设计编辑器」的 <strong>JavaScript 模块、组件库与 React 组件</strong>。目前已经被多家公司和独立开发者用在生产环境。</p>
<p>Ydesign SDK 适合的业务场景：</p>
<ol>
<li class=""><strong>设计与社交媒体应用</strong> —— 海报、封面、名片、短视频封面生成</li>
<li class=""><strong>印刷与商品定制</strong> —— T 恤、马克杯、帆布袋、手机壳的图案自助设计</li>
<li class=""><strong>电商与在线商城</strong> —— 买家自助定制商品图案、店铺营销素材</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_paSG" id="缘起">缘起<a href="https://ydesign.dev/blog/ydesign-sdk-v1#%E7%BC%98%E8%B5%B7" class="hash-link" aria-label="缘起的直接链接" title="缘起的直接链接" translate="no">​</a></h2>
<p>我长期关注在线设计 / 画布编辑领域，过去几年在一线业务中做过多个和 <a href="https://www.canva.com/" target="_blank" rel="noopener noreferrer" class="">canva.com</a> 相似定位的产品，有些是正面竞品，有些只是"自助设计"功能模块，但实现思路高度一致。</p>
<p>时间长了我意识到：<strong>这些年积累的经验，已经足够我自己来做一款这样的产品了。</strong> 既然每次都要替别人从零造一遍这种编辑器，不如把这套能力沉淀下来，给<strong>自己</strong>做一款。</p>
<p>但真正难的并不是把应用做出来。假如目标是做一个 canva 的"复刻版"，面向终端用户（C 端），那就要花大量精力在营销、获客、差异化功能上 —— 而这个赛道已经挤满了竞争对手。我一度放弃了这个想法。</p>
<p>想了很久之后，一个更合适的思路冒了出来：<strong>与其做一款面向 C 端的 canva 竞品，不如做一款面向开发者的 B2B 产品。</strong> 把"构建画布编辑器"这件事抽象成一个 JS SDK，让其他开发者能轻松把功能完整的画布编辑器接入到自己的业务里。这个方向更契合我的能力 —— 我本身就是长期写框架、写工具的工程师，知道什么样的 API 和文档能让开发者用得顺手（但愿如此）。</p>
<p>Ydesign SDK 就是这样诞生的。</p>
<p>感谢这一路上的合作伙伴 <strong><a href="https://github.com/Klchan-me" target="_blank" rel="noopener noreferrer" class="">Klchan-me</a></strong>（前腾讯资深工程师，灵犀光年联合创始人）—— 从架构设计、性能优化到工程规范，一路同行。</p>
<h2 class="anchor anchorTargetStickyNavbar_paSG" id="快速上手">快速上手<a href="https://ydesign.dev/blog/ydesign-sdk-v1#%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B" class="hash-link" aria-label="快速上手的直接链接" title="快速上手的直接链接" translate="no">​</a></h2>
<p>Ydesign SDK 面向开发者，所以请准备好你（或团队里）有一位了解 <code>0.1 + 0.2 !== 0.3</code> 为什么成立的工程师 😉。</p>
<p>如果觉得边看文档边敲代码太麻烦，你也可以直接参考仓库里的 <a href="https://github.com/liaojunhao/react-fabric-editor" target="_blank" rel="noopener noreferrer" class=""><code>apps/demo</code></a> 示例项目，开箱就能跑。</p>
<h3 class="anchor anchorTargetStickyNavbar_paSG" id="安装">安装<a href="https://ydesign.dev/blog/ydesign-sdk-v1#%E5%AE%89%E8%A3%85" class="hash-link" aria-label="安装的直接链接" title="安装的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Kjsu theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_UAhT"><pre tabindex="0" class="prism-code language-bash codeBlock_yObO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_VzHu"><span class="token-line" style="color:#393A34"><span class="token plain">npm install @ydesign/react-editor</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_paSG" id="在-react-里引导一个编辑器">在 React 里引导一个编辑器<a href="https://ydesign.dev/blog/ydesign-sdk-v1#%E5%9C%A8-react-%E9%87%8C%E5%BC%95%E5%AF%BC%E4%B8%80%E4%B8%AA%E7%BC%96%E8%BE%91%E5%99%A8" class="hash-link" aria-label="在 React 里引导一个编辑器的直接链接" title="在 React 里引导一个编辑器的直接链接" translate="no">​</a></h3>
<p>下面这段代码不算最精简，但是一个<strong>可直接复制、后续慢慢按业务修改</strong>的起步模板：</p>
<div class="language-tsx codeBlockContainer_Kjsu theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_UAhT"><pre tabindex="0" class="prism-code language-tsx codeBlock_yObO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_VzHu"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">React</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'react'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">ReactDOM</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'react-dom/client'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">DesignEditorContainer</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">SidePanelWrap</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">WorkspaceWrap</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">SidePanel</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> createStore </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@ydesign/react-editor'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Toolbar</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@ydesign/react-editor/toolbar'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Workspace</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@ydesign/react-editor/canvas/workspace'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">ZoomButtons</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@ydesign/react-editor/toolbar/zoom-buttons'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 记得引入编辑器样式</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@ydesign/react-editor/style.css'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> store </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createStore</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 从控制台申请：https://ydesign.com/cabinet/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  key</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'LICENSE_KEY'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 付费许可证可以隐藏回链</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 但如果能保留，对 Ydesign 项目会是很大的支持</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  showCredit</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">store</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">addPage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">App</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> store </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">DesignEditorContainer</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f"> width</span><span class="token tag script language-javascript operator" style="color:#393A34">:</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript string" style="color:#e3116c">'100vw'</span><span class="token tag script language-javascript punctuation" style="color:#393A34">,</span><span class="token tag script language-javascript" style="color:#00009f"> height</span><span class="token tag script language-javascript operator" style="color:#393A34">:</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript string" style="color:#e3116c">'100vh'</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">SidePanelWrap</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">SidePanel</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">store</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">store</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">SidePanelWrap</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">WorkspaceWrap</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Toolbar</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">store</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">store</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Workspace</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">store</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">store</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">ZoomButtons</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">store</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">store</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">WorkspaceWrap</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">DesignEditorContainer</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 确保页面里存在 id 为 `root` 的容器，并且有明确的尺寸</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> root </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token maybe-class-name">ReactDOM</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">createRoot</span><span class="token punctuation" style="color:#393A34">(</span><span class="token dom variable" style="color:#36acaa">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getElementById</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'root'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">root</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">render</span><span class="token punctuation" style="color:#393A34">(</span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">App</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">store</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">store</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>如果你连这几行模板代码都不想写，可以用更极简的入口：</p>
<div class="language-tsx codeBlockContainer_Kjsu theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_UAhT"><pre tabindex="0" class="prism-code language-tsx codeBlock_yObO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_VzHu"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> createDesignEditorApp </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@ydesign/react-editor'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@ydesign/react-editor/style.css'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> store </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createDesignEditorApp</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  container</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token dom variable" style="color:#36acaa">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getElementById</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'root'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  key</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'LICENSE_KEY'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_paSG" id="商业化">商业化<a href="https://ydesign.dev/blog/ydesign-sdk-v1#%E5%95%86%E4%B8%9A%E5%8C%96" class="hash-link" aria-label="商业化的直接链接" title="商业化的直接链接" translate="no">​</a></h2>
<p>截至目前，Ydesign 仍然是一个<strong>小团队维护的独立项目</strong>。</p>
<p>从最初的第一行代码算起，做到一个"概念验证"版本花了大约三个月；又花了半年左右把核心能力补齐、把首个对外可用版本和官网跑起来；之后大量时间投入到真实业务接入时的反馈与打磨里。在这个过程中，我们对"开发者想要什么样的设计 SDK"有了越来越清晰的答案。</p>
<p>除了 SDK 授权本身，Ydesign 也对外提供<strong>定制化开发、私有化部署、以及完整源码授权</strong>三类商业服务 —— 但这些业务天然不像标准产品那样有可预测的增长曲线，所以我们不会把重心放在它们上面。<strong>做好 SDK 本身、让产品的 DX 更好</strong>，永远是第一优先级。</p>
<p>如果你所在的团队正在调研类似方案，欢迎直接联系我们聊聊。</p>
<h2 class="anchor anchorTargetStickyNavbar_paSG" id="接下来做什么">接下来做什么？<a href="https://ydesign.dev/blog/ydesign-sdk-v1#%E6%8E%A5%E4%B8%8B%E6%9D%A5%E5%81%9A%E4%BB%80%E4%B9%88" class="hash-link" aria-label="接下来做什么？的直接链接" title="接下来做什么？的直接链接" translate="no">​</a></h2>
<p>我们判断这个方向的市场需求还会继续放大，也已经看到新的竞争对手陆续进场。当前 backlog 里还有不少值得做的事情，主要方向有几个：</p>
<ol>
<li class=""><strong><code>@ydesign/vue-editor</code> 正式发布</strong> —— 让 Vue 3 生态也能享受到和 React 版完全对齐的能力，且两边 JSON 完全互通。</li>
<li class=""><strong>动画 / 视频导出</strong> —— 目前支持静态图片、PDF、SVG 导出，动画和视频导出正在规划中。</li>
<li class=""><strong>更多导出格式</strong> —— 印刷级 PDF、HTML、高分辨率 SVG 等。</li>
<li class=""><strong><a class="" href="https://ydesign.dev/docs/cloud-render">云端渲染 API</a> 扩展</strong> —— 解决大文件、高分辨率、批量渲染的性能与一致性问题。</li>
<li class=""><strong>AI 能力持续扩展</strong> —— 智能抠图、一键排版、AI 生图、一键变体等。</li>
<li class=""><strong>协同编辑</strong> —— 基于 CRDT 的多人实时协作。</li>
<li class=""><strong>PPTX 演示稿编辑</strong> —— 支持导入 <code>.pptx</code> 文件、按页编辑、再导出回 <code>.pptx</code>，把 Ydesign 扩展为"浏览器里的 PowerPoint"。基于多页场景（<code>SceneHandler</code>）能力落地。</li>
</ol>
<p>完整的路线图请看 <a class="" href="https://ydesign.dev/roadmap">Roadmap 页面</a>，也欢迎去 GitHub Discussions 投票与讨论。</p>
<p>在开发 Ydesign SDK 的同时，我们也在内部维护了一款名为 <strong>Ydesign Studio</strong> 的演示应用，用来展示 SDK 究竟能做到什么程度，同时也作为我们自己 dogfooding 的场地。它最初被定位成"永久免费、无需登录、无付费墙"的工具。但随着我们计划接入一些昂贵的能力（比如"图片背景移除"），可能也会在 Studio 里加入一定程度的付费门槛 —— 我们仍然在思考，怎么在保留"最小摩擦"体验的同时让它可持续。</p>
<blockquote>
<p><strong>如果你觉得 Ydesign 对你有帮助，帮我们在 <a href="https://github.com/liaojunhao/react-fabric-editor" target="_blank" rel="noopener noreferrer" class="">GitHub 仓库</a>上点个 Star 就是最大的支持了。</strong></p>
</blockquote>]]></content>
        <author>
            <name>冰河末日</name>
            <uri>https://github.com/liaojunhao</uri>
        </author>
        <author>
            <name>Klchan-me</name>
            <uri>https://github.com/Klchan-me</uri>
        </author>
        <category label="Ydesign" term="Ydesign"/>
        <category label="发布公告" term="发布公告"/>
        <category label="画布引擎" term="画布引擎"/>
        <category label="React" term="React"/>
        <category label="架构设计" term="架构设计"/>
        <category label="设计编辑器" term="设计编辑器"/>
    </entry>
</feed>