.../articles/

GitHubを少し便利に使えるようなChrome拡張機能を作った

日々使うGitHubで外部リンクをブラウザの別タブで開けたらいいなと日頃から思っていたので、それを解決するChrome拡張機能を作って動かしてみました。

前書き

最近は仕事・プライベートに限らず、PCやスマホでWebブラウザを開かない日はないと言っても過言ではないように思います。

その中でも GitHub は個人的に利用する頻度が高いサービスのひとつです。

自分の関わるプロジェクトでPull RequestやIssueを見るだけでなく、OSSのリポジトリでREADMEを読んで使い方を学んだり、ソースコードを直接読むこともあるでしょう。

そんななかでちょっとした不満というか、ここがこうだったらいいのになと思ったのがリンクを開く時の挙動でした。


やりたいこと

GitHubのWebページで外部リンクを新規タブで開けるようにする、シンプルですがこれがやりたいことです。

どうやって実現しようか考えて、この悩みを解決するChrome拡張機能を作ってみようという結論に至りました。

また、この機能に必要な処理は以下のようになると考えました。

  1. GitHubのWebページを開く
  2. Webページ中からaタグを探す
  3. aタグの中から github.com 以外のドメイン(外部リンクとします)のURLをもつ要素を探す
  4. 外部リンクを持つ要素に target="_blank" を付与する

ということでこれをChrome拡張機能として実装してみます。

余談: target="_blank" は必要か?

リンクを新規タブで開いて欲しい時 target="_blank" を使う事自体は特に珍しいことではありません。

MDN web docsを見ると target について以下のように記載があります。

引用(一部省略)

リンク先の URL を表示する場所を指定します。これは、閲覧コンテキスト (タブ、ウィンドウ、<iframe>) の名前またはキーワードです。以下のキーワードは特別な意味を持ちます:
・_blank: 新しい閲覧コンテキストに URL を読み込みます。通常はタブですが、新しいウィンドウを使用するようにブラウザーを設定できます。

ただしこれに関しては議論もあるようで、とりあえず外部リンクには target="_blank" をつけたいという人もいれば、無闇に target="_blank" を使いたくないと考える人もいるようです。

自分も全ての外部リンクに必須であるとは思いませんが、実装自体は難しくないはずなのでGitHubはあえて target="_blank" 使わない方針をとっていると考えることができるでしょうか。

ちなみにGitLabでは外部リンクに target="_blank" が付与されているようでした、このあたりは作り手の意図が読み取れるようで面白いですね。

またドキュメント中では target="_blank" を使用する際の rel="noreferrer"rel="noopener" の併用についても記載がありますので、セキュリティの観点も忘れないようにしましょう。


やったこと

前置きが長くなりましたが、Chrome拡張機能を追加するのに必要なのは2つのファイルのみです。

manifest.json はChrome拡張機能として必要な情報や権限を記述するファイルです。

最低限だと以下のような内容で足りるかと思います。

{
  "manifest_version": 2,
  "name": "github-external-link",
  "version": "0.1.0",
  "description": "add `target=\"_blank\"` to external links on github",
  "content_scripts": [
    {
      "matches": ["https://github.com/*"],
      "js": ["contentScript.js"]
    }
  ]
}

manifest.json にも記述のある contentScript.js は前述の処理を実現するためのスクリプトで以下のようにしてみました。

window.addEventListener(
  'load',
  () => {
    const links = document.getElementsByTagName('a')
    Array.prototype.forEach.call(links, link => {
      const isExternalLink =
        link.href.match(/^https?:\/\/.+/) && !link.href.includes('github.com')
      if (isExternalLink) {
        link.target = '_blank'
        link.rel = [link.rel, 'noopener', 'noreferrer'].join(' ')
      }
    })
  },
  false,
)

この2つのファイルを同一のディレクトリに置き、Chromeの拡張機能画面で「パッケージ化されていない拡張機能を読み込む」で選択すると使用可能になります。(※拡張機能の追加、使用は自己責任で行ってください)

この拡張機能が機能しているか確認するために以下のリポジトリのページを見てみます。

1枚目が拡張機能がオフの状態、2枚目が拡張機能をオンにした状態です。
ページ上部の外部リンクである https://web.devtarget="_blank" を付与できていることがわかるかと思います。

以上でやりたいことが実現できました 🎉


後書き

「自分で作る」というアイデアで完成まで突っ走りましたが、よく考えたら既にChromeウェブストアで同じようなアイデアの拡張機能はありそうだなと思いました。
探してみると実際ありましたし、ここで作ったものをウェブストア上に公開するまでもないと思ったのでソースコードをそのまま紹介しました。

それでもChrome拡張機能を開発するのが意外と簡単なことがわかったのと、いままで意識したことがない target="_blank" について少し考える機会になったのは良かったと思いました。

これを機に何か別のChrome拡張機能も作ってみようと思います。

.../articles/

Articles

記事

AWS AmplifyにmonorepoのNext.js(App Router)をデプロイする

AWS AmplifyにmonorepoのNext.js(App Router)をデプロイする

monorepo管理しているNext.jsをAmplifyにデプロイしようとした際にいくつか躓く内容があったのでまとめておきます。

リモートワーク・オンライン会議でも、スムーズに制作を進めるために大切なこと[資料編]

リモートワーク・オンライン会議でも、スムーズに制作を進めるために大切なこと[資料編]

コロナ禍の影響により、リモートワークの導入をおこなっている制作会社も多く、実際に弊社でも導入しています。

売れるECサイトデザインを作るために。参考にしたいおしゃれな事例の探し方。

売れるECサイトデザインを作るために。参考にしたいおしゃれな事例の探し方。

売れるECサイトのデザインは、「この形式」という決まりはありません。ECサイトで売り上げを上げるなら、しっかりとしたコンセプトと、コンセプトを決定するまでのリサーチが必要です。

制作会社の考える、業務効率化ツールのおすすめ。個人でも使いやすいサービスなど。

制作会社の考える、業務効率化ツールのおすすめ。個人でも使いやすいサービスなど。

新型コロナウイルス感染拡大の影響で、リモートワークが主流になり、弊社でも週のほとんどは各自宅で作業をしています。

Figmaでデザインのコミット履歴を残せるプラグイン【Thought Recorder】をリリースしました

Figmaでデザインのコミット履歴を残せるプラグイン【Thought Recorder】をリリースしました

Figmaを利用するWebデザイナーの助けになれると嬉しいです。使い方は本記事をご覧ください。

ECの構築方法、おすすめのECサービス。

ECの構築方法、おすすめのECサービス。

ファッションや家電、スーパーの買い物でさえもECサイトを利用することが当たり前になりました。加えて新型コロナウイルスの影響もあり、弊社にも「どんなプラットフォームを利用したら良いか」「どれくらいコストがかかるのか」などECに関するさまざまなご相談を頂きます。

FastAPIのスキーマクラスをOpenAPIから生成する方法

FastAPIのスキーマクラスをOpenAPIから生成する方法

PythonでAPIを構築する要件があり、フレームワークに比較的モダンなFastAPIを採用しました。FastAPIはバックエンドの開発を行えば自動でOepnApi定義を生成する機能が備わっていますが、今回はこれを使わず、事前に用意したOepnApi定義からFastAPIで利用するスキーマクラスを生成する方法を紹介します。

Laravel 日本一解りやすい全文検索のマイグレーション記載方法解説

Laravel 日本一解りやすい全文検索のマイグレーション記載方法解説

Laravel + MySQLで全文検索を実装する

とあるPythonのソースで sys.path.append としたく無かった話

とあるPythonのソースで sys.path.append としたく無かった話

とあるプロジェクトのとあるソースコードのレビューをしてた時、「ソースコードの参照がうまくいってなかったので修正しました」とレビュー依頼がきました。 ディレクトリ構造 ``` module L __init__.py L main.py L tests L __init__.py L test_main.py ``` ソースコード ``` python tests/test_main.py sys.path.append(os.path.abspath("..")) from main import fuga ``` 今まで案件でPythonに触れる機会も結構ありましたが、なんとなく使ってきた部分も多く、この書き方が良いのか悪いのか判別できなかったので、改めてPythonのモジュールのインポートに関して調べてみたのでブログにしました。普段PHPを書いている事が多くPythonに関して何も分からないので初心者向けの内容になっていると思います。

GiFT1号目新卒デザイナーの2021年振り返り

GiFT1号目新卒デザイナーの2021年振り返り

いつの間に、年末ですね。入社してもう、9ヶ月も立っていたようです。2021年の振り返りを記事にしました。

すべての記事

お問い合わせ