clipboard、clipboard-polyfill、clipboardy、copy-paste はいずれもJavaScriptでクリップボードへのコピー・ペースト機能を実装するためのnpmパッケージですが、対応環境やAPI設計、使用目的が大きく異なります。clipboard と clipboard-polyfill は主にブラウザ向けで、現代的なClipboard APIやその代替手段を提供します。一方、clipboardy と copy-paste はNode.js環境での利用を想定しており、コマンドラインツールやサーバーサイドスクリプトでのクリップボード操作を可能にします。ただし、copy-paste パッケージは公式に非推奨(deprecated)となっており、新規プロジェクトでの使用は避けるべきです。
WebやNode.jsアプリで「コピー」機能を実装する際、どのnpmパッケージを使うべきか迷うことはありませんか?
clipboard、clipboard-polyfill、clipboardy、copy-paste はすべてクリップボード操作を目的としていますが、それぞれが異なる環境・要件・アプローチを持っています。
この記事では、実際のコードを交えながら、各パッケージの技術的特徴と選定基準を解説します。
まず大前提として、これらのパッケージは実行環境がまったく異なります。
clipboard, clipboard-polyfillclipboardy, copy-paste混同すると実行時にエラーになるため、最初に「どこで動かすか」を明確にしましょう。
clipboard は、古いブラウザでも動くことを前提に、DOM要素を介してコピーします。
内部で一時的な <textarea> を作成し、document.execCommand('copy') を呼び出します。
// clipboard: DOMベースのコピー
import Clipboard from 'clipboard';
// HTMLに data-clipboard-text="Hello" 付きのボタンが必要
const clipboard = new Clipboard('.btn');
clipboard.on('success', () => {
console.log('コピー成功!');
});
一方、clipboard-polyfill は、モダンな Async Clipboard API を中心に設計されています。
HTTPS環境下で安全に動作し、Promiseを返すためasync/awaitと相性が良いです。
// clipboard-polyfill: 標準API優先のコピー
import { writeText } from 'clipboard-polyfill';
async function copyToClipboard(text) {
try {
await writeText(text);
console.log('コピー成功!');
} catch (err) {
console.error('コピー失敗:', err);
}
}
💡 注意:
document.execCommand()は非推奨となっており、将来的に削除される可能性があります。長期運用を考えるならclipboard-polyfillの方が安全です。
clipboardy は、Node.jsプロセス内でクリップボードを操作します。
内部で pbcopy (macOS)、clip (Windows)、xclip/wl-copy (Linux) などのOS固有コマンドを呼び出します。
// clipboardy: Node.jsでのコピー
import clipboardy from 'clipboardy';
// コピー
clipboardy.writeSync('Hello from Node!');
// ペースト
const text = clipboardy.readSync();
console.log(text);
copy-paste も同様の用途でしたが、npm上で非推奨(deprecated)と明記されており、READMEにも「代わりにclipboardyを使ってください」と書かれています。
// copy-paste: 非推奨のため使用しないこと
// import copy from 'copy-paste'; // ❌ 避ける
ブラウザでは、クリップボードへの書き込みにユーザー操作(クリックなど)が必要です。 これはセキュリティ上の制約であり、どのライブラリもこれを回避できません。
clipboard: ボタンクリックなどのイベントハンドラ内でのみ動作clipboard-polyfill: 同様にユーザー操作が必要。ただし、Promiseが拒否されると詳細なエラーが取得可能// clipboard-polyfill でのエラーハンドリング例
button.addEventListener('click', async () => {
try {
await writeText('secret');
} catch (err) {
if (err.name === 'NotAllowedError') {
alert('クリップボードへのアクセスがブロックされました');
}
}
});
一方、Node.jsの clipboardy はプロセスが実行されているマシンのクリップボードに直接アクセスするため、特別な権限は不要です。
ただし、サーバー環境(例: AWS EC2)ではGUIが存在しないため、通常は動作しません。
API設計の違いも重要です。
clipboard: イベント駆動(コールバック形式)clipboard-polyfill: Promiseベース(非同期)clipboardy: .write() / .read()(非同期)、.writeSync() / .readSync()(同期)の両方を提供copy-paste: コールバック形式(非推奨のため詳細省略)現代的なコードベースでは、Promiseやasync/awaitの方が統合しやすいため、clipboard-polyfill や clipboardy の非同期APIが好まれます。
clipboard の場合:
<!-- HTML -->
<button class="copy-btn" data-clipboard-text="コピー対象テキスト">コピー</button>
// JavaScript
import Clipboard from 'clipboard';
new Clipboard('.copy-btn');
clipboard-polyfill の場合:
<!-- HTML -->
<button id="copy-btn">コピー</button>
// JavaScript
import { writeText } from 'clipboard-polyfill';
document.getElementById('copy-btn').addEventListener('click', async () => {
await writeText('コピー対象テキスト');
});
clipboardy の場合:
#!/usr/bin/env node
import clipboardy from 'clipboardy';
const result = '計算結果: 42';
clipboardy.writeSync(result);
console.log('結果をクリップボードにコピーしました');
copy-paste の場合(非推奨のため参考まで):
// ❌ 非推奨。実際には使わないでください
const copy = require('copy-paste').copy;
copy('結果', () => console.log('コピー完了'));
copy-paste は、npmのパッケージページおよびGitHubリポジトリで明確に非推奨とされています。
"This package is deprecated. Please use clipboardy instead."
新規プロジェクトで使用することは絶対に避けてください。既存プロジェクトで使っている場合は、clipboardy への移行を強く推奨します。
| ユースケース | 推奨パッケージ | 理由 |
|---|---|---|
| ブラウザでシンプルなコピーUI | clipboard | DOM属性だけで実装可能。学習コストが低い |
| ブラウザでモダンで安全なコピー | clipboard-polyfill | Async Clipboard API対応。Promiseで扱いやすい |
| Node.js / CLI / Electronでクリップボード操作 | clipboardy | 全OS対応。同期・非同期APIの両方を提供 |
| 新規プロジェクトでのcopy-paste使用 | なし | 非推奨のため使用禁止 |
clipboard-polyfill を第一候補にすることをおすすめします。clipboardy を使ってください。copy-paste は過去の遺物です。正しいツールを選ぶことで、安全で信頼性の高い「コピー」機能を実現できます。
clipboardy は、Node.js環境(CLIツールやElectronアプリなど)でクリップボード操作を行う必要がある場合に最適です。Windows、macOS、Linuxの各OSに対応したネイティブコマンドをラップしており、安定した動作を提供します。フロントエンドではなく、バックエンドやデスクトップアプリ開発でクリップボード機能が必要な場合に選んでください。
clipboard は、シンプルなDOMベースのコピー機能を必要とするフロントエンドプロジェクトに最適です。ボタンクリックでテキストをコピーするようなUIコンポーネントを実装する際に、軽量で直感的なAPIを提供します。ただし、モダンなClipboard APIには対応しておらず、内部で一時的な <textarea> 要素を使ってコピー処理を行うため、セキュリティやパフォーマンスに厳しい要件がある場合は注意が必要です。
copy-paste はnpm上で公式に非推奨(deprecated)とマークされており、新規プロジェクトでの使用は絶対に避けてください。代わりに clipboardy を使用することが明確に推奨されています。既存プロジェクトで使用している場合は、早急に移行を検討すべきです。
clipboard-polyfill は、最新のWeb標準であるAsync Clipboard APIを広範なブラウザで安全に利用したい場合に選択すべきです。PromiseベースのAPIを提供し、HTTPS環境下での安全なクリップボードアクセスをサポートします。特に、モダンなReact/Vueアプリでユーザー操作に応じて動的にクリップボードに書き込む必要がある場合に推奨されます。
Access the system clipboard (copy/paste)
Cross-platform. Supports: macOS, Windows, Linux (including Wayland), OpenBSD, FreeBSD, Android with Termux, and modern browsers.
npm install clipboardy
import clipboard from 'clipboardy';
await clipboard.write('🦄');
await clipboard.read();
//=> '🦄'
// Or use the synchronous API
clipboard.writeSync('🦄');
clipboard.readSync();
//=> '🦄'
Browser usage: Requires a secure context (HTTPS). Synchronous methods are not available in browsers.
Write (copy) to the clipboard asynchronously.
Returns a Promise<void>.
Type: string
The text to write to the clipboard.
await clipboard.write('🦄');
Read (paste) from the clipboard asynchronously.
Returns a Promise<string>.
const content = await clipboard.read();
//=> '🦄'
Write (copy) to the clipboard synchronously.
Doesn't work in browsers.
Type: string
The text to write to the clipboard.
clipboard.writeSync('🦄');
Read (paste) from the clipboard synchronously.
Returns a string.
Doesn't work in browsers.
const content = clipboard.readSync();
//=> '🦄'
The Linux binary is just a bundled version of xsel. The source for the Windows binary can be found here.
On Windows, clipboardy first tries the native PowerShell cmdlets (Set-Clipboard/Get-Clipboard) and falls back to the bundled binary if PowerShell is unavailable or restricted.
Yes. On Linux, clipboardy automatically detects Wayland sessions and uses wl-clipboard when available. If not, it gracefully falls back to X11 tools. Also works with WSLg (Windows Subsystem for Linux GUI). Install wl-clipboard using your distribution's package manager.