フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

ElectronのAPIをいろいろと使ってみる

はじめに

  • 前回、electronの環境を構築したので、せっかくなので、何かデモアプリを作成してみる。

  • electronにはいろいろなAPIがあるので、さっくと簡単にいろいろな機能がつくれる。 www.electronjs.org

サンプルコード

ドラック&ドロップでファイルの情報を取得する

<div id="holder">
  ファイルをここにドラッグ
</div>

<script>
  document.addEventListener('drop', (e) => {
    e.preventDefault();
    e.stopPropagation();

    for (const f of e.dataTransfer.files) {
      console.log('File(s) you dragged here: ', f.path)
    }
  });
  document.addEventListener('dragover', (e) => {
    e.preventDefault();
    e.stopPropagation();
  });
</script>

クリップボードにテキストを保存する

const { clipboard } = require('electron')

clipboard.writeText('Example String', 'selection')
console.log(clipboard.readText('selection'))

外部通信

  • こちらのコードはエラーが出て、原因がわかりませんでした。
const {app} = require('electron')
  app.on('ready', () => {
    const {net} = require('electron')
    const request = net.request('https://github.com')
    request.on('response', (response) => {
      console.log(`STATUS: ${response.statusCode}`)
      console.log(`HEADERS: ${JSON.stringify(response.headers)}`)
      response.on('data', (chunk) => {
        console.log(`BODY: ${chunk}`)
      })
      response.on('end', () => {
        console.log('No more data in response.')
      })
    })
    request.end()
  })

オンラインかオフラインかの判定

const alertOnlineStatus = () => { window.alert(navigator.onLine ? 'online' : 'offline') }

window.addEventListener('online', alertOnlineStatus)
window.addEventListener('offline', alertOnlineStatus)

alertOnlineStatus()

slackのような通知

const myNotification = new Notification('Title', {
  body: 'Notification from the Renderer process'
})

myNotification.onclick = () => {
  console.log('Notification clicked')
}

ローカルのファイルを取得する

const fs = require('fs');
const path = require('path');

const showFiles = (dirpath, callback) => {
  fs.readdir(dirpath, (err, files) => {
    if (err) {
      console.error(err);
      return;
    }

    for (const file of files) {
      const fp = path.join(dirpath, file);
      fs.stat(fp, (err, stats) => {
        if (err) {
          console.error(err);
          return;   
        }
        if (stats.isDirectory()) {
          showFiles(fp, callback);
        } else {
          callback(fp);
        }
      });
    }
  });
}
console.log(__dirname);

showFiles(__dirname, console.log);

セキュリティ関連にはいろいろと制限があるらしい

  • 外部通信がうまくいかなかったのでセキュリティの問題かと思いましたが、調査しきれず。 www.electronjs.org

感想

  • いろいろな機能があるのでローカルの業務専用アプリなどを開発することができそう。