Slate React集成指南:构建现代化React富文本编辑器
本文深入探讨了Slate-React包的核心架构与实现原理,详细解析了如何构建高性能、可定制化的React富文本编辑器。文章涵盖了Slate-React的核心功能架构设计、Editable组件与React渲染系统的深度集成、useSlate等React Hook的高级使用技巧,以及自定义元素渲染与样式控制的实战案例。通过分层架构图、性能优化策略和代码示例,全面展示了Slate-React在状态管理、事件处理、跨平台兼容性等方面的强大能力,为开发者提供了一套完整的现代化富文本编辑器解决方案。
Slate-React包的核心功能与架构设计
Slate-React是Slate编辑器框架与React生态系统的桥梁,它提供了一套完整的React组件和Hook系统,使得开发者能够以声明式的方式构建高度定制化的富文本编辑器。该包的设计哲学是保持React的开发范式,同时提供强大的编辑器功能。
核心架构组件
Slate-React的架构设计采用了分层结构,主要包括以下几个核心部分:
1. 上下文提供者系统
Slate-React使用React Context API来管理编辑器状态,确保所有子组件都能访问到编辑器实例和当前状态:
graph TB
A[Slate Provider] --> B[EditorContext]
A --> C[FocusedContext]
A --> D[SelectorContext]
B --> E[useSlateStatic]
C --> F[useFocused]
D --> G[useSlateSelector]
这种设计使得组件能够按需订阅编辑器状态的变化,避免不必要的重渲染。
2. 组件渲染体系
Slate-React提供了灵活的渲染系统,允许开发者完全控制编辑器内容的呈现方式:
| 渲染组件 | 作用域 | 使用场景 | 示例 |
|---|---|---|---|
renderElement |
块级元素 | 段落、引用、列表等 | 自定义块组件 |
renderLeaf |
文本叶子节点 | 粗体、斜体、颜色等 | 文本样式应用 |
renderText |
文本节点容器 | 文本包装、装饰 | 语法高亮容器 |
renderPlaceholder |
占位符 | 空编辑器提示 | 自定义占位文本 |
// 渲染函数示例
const renderElement = useCallback(({ attributes, children, element }) => {
switch (element.type) {
case 'code':
return <CodeBlock {...attributes}>{children}</CodeBlock>
case 'quote':
return <Blockquote {...attributes}>{children}</Blockquote>
default:
return <Paragraph {...attributes}>{children}</Paragraph>
}
}, [])
3. Hook系统设计
Slate-React提供了一系列精心设计的Hook,用于访问编辑器状态和执行操作:
flowchart TD
A[useSlate] --> B[获取编辑器实例]
A --> C[订阅状态变化]
D[useFocused] --> E[获取焦点状态]
F[useSelected] --> G[获取选中状态]
H[useReadOnly] --> I[获取只读状态]
J[useDecorations] --> K[动态装饰器]
核心Hook的功能对比:
| Hook名称 | 返回值类型 | 主要用途 | 重渲染触发条件 |
|---|---|---|---|
useSlate |
Editor实例 | 执行编辑器命令 | 任何编辑器状态变化 |
useSlateStatic |
Editor实例 | 只读访问编辑器 | 永不重渲染 |
useFocused |
boolean | 检测编辑器焦点状态 | 焦点变化时 |
useSelected |
boolean | 检测元素选中状态 | 选择变化时 |
4. 性能优化机制
Slate-React内置了多种性能优化策略:
Chunking优化:通过分块渲染减少DOM操作,对于大型文档特别有效:
// 分块配置示例
editor.getChunkSize = (node: Ancestor) => {
if (node.type === 'paragraph') return 100
if (node.type === 'code-block') return 50
return null // 禁用分块
}
选择器优化:useSlateSelector Hook允许组件只订阅特定的状态片段:
const isBoldActive = useSlateSelector(editor =>
Editor.marks(editor)?.bold === true
)
5. 事件处理系统
Slate-React实现了完整的事件处理机制,包括:
- DOM事件代理:处理键盘、鼠标、触摸等原生事件
- 输入法合成事件:支持IME输入和移动端输入
- 选择变化追踪:实时同步DOM选择与编辑器选择状态
- 粘贴处理:HTML和纯文本粘贴的内容解析
6. 跨平台兼容性
架构设计考虑了多平台兼容性:
pie title 平台兼容性支持
"桌面浏览器" : 45
"移动端浏览器" : 30
"Android输入法" : 15
"iOS输入法" : 10
特别针对移动端优化:
- Android输入法管理器处理复杂的输入场景
- iOS特定的事件处理逻辑
- 触摸选择和手势支持
核心设计原则
Slate-React的架构遵循以下几个核心设计原则:
- 不可变性优先:所有状态变更都通过不可变数据流处理
- 最小化重渲染:精细化的状态订阅机制避免不必要的组件更新
- 可扩展性:插件系统允许轻松扩展功能
- 类型安全:完整的TypeScript支持提供良好的开发体验
- 渐进式增强:基础功能稳定,高级功能可选择性使用
这种架构设计使得Slate-React既能够提供强大的编辑器功能,又保持了React开发的简洁性和可维护性。开发者可以专注于业务逻辑的实现,而无需关心底层复杂的编辑器状态管理和DOM操作细节。
Editable组件与React渲染系统的深度集成
Slate的Editable组件是整个React集成体系的核心,它不仅仅是简单的DOM包装器,而是一个高度优化的、与React渲染系统深度集成的复杂组件。通过巧妙的设计模式和技术实现,Editable组件实现了Slate编辑器状态与React虚拟DOM的无缝同步。
核心架构设计
Editable组件采用了多层次的渲染架构,通过React Hooks和自定义渲染器实现了高效的性能优化:
flowchart TD
A[Editable Component] --> B[useSlate Hook]
A --> C[useChildren Hook]
A --> D[Event Handlers]
B --> E[Editor State]
C --> F[Element Component]
C --> G[Text Component]
F --> H[Leaf Component]
G --> H
D --> I[DOM Events]
I --> J[State Updates]
J --> B
渲染管线优化
Editable组件通过useChildren Hook实现了智能的子节点渲染管理。这个Hook负责处理装饰器分割、节点索引维护和块级优化:
// 简化的useChildren实现核心逻辑
const useChildren = (props: {
decorations: DecoratedRange[];
node: Ancestor;
renderElement?: (props: RenderElementProps) => JSX.Element;
renderLeaf?: (props: RenderLeafProps) => JSX.Element;
}) => {
const editor = useSlateStatic();
// 装饰器按子节点分割
const { decorationsByChild } = useDecorationsByChild(
editor,
node,
decorations
);
// 更新节点索引和父子关系
node.children.forEach((n, i) => {
NODE_TO_INDEX.set(n, i);
NODE_TO_PARENT.set(n, node);
});
return node.children.map((n, i) =>
Text.isText(n)
? renderTextComponent(n, i, decorationsByChild[i])
: renderElementComponent(n, i, decorationsByChild[i])
);
};
事件处理系统
Editable组件实现了完整的事件处理机制,确保用户交互能够正确映射到编辑器操作:
| 事件类型 | 处理机制 | 性能优化 |
|---|---|---|
onDOMBeforeInput |
原生InputEvent处理 | 防抖和节流 |
onDOMSelectionChange |
监听原生selectionchange | 异步批量处理 |
| 键盘事件 | 快捷键映射和命令执行 | 事件委托 |
| 鼠标事件 | 选择状态管理和拖拽处理 | 状态标记 |
状态同步机制
Editable组件通过React Context和自定义Hooks实现了编辑器状态的高效同步:
// 状态同步的核心实现
const Editable = forwardRef((props: EditableProps, forwardedRef) => {
const editor = useSlate();
const [, forceRender] = useReducer(s => s + 1, 0);
// 注册强制渲染函数
EDITOR_TO_FORCE_RENDER.set(editor, forceRender);
// 更新只读状态
IS_READ_ONLY.set(editor, readOnly);
// 自动聚焦处理
useEffect(() => {
if (ref.current && autoFocus) {
ref.current.focus();
}
}, [autoFocus]);
});
性能优化策略
Editable组件采用了多种性能优化技术来确保大型文档的流畅编辑体验:
- 块级渲染优化:通过
chunkSize配置实现大型文档的分块渲染 - 装饰器缓存:使用mutable refs缓存装饰器计算结果
- 选择性重渲染:仅在实际变化的子节点上触发重渲染
- DOM操作批量处理:使用deferred operations队列
sequenceDiagram
participant User
participant Editable
participant useChildren
participant ElementComponent
participant ReactDOM
User->>Editable: 输入内容
Editable->>useChildren: 更新装饰器
useChildren->>ElementComponent: 传递新props
ElementComponent->>ReactDOM: 调度渲染
ReactDOM->>Editable: 完成渲染
Editable->>User: 显示更新
自定义渲染扩展
Editable组件提供了完整的自定义渲染接口,允许开发者完全控制编辑器的视觉表现:
// 自定义渲染配置示例
<Editable
renderElement={({ element, children, attributes }) => {
switch (element.type) {
case 'block-quote':
return <blockquote {...attributes}>{children}</blockquote>;
case 'bulleted-list':
return <ul {...attributes}>{children}</ul>;
default:
return <div {...attributes}>{children}</div>;
}
}}
renderLeaf={({ leaf, children, attributes }) => {
if (leaf.bold) {
return <strong {...attributes}>{children}</strong>;
}
return <span {...attributes}>{children}</span>;
}}
/>
跨平台兼容性
Editable组件针对不同浏览器和设备进行了深度优化:
| 平台/浏览器 | 特殊处理 | 兼容性策略 |
|---|---|---|
| Android | 输入法管理 | AndroidInputManager |
| iOS | 合成事件处理 | 特殊composition事件 |
| Chrome | 选择处理优化 | 原生API兼容 |
| Firefox | 焦点管理 | 自定义焦点逻辑 |
通过这种深度集成,Slate的Editable组件不仅提供了强大的编辑功能,还确保了在各种React应用场景下的高性能和稳定性。其模块化的设计使得开发者可以根据具体需求进行定制和扩展,同时保持了核心功能的稳定性和一致性。
useSlate、useFocused等React Hook的使用技巧
Slate React提供了一系列精心设计的React Hook,这些Hook是构建现代化富文本编辑器的核心工具。它们不仅简化了编辑器状态的访问,还提供了性能优化的机制。让我们深入探讨这些Hook的使用技巧和最佳实践。
useSlate:响应式编辑器实例访问
useSlate Hook是获取编辑器实例的主要方式,它会在编辑器状态变化时自动触发组件重新渲染。这对于需要实时响应编辑器变化的组件非常有用。
import { useSlate } from 'slate-react'
const FormatButton = () => {
const editor = useSlate()
// 编辑器状态变化时自动重新渲染
const hasSelection = Boolean(editor.selection)
return (
<button disabled={!hasSelection}>
格式化文本
</button>
)
}
使用技巧:
- 在工具栏按钮、浮动菜单等需要实时反映编辑器状态的组件中使用
- 避免在大型组件中使用,因为每次编辑器变化都会触发重新渲染
- 结合
useCallback和useMemo来优化性能
useSlateStatic:静态编辑器实例访问
与useSlate不同,useSlateStatic返回的编辑器实例不会在状态变化时触发重新渲染。这适用于只需要访问编辑器方法而不关心状态变化的场景。
import { useSlateStatic } from 'slate-react'
const SaveButton = () => {
const editor = useSlateStatic()
const handleSave = () => {
// 使用编辑器方法但不关心状态变化
const content = JSON.stringify(editor.children)
localStorage.setItem('content', content)
}
return <button onClick={handleSave}>保存</button>
}
性能优化场景:
- 只在用户交互时执行的操作
- 不依赖于当前编辑器状态的工具函数
- 事件处理程序中的编辑器操作
useFocused:编辑器焦点状态管理
useFocused Hook提供了编辑器是否获得焦点的状态信息,这对于条件渲染和用户体验优化至关重要。
import { useFocused } from 'slate-react'
const Placeholder = () => {
const focused = useFocused()
const isEmpty = // 检查内容是否为空
return (
<div style={{
opacity: focused || !isEmpty ? 0 : 0.5,
transition: 'opacity 0.2s ease-in-out'
}}>
请输入内容...
</div>
)
}
实用场景:
- 条件显示placeholder文本
- 焦点相关的样式变化
- 键盘快捷键的启用/禁用
useSlateSelector:精细化状态选择
useSlateSelector是性能优化的关键工具,它允许你选择编辑器的特定状态片段,只有当选中的状态发生变化时才触发重新渲染。
import { useSlateSelector } from 'slate-react'
const WordCount = () => {
const wordCount = useSlateSelector(editor => {
return Editor.string(editor, []).split(/\s+/).filter(Boolean).length
})
return <span>字数: {wordCount}</span>
}
const SelectionInfo = () => {
const hasSelection = useSlateSelector(
editor => Boolean(editor.selection),
// 自定义相等性检查函数
(prev, next) => Boolean(prev) === Boolean(next)
)
return <span>{hasSelection ? '有选中' : '无选中'}</span>
}
优化策略:
flowchart TD
A[编辑器状态变化] --> B{useSlateSelector}
B --> C[执行selector函数]
C --> D[获取新值]
D --> E{新值 === 旧值?}
E -->|是| F[跳过重新渲染]
E -->|否| G[触发重新渲染]
Hook组合使用模式
在实际开发中,经常需要组合使用多个Hook来实现复杂的功能:
const SmartToolbar = () => {
const editor = useSlate()
const focused = useFocused()
const hasSelection = useSlateSelector(
editor => !Range.isCollapsed(editor.selection)
)
const isActive = focused && hasSelection
return (
<div style={{
opacity: isActive ? 1 : 0,
pointerEvents: isActive ? 'auto' : 'none'
}}>
<FormatButtons />
</div>
)
}
性能最佳实践表
| Hook类型 | 重新渲染触发条件 | 适用场景 | 性能影响 |
|---|---|---|---|
useSlate |
任何编辑器状态变化 | 实时UI更新 | 高 |
useSlateStatic |
永不重新渲染 | 工具函数、事件处理 | 无 |
useSlateSelector |
选定状态变化时 | 精细化状态监听 | 低 |
useFocused |
焦点状态变化时 | 焦点相关UI | 中 |
高级模式:自定义Hook封装
对于复杂的编辑器功能,推荐封装自定义Hook:
const useEditorState = () => {
const editor = useSlate()
const focused = useFocused()
const selection = useSlateSelector(editor => editor.selection)
const content = useSlateSelector(editor => editor.children)
return {
editor,
focused,
hasSelection: Boolean(selection),
isEmpty: content.length === 1 &&
content[0].type === 'paragraph' &&
!content[0].children[0].text
}
}
// 使用自定义Hook
const EditorStatus = () => {
const { focused, hasSelection, isEmpty } = useEditorState()
return (
<div>
<span>焦点: {focused ? '有' : '无'}</span>
<span>选中: {hasSelection ? '有' : '无'}</span>
<span>空文档: {isEmpty ? '是' : '否'}</span>
</div>
)
}
通过合理使用这些React Hook,你可以构建出既功能丰富又性能优异的富文本编辑器组件。记住选择正确的Hook对于应用性能至关重要,特别是在处理大型文档或复杂编辑场景时。
自定义元素渲染与样式控制的实战案例
在Slate React集成中,自定义元素渲染和样式控制是构建现代化富文本编辑器的核心能力。通过灵活的渲染机制和细粒度的样式控制,开发者可以创建出高度定制化的编辑体验。本节将通过多个实战案例,深入探讨如何实现自定义元素渲染和样式控制。
基础元素渲染模式
Slate通过renderElement属性提供了完全自定义的元素渲染能力。最基本的模式是使用switch语句根据元素类型进行条件渲染:
const renderElement = useCallback(({ attributes, children, element }) => {
switch (element.type) {
case 'heading-one':
return <h1 {...attributes}>{children}</h1>
case 'heading-two':
return <h2 {...attributes}>{children}</h2>
case 'block-quote':
return <blockquote {...attributes}>{children}</blockquote>
case 'numbered-list':
return <ol {...attributes}>{children}</ol>
case 'bulleted-list':
return <ul {...attributes}>{children}</ul>
case 'list-item':
return <li {...attributes}>{children}</li>
default:
return <p {...attributes}>{children}</p>
}
}, [])
这种模式简单直观,适合处理基本的块级元素。但实际项目中,我们往往需要更复杂的渲染逻辑和样式控制。
表格组件的完整实现
表格是富文本编辑器中常见的复杂组件。Slate的嵌套文档模型完美支持表格结构:
const Element = ({ attributes, children, element }) => {
switch (element.type) {
case 'table':
return (
<table
className={css`
position: relative;
border-collapse: collapse;
width: 100%;
margin: 16px 0;
`}
>
<tbody {...attributes}>{children}</tbody>
</table>
)
case 'table-row':
return (
<tr
{...attributes}
className={css`
border-bottom: 1px solid #e0e0e0;
`}
>
{children}
</tr>
)
case 'table-cell':
return (
<td
{...attributes}
className={css`
padding: 8px;
border: 1px solid #e0e0e0;
vertical-align: top;
min-width: 100px;
`}
>
{children}
</td>
)
default:
return <p {...attributes}>{children}</p>
}
}
表格的数据结构需要精心设计:
const initialTableValue = [
{
type: 'table',
children: [
{
type: 'table-row',
children: [
{
type: 'table-cell',
children: [{ text: 'Header 1', bold: true }],
},
{
type: 'table-cell',
children: [{ text: 'Header 2', bold: true }],
},
],
},
{
type: 'table-row',
children: [
{
type: 'table-cell',
children: [{ text: 'Cell 1' }],
},
{
type: 'table-cell',
children: [{ text: 'Cell 2' }],
},
],
},
],
}
]
代码高亮组件的深度定制
代码块是技术文档中必不可少的元素。Slate结合Prism.js可以实现强大的代码高亮功能:
const CodeBlockElement = ({ attributes, children, element }) => {
const editor = useSlateStatic()
const setLanguage = (language: string) => {
const path = ReactEditor.findPath(editor, element)
Transforms.setNodes(editor, { language }, { at: path })
}
return (
<div
{...attributes}
className={css`
font-family: 'Monaco', 'Menlo', monospace;
font-size: 14px;
line-height: 1.5;
background: #f6f8fa;
border-radius: 6px;
padding: 16px;
margin: 16px 0;
position: relative;
overflow: auto;
`}
spellCheck={false}
>
<select
contentEditable={false}
className={css`
position: absolute;
right: 8px;
top: 8px;
z-index: 1;
background: white;
border: 1px solid #d0d7de;
border-radius: 4px;
padding: 4px 8px;
font-size: 12px;
`}
value={element.language || 'javascript'}
onChange={(e) => setLanguage(e.target.value)}
>
<option value="javascript">JavaScript</option>
<option value="typescript">TypeScript</option>
<option value="html">HTML</option>
<option value="css">CSS</option>
<option value="python">Python</option>
</select>
{children}
</div>
)
}
高亮装饰器的实现需要处理语法标记:
const decorateCodeBlock = ([block, blockPath]) => {
const text = block.children.map(line => Node.string(line)).join('\n')
const tokens = Prism.tokenize(text, Prism.languages[block.language])
const decorations = []
// 处理语法标记并创建装饰范围
tokens.forEach((token, index) => {
if (typeof token === 'string') {
return
}
const start = // 计算起始位置
const end = start + token.content.length
decorations.push({
anchor: { path: [...blockPath, lineIndex, 0], offset: start },
focus: { path: [...blockPath, lineIndex, 0], offset: end },
[token.type]: true
})
})
return decorations
}
内联元素的样式控制
内联元素如链接、提及等需要特殊的样式处理:
const InlineElement = ({ attributes, children, element }) => {
switch (element.type) {
case 'link':
return (
<a
{...attributes}
href={element.url}
className={css`
color: #0366d6;
text-decoration: none;
&:hover {
text-decoration: underline;
}
`}
onClick={(e) => {
e.preventDefault()
window.open(element.url, '_blank')
}}
>
{children}
</a>
)
case 'mention':
return (
<span
{...attributes}
className={css`
background: #e3f2fd;
color: #1976d2;
padding: 2px 6px;
border-radius: 12px;
font-weight: 500;
margin: 0 2px;
`}
contentEditable={false}
>
@{element.user}
</span>
)
default:
return <span {...attributes}>{children}</span>
}
}
叶子级别的文本样式控制
文本级别的格式化通过renderLeaf实现,支持细粒度的样式控制:
const renderLeaf = useCallback(({ attributes, children, leaf }) => {
let style: React.CSSProperties = {}
if (leaf.bold) {
style.fontWeight = 'bold'
}
if (leaf.italic) {
style.fontStyle = 'italic'
}
if (leaf.underline) {
style.textDecoration = 'underline'
}
if (leaf.strikethrough) {
style.textDecoration = 'line-through'
}
if (leaf.code) {
style.fontFamily = 'monospace'
style.backgroundColor = '#f6f8fa'
style.padding = '2px 4px'
style.borderRadius = '3px'
style.fontSize = '0.9em'
}
if (leaf.color) {
style.color = leaf.color
}
if (leaf.backgroundColor) {
style.backgroundColor = leaf.backgroundColor
}
return (
<span
{...attributes}
style={style}
className={css`
// 额外的CSS样式
`}
>
{children}
</span>
)
}, [])
响应式设计的样式适配
现代编辑器需要支持响应式设计,适应不同屏幕尺寸:
const ResponsiveElement = ({ attributes, children, element }) => {
const isMobile = useMediaQuery('(max-width: 768px)')
const getElementStyle = () => {
const baseStyle = {
margin: '8px 0',
lineHeight: 1.6
}
if (isMobile) {
return {
...baseStyle,
fontSize: '16px',
padding: '8px'
}
}
return {
...baseStyle,
fontSize: '18px',
padding: '12px'
}
}
return (
<div {...attributes} style={getElementStyle()}>
{children}
</div>
)
}
主题系统的实现
通过CSS变量和Context实现主题系统:
const ThemeContext = React.createContext({})
const ThemedElement = ({ attributes, children, element }) => {
const theme = useContext(ThemeContext)
return (
<div
{...attributes}
className={css`
color: var(--text-color, ${theme.textColor});
background: var(--bg-color, ${theme.backgroundColor});
border: 1px solid var(--border-color, ${theme.borderColor});
border-radius: ${theme.borderRadius}px;
padding: ${theme.spacing}px;
margin: ${theme.spacing / 2}px 0;
&:hover {
border-color: var(--hover-border-color, ${theme.hoverBorderColor});
}
`}
>
{children}
</div>
)
}
性能优化的渲染策略
对于复杂组件,需要采用性能优化策略:
const OptimizedElement = React.memo(({ attributes, children, element }) => {
// 使用React.memo避免不必要的重渲染
return (
<div {...attributes} className={elementClassName}>
{children}
</div>
)
}, (prevProps, nextProps) => {
// 自定义比较函数,只在必要时重渲染
return (
prevProps.element === nextProps.element &&
prevProps.children === nextProps.children
)
})
// 使用useCallback缓存渲染函数
const renderElement = useCallback((props) => {
return <OptimizedElement {...props} />
}, [])
动态样式的状态管理
结合编辑器状态实现动态样式:
const DynamicStyledElement = ({ attributes, children, element }) => {
const editor = useSlate()
const isSelected = useSelected()
const isFocused = useFocused()
const getDynamicStyle = () => {
const baseStyle = {
transition: 'all 0.2s ease',
border: '2px solid transparent'
}
if (isSelected && isFocused) {
return {
...baseStyle,
borderColor: '#007acc',
backgroundColor: '#f0f8ff'
}
}
return baseStyle
}
return (
<div {...attributes} style={getDynamicStyle()}>
{children}
</div>
)
}
通过这些实战案例,我们可以看到Slate React在自定义元素渲染和样式控制方面的强大能力。从简单的文本格式化到复杂的表格和代码块,从基本的样式应用到高级的主题系统和性能优化,Slate提供了完整的解决方案来构建现代化、高度定制化的富文本编辑器。
Slate-React通过精心的架构设计和深度React集成,为开发者提供了构建现代化富文本编辑器的完整解决方案。其核心优势体现在:分层架构设计确保状态管理的可靠性,Hook系统提供精细化的性能控制,自定义渲染机制支持高度定制化的UI表现,跨平台兼容性保障多环境稳定运行。通过本文介绍的实战案例和优化策略,开发者可以充分利用Slate-React的强大能力,创建出既功能丰富又性能优异的富文本编辑器,满足各种复杂的业务场景需求。Slate-React的成功实践证明了声明式UI与编辑器技术的完美结合,为前端富文本编辑领域树立了新的技术标杆。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00