私の環境では使えなかった。v18以降限定らしい。もし使えたらaxiosやelectron-fetchなどネットワーク通信用にパッケージをインストールせずに済みそう。
ブツ
インストール&実行
NAME='Electron.electron-fetch.20220824144925'
git clone https://github.com/ytyaru/$NAME
cd $NAME
npm install
npm start
準備
- GitHubアカウントを作成する
repo
スコープ権限をもったアクセストークンを作成する- インストール&実行してアプリ終了する
db/setting.json
ファイルが自動作成される
db/setting.json
に以下をセットしファイル保存するusername
に任意のGitHubユーザ名token
にrepo
スコープ権限を持ったトークンrepo
に任意リポジトリ名(mytestrepo
等)
dst/mytestrepo/.git
が存在しないことを確認する(あればdst
ごと削除する)- GitHub上に同名リモートリポジトリが存在しないことを確認する(あれば削除する)
実行
npm start
で起動またはアプリでCtrl+Shift+Rキーを押す(リロードする)git init
コマンドが実行されるrepo/リポジトリ名
ディレクトリが作成され、その配下に.git
ディレクトリが作成される
- createRepo実行後、アプリの開発者ツールのコンソールにJSON結果が表示される
なお、私の環境では以下エラーになった。
Uncaught (in promise) Error: Error invoking remote method 'fetch': ReferenceError: fetch is not defined
原因はNode.jsのバージョンだと思う。
$ node --version
v16.15.1
あれ、私の環境ってたぶん最新のはずだけどな。Electronを使ってみるのときパッケージn
を使って最新版をインストールしているはず。とおもったらv16だった。
Node.jsのページをみてみると、2種類あるようだ。執筆時点で推奨版が16.17.0
、最新版が18.8.0
だった。よくわからんが、非推奨版なら18
にできるってことかな? それは嫌だなぁ。
呼び名が不穏
というか推奨版
/最新版
という呼び方がよくわからない。旧版
/最新版
や推奨版
/非推奨版
ならわかるのだが。なにか不都合なことを隠そうとして言い換えているような不誠実であやしい言葉遣いにみえる。
ふつうのアプリなら何も考えず最新版
のほうを入れるけど、対比されている対象が推奨版
だというのが怖い。どう考えても推奨版
のほうがよさげに見えるのだが。
推奨版
/最新版
たぶん意味としては安定版
/開発版
だと思う。最新版
はきっと不安定でバグがある可能性が高いのだろう。そうでなければ分ける必要もないし、n
でその最新版
のほうをインストールしているはず。実際は推奨版
のほうがインストールされていたっぽいので、そうするだけの理由があるのだろう。
もし最新版
でなく不安定版
とか非推奨版
みたいな名前にしたら誰もダウンロードしたがらないから最新版
という綺麗な名前にしたのでは? 実際はどうなのか知らないけど、n
による推奨版
をインストールするのが良い選択だと考えておこう。
新しい機能を試してみたい気持ちはあるけど、それでシステムクラッシュとかしたら目も当てられない。なのでここは推奨版
だけを入れておく。
推奨版(LTS)
ダウンロードページをみるとLTS 推奨版
と書いてある。ようするにLTS
というのは推奨版のことらしい。ついでにLTSとはLong-Term Support
、長期サポートの略だとか。用語が乱立してて混乱する。
情報源
Node.js v18 fetchによると外部パッケージのインストールなしでfetch
APIが使えるようだ。でもv18以降限定らしい。しかもそれは推奨版ではないという。最新版を入れたら動作するかもしれないが、怖いので未確認。
LTSのリリーススケジュールとやらをみると、v18がアクティブになるのは2022-10-25
みたい。あと二ヶ月後には推奨版になるようだ。それまで待つのが得策か。
今回のコードはv18以降なら動作すると思うので、コードだけアップしておくことにした。
コード抜粋
main.js
ipcMain.handle('fetch', async(event, url, options)=>{
const res = await fetch(url, options).catch(e=>console.error(e));
console.log(res)
const json = await res.json()
console.log(json)
return json
})
preload.js
const {remote,contextBridge,ipcRenderer} = require('electron');
contextBridge.exposeInMainWorld('myApi', {
fetch:async(url, options)=>await ipcRenderer.invoke('fetch', url, options),
})
renderer.js
window.addEventListener('DOMContentLoaded', async(event) => {
const setting = await Setting.load()
const git = new Git(setting?.github)
const hub = new GitHub(setting?.github)
if (setting?.github?.repo) {
const exists = await git.init(document.getElementById('github-repo').value)
if (!exists) {
const res = await window.myApi.fetch(
`https://api.github.com/user/repos`,
{
'method': 'POST',
'headers': {
'Authorization': `token ${setting.github.token}`,
'User-Agent': `${setting.github.username}`,
'Content-Type': 'application/json',
},
'body': JSON.stringify({
'name': `${setting.github.repo}`,
'description': 'リポジトリの説明',
}),
},
)
console.log(res)
}
}
})