よく使うWebページをデスクトップアプリ化する4つの方法


最近，[TabMemFree](https://chrome.google.com/webstore/detail/tabmemfree/pdanbocphccpmidkhloklnlfplehiikb/related)という拡張を導入しました．これは一定時間毎に使っていないタブのメモリを開放するという動きをしてくれます．
このおかげで大量のタブがあっても重たくならないのですが，その副作用として望んでいないサイトまでメモリ開放してしまいます．結果，裏で流しているYoutubeだとかPlayMusicだとかが止まってしまいます．

この回避のためにWebサイトをデスクトップアプリ化しようと思いたち，ついでなのでまとめてみました．
# [Fluid](http://fluidapp.com/)

一番有名どころではないでしょうか．
MacAppなのでMacでしか使えませんがBookmark機能やHistory機能等があります．
特定のWebページ専門ブラウザを作成するイメージです．
以前はライセンス購入しないとCookieがFluidApp内で共有されていたのですが，Sierraからそれがなくなりました．

```
One other note: in Sierra, Apple has made a change that forces all of
 your Fluid Apps to use Separate Cookie Storage by default. This is 
actually great news! You no longer have to purchase a license for this
 feature, and when running Fluid on Sierra or later, there is no longer
an option to change this feature.
```

### 使い方
1. アプリをインストールする
1. 起動して画像の通り入力する．

<img width="400" alt="68747470733a2f2f64326d787565667165616137736a2e636c6f756466726f6e742e6e65742f735f354143463842313931443130434530414642353945373841453544453033363341364641463441444336413739333634373743383845383635333537414137345f313531383432303434323930395f53.png" src="https://qiita-image-store.s3.amazonaws.com/0/65007/1344dbcb-af56-a329-eef1-a5c8cc1c6902.png">

# Chromeアプリ化
WebページをChromeアプリ化することもできます(ただし[2018年までに提供終了?](https://internet.watch.impress.co.jp/docs/news/1015893.html))
Chromeアプリ化には二つの方法があります．

### [Applicationize](https://applicationize.me/)を使う
1. [リンク先](https://applicationize.me/now)に飛んでWebサイトのURLを入力します

<img width="400" alt="68747470733a2f2f64326d787565667165616137736a2e636c6f756466726f6e742e6e65742f735f354143463842313931443130434530414642353945373841453544453033363341364641463441444336413739333634373743383845383635333537414137345f313531383432303732313435375f53.png" src="https://qiita-image-store.s3.amazonaws.com/0/65007/270358c5-1452-e294-f616-dcd871560290.png">

2. Generateするとファイルをダウンロードできるので，それを[chrome://extensions](chrome://extensions)にドラッグアンドドロップ


### Chromeの隠し機能を使う

実はChromeの隠し機能を使うことでWebページをChromeアプリ化することもできます．

1. [chrome://flags/](chrome://flags/) に飛ぶ
2. **Allow hosted apps to be opened in windows**をEnable
3. **disable-new-bookmark-apps**をEnable
4. その他のツールからAdd to Applicationをする
 
<img width="400" alt="Screen Shot 2018-02-13 at 19.56.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/65007/1291fd62-0908-be9c-b9bb-d83be69354fa.png">

5. [chrome://apps/](chrome://apps/) にアプリが追加されている


# [Nativefier](https://github.com/jiahaog/nativefier)

CLIを使えるかたはNativefierもおすすめです．
nodeのインストールが必要になります．
Nativefierは内部でElectronを使ってWebページを開くアプリを作成します．ElectronなのでLinuxやWindowsでも同様のことができます．

### 使い方
1. nativefierをinstall

```sh
$ npm install -g nativefier
```

2. 実行(詳細はnativefierのhelp参照)

```sh
$ nativefier https://www.dropbox.com/paper --counter --fast-quit --icon test.icns --name "Dropbox Paper"
```

3. カレントディレクトリにMacAppができます

# [epichrome](https://github.com/dmarmor/epichrome)(追記 2018/02/28)
アプリ化したwebサイトでchrome拡張を使いたい場合epichromeがおすすめです．
詳細は以下の記事をご覧ください

- [Fluid で物足りないなら epichrome を使えばいいじゃない](https://qiita.com/kitsuyui/items/86451573ed6d39b90a87#_reference-2a807a8f6d8a2502ac11)


# 使ってみて気づいた利点&欠点
- Fluid
    - アイコン探す必要あり
    - 機能は一番多い?
- Chrome隠し機能
    - Chrome Canaryとか入れてるとアプリが二つできる
    - HyperSwitch使用していると切り替え時に表示されるアイコンが全部Chromeになる
    - アイコンの画質が低い
        - 独自のアイコンを設定しようとすると少し手間
- Nativefier
    - 120MBぐらいのアプリができる
    - Iconを自動で検索してくれる
        - 対応していれば探してくれます．現在バグ有り？
    - 外部サイトを開く際の動作がいまいち
        - 右クリックで開くか，作成時のinternal-urlsオプションを使う
    - png画像をアイコンに登録できない

私はFluid->Applicationize->Chrome隠し機能→Nativefierの経過をたどり，結局Fluidに戻りました．
最近epichromeを見つけたちょっと試してみています．

---
あとちなみにアイコンの適用方法と探し方紹介しておきます．

# アイコン画像を探す

アイコンの画像取得にはnativefierの作者が[ライブラリ](https://github.com/jiahaog/page-icon)を公開しています．使わさせていただいましょう
ただし，サイトによっては正しく取得できません場合があります．これで取得できない画像はPlayStoreから取ってきたりしています

```
$ npm install --save page-icon
```

2. 以下スクリプトを作成

```hoge.js
const pageIcon = require('page-icon');
const URL = 'https://www.google.co.jp/inbox/'  // Iconを取得したいURL
pageIcon(URL)
    .then(function(icon) {
        // do things with icon object
        console.log(icon);
    })
    .catch(error => {
        console.error(error);
    })
```

2. 実行

```
$ node hoge.js
```

# 画像をicnsに変換する

nativefierの場合，画像をicns形式に変換する必要があります
[nativefier-icons](https://github.com/jiahaog/nativefier-icons)を使いましょう
予めImageMagickをインストールする必要があります．

    $ brew install ImageMagick
    $ git clone https://github.com/jiahaog/nativefier-icons
    $ cd nativefier-icons
    $ ./bin/convertToIcns hoge.png hoge.icns

以上で完了です．