Meta的开源力作:Lexical框架,富文本的未来

image

引言

Lexical 是一个由 Facebook(现在称为 Meta)开源的可扩展 JavaScript Web 文本编辑器框架。

这个框架特别强调了三个核心特性:可靠性、可访问性以及高性能。

旨在为开发者创造最优的开发体验。

以下是 Lexical 框架的几个关键特点和能力:

可扩展性

Lexical 的设计允许开发者轻松地创建从简单到极为复杂的文本编辑器。

其架构高度可扩展,意味着你可以根据需求添加自定义功能,比如富文本格式、Markdown 支持、自定义UI组件(如工具栏)等,而这一切都可以通过扩展插件来实现。

可靠性

框架的核心关注点之一是确保编辑器在各种条件下都能稳定工作,减少崩溃或数据丢失的风险,这对于提升用户体验至关重要。

可访问性

Lexical 内置了对可访问性的支持,确保创建的编辑器能够被广泛的用户群体所使用,包括那些依赖辅助技术的用户。

高性能

优化的内部机制使得 Lexical 能够处理大规模的文本编辑任务而不牺牲响应速度,这对于提升用户交互体验非常关键。

与React集成

虽然 Lexical 并不仅限于 React,但它提供了与 React 深度集成的能力,使得在 React 应用中使用Lexical变得非常直接。同时,理论上它也可以支持任何基于DOM的前端库,只要有相应的绑定实现。

开发者体验

Lexical 致力于简化开发流程,让开发者能够快速原型设计并充满信心地构建功能。这包括清晰的文档、丰富的示例代码以及易于理解的 API 设计。

模块化和可定制

框架的模块化设计意味着你可以按需加载功能,只引入你真正需要的部分,从而保持最终应用的轻量级。

Lexical 的核心尽量做到最小化。

Lexical 并不直接关注单体编辑器倾向于做的事情——例如 UI 组件、工具栏或富文本功能。

相反,这些功能的逻辑可以通过插件接口包含在内,并在需要时使用。

这确保了极大的可扩展性并将代码大小保持在最低限度。

github:https://github.com/facebook/lexical

官方 playground 预览:
在这里插入图片描述

功能介绍

基本功能

基本功能包括:多级标题字体撤销回退字体大小加粗斜体链接字体颜色字体背景图片表格待办有序列表无序列表水平线引用

特色功能

分页
image

DOM结构树(命令模式)

image

绘图

image

便签

image

安装

React

React放第一是因为官方在UI层已基于React封装好了所有的组件,开箱即用。

安装 lexical 核心包与 lexical/react 扩展包:

npm install --save lexical @lexical/react

创建一个 React 组件,添加如下内容:

    import {$getRoot, $getSelection} from 'lexical';
    import {useEffect} from 'react';

    import {AutoFocusPlugin} from '@lexical/react/LexicalAutoFocusPlugin';
    import {LexicalComposer} from '@lexical/react/LexicalComposer';
    import {RichTextPlugin} from '@lexical/react/LexicalRichTextPlugin';
    import {ContentEditable} from '@lexical/react/LexicalContentEditable';
    import {HistoryPlugin} from '@lexical/react/LexicalHistoryPlugin';
    import {LexicalErrorBoundary} from '@lexical/react/LexicalErrorBoundary';

    function onError(error) {
      console.error(error);
    }

    function Editor() {
      const initialConfig = {
        namespace: 'MyEditor',
        theme:{
    		// 自定义各组件样式名
    	},
        onError,
      };

      return (
        <LexicalComposer initialConfig={initialConfig}>
          <RichTextPlugin
            contentEditable={<ContentEditable />}
            placeholder={<div>请输入内容...</div>}
            ErrorBoundary={LexicalErrorBoundary}
          />
          <HistoryPlugin />
          <AutoFocusPlugin />
        </LexicalComposer>
      );
    }

这里还有个坑,如果大家在这时通过浏览器预览组件,会发现页面上就只有一个输入框。

这是因为官方团队并未将 lexical 需要的全局 css样式 封装进组件,需要大家手动添加,样式文件地址:

https://github.com/facebook/lexical/blob/main/packages/lexical-playground/src/index.css

这里在列举一些常用组件,大家可以按需引入:

<ToolbarPlugin /> // 工具栏
<DragDropPaste /> // 拖放粘贴
<AutoFocusPlugin /> // 自动聚焦
<AutoLinkPlugin /> // 自动链接
<ListPlugin /> // 列表
<CheckListPlugin /> // 代办
<CodeHighlightPlugin /> // 代码块
<TabIndentationPlugin /> // 缩进
<LinkPlugin /> // 链接
<HorizontalRulePlugin /> // 水平线
<PageBreakPlugin /> // 翻页
<ImagesPlugin /> // 图片
<TablePlugin /> // 表格

上述提到的组件均可在 lexical-playground 中找到,附上地址:

https://github.com/facebook/lexical/blob/main/packages/lexical-playground

效果如下:

image

Vue

官方并没有提供 Vue 版本,不过在 github 上已经有开发者使用 TS 完成了其 Vue 版本的基础封装。

github: https://github.com/wobsoriano/lexical-vue

安装:

npm install lexical lexical-vue # or pnpm or yarn

组件的使用都大同小异,这里省略了部分,仅保留核心代码示意:

    <script setup lang="ts">
    import {
      ...
      LexicalRichTextPlugin,
    } from 'lexical-vue'
    </script>

    <template>
      <ToolbarPlugin />
      <div class="editor-container">
        <div className="editor-inner">
          <LexicalRichTextPlugin>
            <template #contentEditable>
              <div class="editor-scroller">
                <div class="editor">
                  <ContentEditable />
                </div>
              </div>
            </template>
            <template #placeholder>
              <div class="editor-placeholder">
                Enter some text...
              </div>
            </template>
        </div>
      </div>
    </template>

vue版本的 playground 地址:

https://github.com/wobsoriano/lexical-vue/tree/main/playground

原生JS

使用原生JS需要自己来完成UI层的所有工作,如果大家在UI上没有定制化需求,不建议使用原生。

这里附上原生接入方式;https://lexical.dev/docs/getting-started/quick-start

扩展

Lexical 的核心在于其插件架构。

每个功能(如自动完成、拼写检查、格式化等)通常都是作为插件存在的。

开发者可以通过创建或修改插件来增加新功能或调整现有行为。

创建自定义插件

定义插件类:首先,你需要创建一个新的插件类,继承自 Lexical 提供的基类,如 LexicalPlugin

实现生命周期方法:大多数插件需要实现特定的生命周期方法,如初始化(initialize)订阅编辑器事件(subscribe)清理(dispose)

注册插件:在编辑器实例化时,通过编辑器的配置选项将你的插件注册进去。

这里提供一个官方的React扩展示例:

function MyOnChangePlugin({ onChange }) {
  const [editor] = useLexicalComposerContext();
  useEffect(() => {
    return editor.registerUpdateListener(({editorState}) => {
      onChange(editorState);
    });
  }, [editor, onChange]);
  return null;
}

function Editor() {
  // ...
  const [editorState, setEditorState] = useState();
  function onChange(editorState) {
    const editorStateJSON = editorState.toJSON();
    setEditorState(JSON.stringify(editorStateJSON));
  }

  return (
    <LexicalComposer initialConfig={initialConfig}>
      {/*...*/}
      <MyOnChangePlugin onChange={onChange}/>
    </LexicalComposer>
  );

总结

我们介绍了 lexicalReactVue原生JS的安装,并按照接入的难易程度推荐了使用方式,然后了解基本的插件扩展流程,相信大家对lexical已经有了一定的了解。

本文是对Lexical的基本介绍,所以文中并未提到lexical中例如核心生命周期、事件的派发与注册、协同扩展等,大家在需要的场景可自行研究。

– 欢迎点赞、关注、转发、收藏【我码玄黄】,gonghao同名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/676851.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

广东肇庆mes系统服务商 盈致科技

广东肇庆MES系统服务商盈致科技为企业提供专业的MES系统解决方案&#xff0c;帮助企业实现生产过程的数字化管理和优化。盈致科技的服务包括但不限于以下方面&#xff1a;MES系统定制开发&#xff1a;盈致科技可以根据企业的实际需求定制开发MES系统&#xff0c;满足企业特定的…

OJ题讲解——栈与队列

目录 一.有效的括号 1.问题描述 2.问题详解 3.代码 二.用队列实现栈 1.问题描述 2.问题详解 3.代码 三.用栈实现队列 1.问题描述 2.问题详解 3.代码 四.设计循环队列 1.问题描述 2.问题详解 3.代码 一.有效的括号 1.问题描述 OJ链接&#xff1a;. - 力扣&…

归并排序(分治)

归并排序 概念介绍原理解释&#xff1a;案例步骤&#xff1a;稳定性&#xff1a;画图理解如下 代码实现 概念介绍 归并排序&#xff08;Merge Sort&#xff09;是一种经典的排序算法&#xff0c;基于分治的思想&#xff0c;它将待排序数组分成两个子数组&#xff0c;分别排序&…

基于Python+django购物商城系统设计和实现(源码+LW+部署文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

iPhone的5G设置怎么更改吗?设置好这些能够优化电池的使用寿命

随着5G技术的普及&#xff0c;iPhone用户现在可以享受到更快的网络速度&#xff0c;但这同时也带来了一个问题&#xff1a;如何在使用5G和保持电池寿命之间找到平衡&#xff1f;苹果公司通过引入“5G Auto”设置&#xff0c;为用户提供了一个智能的解决方案&#xff0c;但用户也…

3D模型轻量化:无损精度和细节,轻量化处理3D模型的云原生工具

随着科技的不断发展&#xff0c;三维模型在各个领域的应用愈加广泛。然而&#xff0c;传统的CAD工具生成的模型往往包含大量的面片和数据&#xff0c;这在进行模型查看、分享、协作以及在线展示时带来了诸多不便。模型文件过大不仅导致传输速度慢&#xff0c;还可能因为文件格式…

移远通信携手高通,共启智能出行新时代

5月30-31日&#xff0c;2024高通汽车技术与合作峰会在无锡国际会议中心举行。作为高通“汽车朋友圈”的重要一员&#xff0c;移远通信应邀参会&#xff0c;展示了数十款基于高通平台打造的车载蜂窝通信模组、C-V2X模组、智能座舱模组、Wi-Fi/蓝牙模组&#xff0c;适配高通多个平…

「实战应用」如何用图表控件LightningChart JS创建SQL仪表板应用(一)

LightningChart JS是Web上性能特高的图表库&#xff0c;具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用&#xff0c;从而实现高刷新率和流畅的动画&#xff0c;常用于贸易&#xff0c;工程&#xff0c;航…

c++ - priority_queue使用和模拟实现

文章目录 一、priority_queue接口使用二、 priority_queue模拟实现三、模拟代码总览 一、priority_queue接口使用 1、函数接口与作用 接口作用priority_queue< T >构造一个空优先队列priority_queue< T >(迭代区间)通过迭代区间构造一个优先队列push(val)val入队…

计算机视觉与模式识别实验2-1 角点检测算法(Harris,SUSAN,Moravec)

文章目录 &#x1f9e1;&#x1f9e1;实验流程&#x1f9e1;&#x1f9e1;Harris算法SUSAN算法Moravec算法 &#x1f9e1;&#x1f9e1;全部代码&#x1f9e1;&#x1f9e1; &#x1f9e1;&#x1f9e1;实验流程&#x1f9e1;&#x1f9e1; Harris算法 Harris算法实现步骤&…

数据容器的通用操作、字符串大小比较 总结完毕!

1.数据容器的通用操作 1&#xff09;五类数据容器是否都支持while循环/for循环 五类数据容器都支持for循环遍历 列表、元组、字符串都支持while循环&#xff0c;集合、字典不支持&#xff08;无法下标索引&#xff09; 尽管遍历的形式不同&#xff0c;但都支持遍历操作 2&a…

在电脑端实现多个微信同时登录[使用bat脚本登录]

在电脑端实现多个微信同时登录[使用bat脚本登录] 我认为工作和生活应该分开进行&#xff0c;但往往不尽人意。 第一步&#xff0c;找到微信启动程序地址。 第二步 创建txt文本&#xff0c;写入start 你的微信启动程序地址。 start D:\微信文件\WeChat\WeChat.exe start D:\微…

The First项目报告:一场由社区驱动的去中心化加密冒险—Turbo

2023年3月14日&#xff0c;由OpenAI公司开发自回归语言模型GPT-4发布上线&#xff0c;一时之间引发AI智能领域的轩然大波&#xff0c;同时受到影响的还有加密行业&#xff0c;一众AI代币纷纷出现大幅度拉升。与此同时&#xff0c;一款名为Turbo的Meme代币出现在市场中&#xff…

在美育浸润中成长 ——中山市光后中心小学张峻皓书画作品毕业汇报展成功举办

5 月 30 号下午 3 点&#xff0c;“在美育浸润中成长——广东省中山市光后中心小学张峻皓书画作品毕业汇报展”在中山市三乡镇光后中心小学成功举行&#xff0c;本次共展出张峻皓同学近期创作书法、国画及陶瓷作品共计78幅。 广东省中山市文联兼职副主席、中山市书法家协会主席…

【距离四六级只剩一个星期!】刘晓艳四级保命班课程笔记(1)(可分享治资料~)

大家好&#xff01;距离四级考试也就只剩下一个星期左右了&#x1f635;‍&#x1f4ab;。我也是时候好好补一补四级了&#xff0c;总不能还是不过吧&#x1f62d;&#xff08;已经考了两次了&#xff09;&#xff0c;这次我一定过过过过过过&#xff0c;大家也一定要过&#x…

若依前后端分离Spring Security新增手机号登录

备忘贴 转自&#xff1a;【若依RuoYi短信验证码登录】汇总_数据库_z_xiao_qiang-RuoYi 若依 配置Security: 按照Security的流程图可知&#xff0c;实现多种方式登录&#xff0c;只需要重写三个主要的组件&#xff0c;第一个用户认证处理过滤器&#xff0c;第二个用户认证tok…

Linux Shell脚本编写指南

大家好&#xff0c;在当今快节奏的科技时代&#xff0c;自动化和高效的工作流程对于个人和组织来说变得愈发重要。而Shell脚本编写作为一种强大且广泛应用的技能&#xff0c;成为了实现自动化任务和系统管理的利器。通过编写Shell脚本&#xff0c;我们可以将繁琐的重复任务自动…

【Matplotlib作图-4.Distribution】50 Matplotlib Visualizations, Python实现,源码可复现

目录 04 Distribution 4.0 Prerequisite 4.1 连续变量的直方图(Histogram for Continuous Variable) 4.2 分类变量的直方图(Histogram for Categorical Variable) 4.3 Density Plot 4.4 Density Curves with Histogram 4.5 Joy Plot 4.6 Distributed Dot Plot 4.7 Box P…

前端 video 实现全屏播放

只需要加上这句代码就行 controls <videoid"myVideo":src"detailDate.linkAddress":poster"detailDate.pictureUrl"enable-danmucontrolswebkit-playsinline"true"></video>

绘画参数配置及使用

绘画参数配置及使用 路径&#xff1a;站点后台-功能-AI绘画 进入参数配置 接口选择&#xff1a;多种接口自主选择&#xff08;需自己准备key&#xff09;&#xff0c;对应接口的key对话和绘画通用 存储空间&#xff1a; 位置在超管后台-存储空间 自主选择存储&#xff08;需…