clipboard(通称 clipboard.js)と copy-paste は、どちらもクリップボードへの書き込みや読み取りを扱うためのライブラリですが、想定されている実行環境と設計思想が異なります。clipboard はブラウザ環境に特化しており、古いブラウザでのフォールバックを含め、フロントエンドでのコピー操作を容易にします。一方、copy-paste は主に Node.js 環境向けに設計されており、サーバーサイドスクリプトや CLI ツールでのシステムクリップボードアクセスを目的としています。現代のフロントエンド開発では、標準の Clipboard API (navigator.clipboard) が首选されますが、レガシーブラウザ対応やサーバーサイド処理においてこれらのライブラリの役割を理解することは重要です。
フロントエンド開発において、テキストのコピー機能は頻繁に必要とされます。clipboard と copy-paste は名前が似ていますが、実は全く異なる環境と目的のために作られたツールです。この違いを理解せずに選ぶと、ビルドエラーや実行時エラーに直面することになります。ここでは、両者の技術的な違いと、現代の開発においてどこに位置づくべきかを解説します。
最も重要な違いは、どこで動くかです。アーキテクチャ設計において、これは最初の分岐点になります。
clipboard はブラウザ環境専用に設計されています。
document.execCommand('copy') や、最近では navigator.clipboard を利用します。// clipboard: ブラウザでの使用例
import ClipboardJS from 'clipboard';
const clipboard = new ClipboardJS('.btn');
clipboard.on('success', function(e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
e.clearSelection();
});
copy-paste は主に Node.js 環境向けに設計されています。
pbcopy, xclip など)を呼び出してシステムクリップボードを操作します。// copy-paste: Node.js での使用例
const copy = require('copy-paste').copy;
copy('Hello World', function (err) {
if (err) console.error(err);
else console.log('Copied to system clipboard');
});
パッケージの設計思想も、使用シーンに大きく影響します。
clipboard はイベント駆動型です。
// clipboard: イベントベースの処理
clipboard.on('error', function(e) {
console.error('Action:', e.action);
console.error('Trigger:', e.trigger);
// UI にエラーメッセージを表示するなど
});
copy-paste は関数呼び出し型です。
// copy-paste: 関数ベースの処理
const paste = require('copy-paste').paste;
paste(function (err, text) {
if (err) console.error(err);
else console.log('Pasted text:', text);
});
ブラウザのセキュリティモデルは年々強化されており、クリップボード操作にも影響しています。
clipboard はユーザー操作を前提としています。
navigator.clipboard.writeText の使用が推奨されます。// clipboard: ユーザー操作トリガーが必要
// HTML: <button class="btn" data-clipboard-text="copy me">Copy</button>
// JS: new ClipboardJS('.btn');
// ユーザーがボタンを押すことで初めて実行される
copy-paste はサーバー側なのでブラウザ制限を受けません。
// copy-paste: サーバー側なので制限なし
// Node.js スクリプト実行時に自動的にコピー可能
copy('Secret Token', callback);
実は、現代のブラウザ開発において、これらのライブラリは必ずしも必要ではありません。標準 API が十分成熟しているためです。
navigator.clipboard が推奨される理由:
// 標準 API: 推奨される現代の実装
async function copyText(text) {
try {
await navigator.clipboard.writeText(text);
console.log('Copied!');
} catch (err) {
console.error('Failed to copy: ', err);
// ここでフォールバックとして clipboard.js を使う選択肢がある
}
}
| 特徴 | clipboard | copy-paste |
|---|---|---|
| 主な環境 | 🌐 ブラウザ (Frontend) | 🖥️ Node.js (Backend/CLI) |
| API 形式 | イベントリスナー | コールバック関数 |
| 依存技術 | DOM API / execCommand | OS システムコマンド |
| ユーザー操作 | 必須 (ブラウザ制限) | 不要 (サーバー側) |
| 使用ケース | Web UI のコピーボタン | サーバースクリプト、ツール |
clipboard は、レガシーブラウザのサポートが必要なフロントエンドプロジェクトにおいて、まだ有用です。特に、navigator.clipboard が使えない環境(一部のモバイルブラウザなど)でのフォールバックとして価値があります。ただし、新規プロジェクトでは標準 API を第一選択とし、このライブラリは保険として導入するのが賢明です。
copy-paste は、フロントエンド開発者のツールボックスには通常入りません。これはサーバーサイドの自動化ツールや、開発者が使用する CLI ツールを作るためのものです。Web アプリの画面内でコピー機能を実装したい場合、このパッケージを選択するのは技術的に誤りです。
最終的なアドバイス: 現代の Web 開発では、まず navigator.clipboard の使用を検討してください。サポート範囲外のユーザーがいる場合にのみ、clipboard をフォールバックとして追加しましょう。copy-paste はサーバーサイドの要件がある場合のみ評価してください。
ブラウザ環境で動作する Web アプリを開発しており、特に iOS Safari や古い Android など、標準の Clipboard API が完全にサポートされていない環境への対応が必要な場合に選択します。ユーザー操作(クリックなど)に紐付いたコピー機能を実装する際に最適です。
Node.js 環境で動作するサーバーサイドスクリプト、CLI ツール、またはビルドツールを開発しており、システム全体のクリップボードにアクセスする必要がある場合に選択します。ブラウザ上のフロントエンドコードで使用することは想定されていないため、Web アプリでは避けるべきです。
Modern copy to clipboard. No Flash. Just 3kb gzipped.
Copying text to the clipboard shouldn't be hard. It shouldn't require dozens of steps to configure or hundreds of KBs to load. But most of all, it shouldn't depend on Flash or any bloated framework.
That's why clipboard.js exists.
You can get it on npm.
npm install clipboard --save
Or if you're not into package management, just download a ZIP file.
First, include the script located on the dist folder or load it from a third-party CDN provider.
<script src="dist/clipboard.min.js"></script>
Now, you need to instantiate it by passing a DOM selector, HTML element, or list of HTML elements.
new ClipboardJS('.btn');
Internally, we need to fetch all elements that matches with your selector and attach event listeners for each one. But guess what? If you have hundreds of matches, this operation can consume a lot of memory.
For this reason we use event delegation which replaces multiple event listeners with just a single listener. After all, #perfmatters.
We're living a declarative renaissance, that's why we decided to take advantage of HTML5 data attributes for better usability.
A pretty common use case is to copy content from another element. You can do that by adding a data-clipboard-target attribute in your trigger element.
The value you include on this attribute needs to match another's element selector.
<!-- Target -->
<input id="foo" value="https://github.com/zenorocha/clipboard.js.git" />
<!-- Trigger -->
<button class="btn" data-clipboard-target="#foo">
<img src="https://raw.githubusercontent.com/zenorocha/clipboard.js/HEAD/assets/clippy.svg" alt="Copy to clipboard" />
</button>
Additionally, you can define a data-clipboard-action attribute to specify if you want to either copy or cut content.
If you omit this attribute, copy will be used by default.
<!-- Target -->
<textarea id="bar">Mussum ipsum cacilds...</textarea>
<!-- Trigger -->
<button class="btn" data-clipboard-action="cut" data-clipboard-target="#bar">
Cut to clipboard
</button>
As you may expect, the cut action only works on <input> or <textarea> elements.
Truth is, you don't even need another element to copy its content from. You can just include a data-clipboard-text attribute in your trigger element.
<!-- Trigger -->
<button
class="btn"
data-clipboard-text="Just because you can doesn't mean you should — clipboard.js"
>
Copy to clipboard
</button>
There are cases where you'd like to show some user feedback or capture what has been selected after a copy/cut operation.
That's why we fire custom events such as success and error for you to listen and implement your custom logic.
var clipboard = new ClipboardJS('.btn');
clipboard.on('success', function (e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
e.clearSelection();
});
clipboard.on('error', function (e) {
console.error('Action:', e.action);
console.error('Trigger:', e.trigger);
});
For a live demonstration, go to this site and open your console.
Each application has different design needs, that's why clipboard.js does not include any CSS or built-in tooltip solution.
The tooltips you see on the demo site were built using GitHub's Primer. You may want to check that out if you're looking for a similar look and feel.
If you don't want to modify your HTML, there's a pretty handy imperative API for you to use. All you need to do is declare a function, do your thing, and return a value.
For instance, if you want to dynamically set a target, you'll need to return a Node.
new ClipboardJS('.btn', {
target: function (trigger) {
return trigger.nextElementSibling;
},
});
If you want to dynamically set a text, you'll return a String.
new ClipboardJS('.btn', {
text: function (trigger) {
return trigger.getAttribute('aria-label');
},
});
For use in Bootstrap Modals or with any other library that changes the focus you'll want to set the focused element as the container value.
new ClipboardJS('.btn', {
container: document.getElementById('modal'),
});
Also, if you are working with single page apps, you may want to manage the lifecycle of the DOM more precisely. Here's how you clean up the events and objects that we create.
var clipboard = new ClipboardJS('.btn');
clipboard.destroy();
This library relies on both Selection and execCommand APIs. The first one is supported by all browsers while the second one is supported in the following browsers.
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
|---|---|---|---|---|---|
| 42+ ✔ | 12+ ✔ | 41+ ✔ | 9+ ✔ | 29+ ✔ | 10+ ✔ |
The good news is that clipboard.js gracefully degrades if you need to support older browsers. All you have to do is show a tooltip saying Copied! when success event is called and Press Ctrl+C to copy when error event is called because the text is already selected.
You can also check if clipboard.js is supported or not by running ClipboardJS.isSupported(), that way you can hide copy/cut buttons from the UI.
A browser extension that adds a "copy to clipboard" button to every code block on GitHub, MDN, Gist, StackOverflow, StackExchange, npm, and even Medium.
Install for Chrome and Firefox.
MIT License © Zeno Rocha