Node.jsでTop-Level Awaitがサポートされ(て)たので、非同期通信と言えばなaxiosで試してみます。
Top-Level Await
今まではawaitを利用する際に、async関数内じゃないと使えませんでしたが、async関数を宣言せずにawaitを使えるようになります。
v14.3.0でサポート、v14.8.0でフラグなし
Top-Level AwaitはNode.js v14.3.0でサポートされましたが、この時点だと--experimental-top-level-await
のフラグを付けて実行する必要がありました。
v14.8.0以降でフラグ無しで利用できます。
axiosで利用してみる
(一応)今回試した環境はNode.js v14.14.0です。
package.jsonに"type": "module"
を追記して利用できます。
また、拡張子をmjsにするだけでも利用できます。↓ではmjsで試してみます。
$ npm init -y
$ npm i axios
-
app.mjs
を作成
ES Modules形式でimportします。
import axios from 'axios';
const res = await axios.get(`https://protoout.studio`);
console.log(res.data);
めちゃシンプルに書けますね。
- 実行
実行も(.jsではなく).mjs
のファイルを実行します。
$ node app.mjs
補足: 今までの書き方
今までだと、CommonJS 形式でモジュールを読み込み、async関数の中でawait呼び出しをするというのが通常だったと思います。
'use strict;'
const axios = require('axios');
(async () => {
const res = await axios.get('https://protoout.studio');
console.log(res.data);
})();
あと'use strict;'
の表記もありますね。ESM形式だとStrictモードがデフォルトで有効なので省略できてます。
こちらは実行は通常通り。
$ node app.js
所感
ちょっとしたことを試す時にasync関数を書くのは結構めんどくさかったので、Top-Level Awaitはありがたいですね。
Common JS(require)からES Modules(impot/from)への移行の流れもあるのでちょっとしたところから慣れていきたい。
.jsを使わずに.mjsを基本とする流れでも良いのかな...? この辺気になります。