npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

wxl-note

v0.0.53

Published

A high-performance rich text editor that supports multiplayer online collaboration.

Readme

WxlNote

WxlNote 是基于XNote的无头、高性能、与框架无关的富文本编辑器,支持多人在线协作。提供了丰富的现代文档编辑功能。

WxlNote 底层依赖于开源富文本框架 Textbus 和前端视图 Viewfly。因此,你可以在此基础上继续扩展自己的功能。

在线演示

在线演示

安装

npm install wxl-note katex

使用

import 'katex/dist/katex.min.css'
import { Editor } from 'wxl-note'

const editor = new Editor()
editor.mount(document.getElementById('editor')).then(() => {
  console.log('编辑器准备完成。')
})

文件上传

要实现文件上传需实现 FileUploader 接口

import { FileUploader } from 'wxl-note'

class YourUploader extends FileUploader {
  uploadFile(type: string): string | Promise<string> {
    if (type === 'image') {
      return 'imageUrl'
    }
    if (type === 'video') {
      return 'videoUrl'
    }
  }
}

const editor = new Editor({
  providers: [{
    provide: FileUploader,
    useFactory() {
      return new YourFileUplader()
    }
  }]
})

粘贴图片 Base64 转 URL

import { Commander } from '@textbus/core'
import { Injectable } from '@viewfly/core'
import { ImageComponent } from 'wxl-note'

@Injectable()
class YourCommander extends Commander {
  paste(slot: Slot, text: string) {
    slot.sliceContent().forEach(content => {
      if (content instanceof ImageComponent) {
        const base64 = content.state.url
        // base64 转 url,请自行实现
        content.state.url = 'https://xxx.com/xxx.jpg'
      }
    })
    
    // 待图片转换完成后,可调用超类的 paste 方法
    super.paste(slot, text)
    return true
  }
}

const editor = new Editor({
  providers: [{
    provide: Commander,
    useClass: YourCommander
  }]
})

获取 HTML

const html = editor.getHTML()

设置初始 HTML

const editor = new Editor({
  content: '<div>HTML 内容</div>'
})

更新编辑器内容, 支持 Markdown 格式

editor.setContent('<p>你好!</p>')
editor.setMarkdown('#你好!')

获取 Markdown 格式内容

const markdown = editor.getMarkdown()

获取 标题列表用于目录滚动定位

const titles = editor.getHeadings()
editor.scrollToHeading(titles[0].id)
// 也可自行实现滚动定位功能
// element.scrollIntoView({ behavior: 'smooth', block: 'start' })

@ 人

在文档中 @ 人功能需实现以下接口,以对接用户信息

export abstract class Organization {
  abstract getMembers(name?: string): Promise<Member[]>

  abstract atMember(member: Member): void
}

然后在编辑器初始化时传入你的实现

const editor = new Editor({
  providers: [{
    provide: Organization,
    useValue: new YourOrganization()
  }]
})

自定义 AI 写作工具

// 初始化状态下设置 aiOptions 配置 ,用于自定义 AI 写作工具的 UI 和回调
const aiOptions = {
  uiConfig: {
    placeholder: '请输入要撰写的内容...',
    placeholder2: '请输入重写内容...',
    loadingText: '加载中...',
    actionOptions: [
      {
        value: 'enhance',
        label: '润色',
        iconName: 'EnhanceIcon'
      },
      {
        value: 'expand',
        label: '扩写',
        iconName: 'ExpandIcon',
      },
      {
        value: 'shrink',
        label: '缩写',
        iconName: 'ShrinkIcon',
      },
    ]
  },
  callbacks: {
    callAIAction: (text: string, action: string, callback: (result: string, isEnd?: boolean) => void) => {},
    sendAIMessage: (text: string, action: string, callback: (result: string, isEnd?: boolean) => void) => {},
    onClose: () => {}
  }
}
new InlineToolbarPlugin({
        aiOptions
      })

协作支持

Textbus 天然支持协作,只需要在编辑器配置项中添加协作配置信息即可,具体配置你可以参考 https://textbus.io/guide/collab/

const editor = new Editor({
  collaborateConfig: {
    userinfo: user, // 用户信息
    createConnector(yDoc): SyncConnector {
      // 返回连接器
      return new YWebsocketConnector('wss://example.com', 'docName', yDoc)
    }
  }
})