clipboard vs copy-paste
Web アプリにおけるクリップボード操作ライブラリの比較
clipboardcopy-paste類似パッケージ:

Web アプリにおけるクリップボード操作ライブラリの比較

clipboard(通称 clipboard.js)と copy-paste は、どちらもクリップボードへの書き込みや読み取りを扱うためのライブラリですが、想定されている実行環境と設計思想が異なります。clipboard はブラウザ環境に特化しており、古いブラウザでのフォールバックを含め、フロントエンドでのコピー操作を容易にします。一方、copy-paste は主に Node.js 環境向けに設計されており、サーバーサイドスクリプトや CLI ツールでのシステムクリップボードアクセスを目的としています。現代のフロントエンド開発では、標準の Clipboard API (navigator.clipboard) が首选されますが、レガシーブラウザ対応やサーバーサイド処理においてこれらのライブラリの役割を理解することは重要です。

npmのダウンロードトレンド

3 年

GitHub Starsランキング

統計詳細

パッケージ
ダウンロード数
Stars
サイズ
Issues
公開日時
ライセンス
clipboard2,273,03834,14094.5 kB15-MIT
copy-paste303,50344717 kB81年前-

clipboard vs copy-paste: 環境と API デザインの決定的な違い

フロントエンド開発において、テキストのコピー機能は頻繁に必要とされます。clipboardcopy-paste は名前が似ていますが、実は全く異なる環境と目的のために作られたツールです。この違いを理解せずに選ぶと、ビルドエラーや実行時エラーに直面することになります。ここでは、両者の技術的な違いと、現代の開発においてどこに位置づくべきかを解説します。

🖥️ 実行環境:ブラウザ専用 vs Node.js 専用

最も重要な違いは、どこで動くかです。アーキテクチャ設計において、これは最初の分岐点になります。

clipboard はブラウザ環境専用に設計されています。

  • 内部で document.execCommand('copy') や、最近では navigator.clipboard を利用します。
  • DOM 要素にイベントリスナーをバインドして動作します。
  • ブラウザのセキュリティ制限(ユーザージェスチャが必要など)に従います。
// 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 環境向けに設計されています。

  • OS のコマンド(pbcopy, xclip など)を呼び出してシステムクリップボードを操作します。
  • ブラウザの DOM API にはアクセスできません。
  • サーバーサイドや CLI ツールでのログコピーなどに使われます。
// 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');
});

🎯 API デザイン:イベント駆動 vs コールバック関数

パッケージの設計思想も、使用シーンに大きく影響します。

clipboard はイベント駆動型です。

  • 特定の HTML 要素にクラスを割り当て、そこでのクリックをトリガーにします。
  • 成功・失敗のイベントをリスナーで受け取ります。
  • UI との連携が自然です。
// 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);

🚀 現代の代替案:標準 Clipboard API

実は、現代のブラウザ開発において、これらのライブラリは必ずしも必要ではありません。標準 API が十分成熟しているためです。

navigator.clipboard が推奨される理由:

  • ライブラリ依存を減らせます。
  • 非同期処理(Promise)に対応しており、コードが簡潔になります。
  • 最新のブラウザでネイティブにサポートされています。
// 標準 API: 推奨される現代の実装
async function copyText(text) {
    try {
        await navigator.clipboard.writeText(text);
        console.log('Copied!');
    } catch (err) {
        console.error('Failed to copy: ', err);
        // ここでフォールバックとして clipboard.js を使う選択肢がある
    }
}

📊 比較サマリー

特徴clipboardcopy-paste
主な環境🌐 ブラウザ (Frontend)🖥️ Node.js (Backend/CLI)
API 形式イベントリスナーコールバック関数
依存技術DOM API / execCommandOS システムコマンド
ユーザー操作必須 (ブラウザ制限)不要 (サーバー側)
使用ケースWeb UI のコピーボタンサーバースクリプト、ツール

💡 結論:どちらを選ぶべきか

clipboard は、レガシーブラウザのサポートが必要なフロントエンドプロジェクトにおいて、まだ有用です。特に、navigator.clipboard が使えない環境(一部のモバイルブラウザなど)でのフォールバックとして価値があります。ただし、新規プロジェクトでは標準 API を第一選択とし、このライブラリは保険として導入するのが賢明です。

copy-paste は、フロントエンド開発者のツールボックスには通常入りません。これはサーバーサイドの自動化ツールや、開発者が使用する CLI ツールを作るためのものです。Web アプリの画面内でコピー機能を実装したい場合、このパッケージを選択するのは技術的に誤りです。

最終的なアドバイス: 現代の Web 開発では、まず navigator.clipboard の使用を検討してください。サポート範囲外のユーザーがいる場合にのみ、clipboard をフォールバックとして追加しましょう。copy-paste はサーバーサイドの要件がある場合のみ評価してください。

選び方: clipboard vs copy-paste

  • clipboard:

    ブラウザ環境で動作する Web アプリを開発しており、特に iOS Safari や古い Android など、標準の Clipboard API が完全にサポートされていない環境への対応が必要な場合に選択します。ユーザー操作(クリックなど)に紐付いたコピー機能を実装する際に最適です。

  • copy-paste:

    Node.js 環境で動作するサーバーサイドスクリプト、CLI ツール、またはビルドツールを開発しており、システム全体のクリップボードにアクセスする必要がある場合に選択します。ブラウザ上のフロントエンドコードで使用することは想定されていないため、Web アプリでは避けるべきです。

clipboard のREADME

clipboard.js

Build Status Killing Flash

Modern copy to clipboard. No Flash. Just 3kb gzipped.

Demo

Why

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.

Install

You can get it on npm.

npm install clipboard --save

Or if you're not into package management, just download a ZIP file.

Setup

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.

Usage

We're living a declarative renaissance, that's why we decided to take advantage of HTML5 data attributes for better usability.

Copy text from another element

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.

example-2

<!-- 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>

Cut text from another element

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.

example-3

<!-- 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.

Copy text from attribute

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.

example-1

<!-- Trigger -->
<button
  class="btn"
  data-clipboard-text="Just because you can doesn't mean you should — clipboard.js"
>
  Copy to clipboard
</button>

Events

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.

Tooltips

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.

Advanced Options

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();

Browser Support

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.

Chrome logoEdge logoFirefox logoInternet Explorer logoOpera logoSafari logo
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.

Bonus

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.

License

MIT License © Zeno Rocha