@crosscopy/clipboard

中文文档
0.3.6发布于 2026/02/09MITTypeScriptCommonJS零依赖构建来源已验证近 30 天下载 14.5万

节点剪贴板操作

中文使用文档
文档目录15 节
  1. 支持的格式
  2. 安装
  3. 快速开始
  4. API
  5. 纯文本
  6. HTML
  7. 富文本 (RTF)
  8. 图片
  9. 文件
  10. Buffer (自定义格式)
  11. 工具函数
  12. 剪贴板监听
  13. 平台支持
  14. 致谢
  15. 发布

Clipboard

NPM Version CI

NPM Package: https://www.npmjs.com/package/@crosscopy/clipboard

GitHub: https://github.com/crosscopy/clipboard

跨平台原生剪贴板库,适用于 Node.js。支持读取、写入和监听系统剪贴板,兼容多种数据格式。

支持的格式

  • 纯文本
  • HTML
  • 富文本 (RTF)
  • 图片 (PNG 二进制 / base64)
  • 文件
  • 任意二进制数据 (自定义格式字符串)

安装

npm install @crosscopy/clipboard
# 或
pnpm add @crosscopy/clipboard

快速开始

import {
  getText, setText,
  hasText, hasImage,
  getImageBase64,
  startWatch,
} from '@crosscopy/clipboard'

// 读写文本
await setText('hello world')
console.log(await getText()) // "hello world"

// 检查剪贴板内容类型
console.log(hasText())  // true
console.log(hasImage()) // false

// 监听剪贴板变化
const watcher = startWatch(() => {
  console.log('剪贴板内容已变化!')
})
// ... 之后停止监听
watcher.stop()

API

完整的类型声明请参阅 index.d.ts。

纯文本

函数签名说明
hasText() => boolean检查剪贴板是否包含文本
getText() => Promise<string>从剪贴板读取文本
setText(text: string) => Promise<void>将文本写入剪贴板
import { hasText, getText, setText } from '@crosscopy/clipboard'

await setText('已复制!')
if (hasText()) {
  console.log(await getText())
}

HTML

函数签名说明
hasHtml() => boolean检查剪贴板是否包含 HTML
getHtml() => Promise<string>从剪贴板读取 HTML 字符串
setHtml(html: string) => Promise<void>将 HTML 字符串写入剪贴板
import { setHtml, getHtml } from '@crosscopy/clipboard'

await setHtml('<b>粗体</b>')
console.log(await getHtml())

富文本 (RTF)

函数签名说明
hasRtf() => boolean检查剪贴板是否包含 RTF
getRtf() => Promise<string>从剪贴板读取 RTF 字符串
setRtf(rtf: string) => Promise<void>将 RTF 字符串写入剪贴板

图片

函数签名说明
hasImage() => boolean检查剪贴板是否包含图片
getImageBinary() => Promise<Array<number>>以 PNG 字节数组形式读取图片
getImageBase64() => Promise<string>以 base64 编码的 PNG 形式读取图片
setImageBinary(imageBytes: Array<number>) => Promise<void>将 PNG 字节数组写入剪贴板
setImageBase64(base64Str: string) => Promise<void>将 base64 编码的 PNG 写入剪贴板
import { hasImage, getImageBase64, setImageBinary } from '@crosscopy/clipboard'
import { readFileSync } from 'fs'

// 将 PNG 文件写入剪贴板
const png = readFileSync('screenshot.png')
await setImageBinary(Array.from(png))

// 以 base64 形式读取
if (hasImage()) {
  const b64 = await getImageBase64()
  console.log(`data:image/png;base64,${b64}`)
}

文件

函数签名说明
hasFiles() => boolean检查剪贴板是否包含文件引用
getFiles() => Promise<Array<string>>从剪贴板读取文件路径列表
setFiles(files: Array<string>) => Promise<void>将文件路径列表写入剪贴板
import { hasFiles, getFiles } from '@crosscopy/clipboard'

if (hasFiles()) {
  const paths = await getFiles()
  console.log(paths) // ["/Users/you/file.txt", ...]
}

Buffer (自定义格式)

函数签名说明
getBuffer(format: string) => Promise<Array<number>>按指定格式读取原始字节
setBuffer(format: string, buffer: Array<number>) => Promise<void>按指定格式写入原始字节
import { setBuffer, getBuffer } from '@crosscopy/clipboard'

await setBuffer('com.myapp.custom', [0x01, 0x02, 0x03])
const data = await getBuffer('com.myapp.custom')

工具函数

函数签名说明
availableFormats() => Array<string>列出剪贴板中当前所有的数据格式
clear() => Promise<void>清空剪贴板

剪贴板监听

使用操作系统原生通知机制监听剪贴板变化。

函数 / 方法签名说明
startWatch(callback: () => void) => ClipboardWatcherJs开始监听,返回监听句柄
watcher.stop()() => void停止监听
watcher.isRunningboolean (getter)监听器是否正在运行
import { startWatch, getText } from '@crosscopy/clipboard'

const watcher = startWatch(async () => {
  console.log('剪贴板已变化:', await getText())
})

console.log(watcher.isRunning) // true

// 不再需要时停止监听
watcher.stop()
console.log(watcher.isRunning) // false

监听器在后台线程中运行,使用操作系统原生的剪贴板变化事件,JavaScript 侧无需轮询。使用完毕后调用 stop() 释放资源。

平台支持

平台架构
macOSx64, arm64 (Apple Silicon), universal
Windowsx64, arm64
Linuxx64 (glibc)

致谢

发布

所有构建和发布流程由 GitHub Actions 完成。

执行 npm version patch 升级版本号,然后 git push --follow-tags 推送到 GitHub,GitHub Actions 会自动构建并发布。

版本与发布记录

@crosscopy/clipboard 共发布 21 个版本,首次发布于 2022/12/12;过去 12 个月发布了 4 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.3.6latest2026/02/099 个月前
0.3.52026/02/099 个月前
0.3.42026/02/099 个月前
0.3.32026/02/079 个月前
0.2.82024/05/022 年前
0.2.62024/04/132 年前

关于 @crosscopy/clipboard 的常见问题

@crosscopy/clipboard 是什么?

节点剪贴板操作

如何安装 @crosscopy/clipboard?

在项目目录运行 npm install @crosscopy/clipboard,或使用 pnpm add / yarn add / bun add。

@crosscopy/clipboard 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@crosscopy/clipboard 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@crosscopy/clipboard 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >= 10.20.0 < 11 || >= 12.17.0 < 13 || >= 14.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@crosscopy/clipboard 可以商用吗?

@crosscopy/clipboard 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@crosscopy/clipboard 的下载量有多少?

根据 npm 官方下载统计,@crosscopy/clipboard 在 2026/10/11 – 2026/11/09 这 30 天内被下载 145,210 次,日均约 4,840 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@crosscopy/clipboard 还在维护吗?

最新版本 0.3.6 发布于 2026/02/09(9 个月前);至今共发布 21 个版本,其中过去 12 个月发布了 4 个;首次发布于 2022/12/12。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。