console.logだけでAPIを構築する
さて、百聞一見にしかずなので、console.logのみでAPIを構築していきましょう。
とりあえず、--nameでユーザ名が渡されたらそのユーザのプロダクトが配列で返ってくるようなCLIアプリを書いてみます。
$ mkdir cli-app-demo
$ cd cli-app-demo
$ yarn init -y
$ touch cli.js
コマンドラインパーサをインストールしましょう。
substack製のminimistの方が多機能でユーザも多いですが、軽量なのでmriもおすすめです。
$ yarn add mri // or minimist
cli.js
'use strict'
const parse = require('mri') // or require('minimist')
// node cli.js --name tj
const { name } = parse(process.argv.slice(2))
// 適当なJSON
const jsers = {
tj: ['express', 'koa', 'mocha', 'stylus', 'co'],
sindersorhus: ['ava', 'chalk', 'xo', 'yaomen'],
rauchg: ['socket.io', 'next.js'],
kittens: ['babel', 'yarn'],
gaearon: ['redux', 'creaet-react-app'],
substack: ['browserify', 'tape'],
}
console.log(jsers[name] || jsers)
$ node cli.js --name tj
[ 'express', 'koa', 'mocha', 'stylus', 'co' ]
$ chmod +x cli.js
$ cli.js --name kittens
[ 'babel', 'yarn' ]
よさそうです。
それにしてもtjはやばい。
さて、準備は整ったのでAPIサーバへと変換しましょう。
といっても、cli-to-api
を叩くだけです。
$ yarn add cli-to-api
$ yarn run cli-to-api cli.js -o server.js
$ node server.js
listening on 3000
$ curl localhost:3000?name=tj
["express","koa","mocha","stylus","co"]
グレート!
CLIツールを書いているつもりがAPIサーバが完成しました。
クエリなしのシンプルな例やfsを使って外部ファイルを読み込むサンプルがあるので、確認してみてください。あと、よかったらスターください。
デプロイ
よくこういう状況があります。
「今から3分以内にこのクエリでこんなjsonを返すAPIをつくって公開して。時間厳守ね。」
こんなときは、upを使って秒でデプロイしましょう。
apex/up
up - Deploy infinitely scalable serverless apps, apis, and sites in seconds.github.com
upはtj製のサーバーレス構築ツールです。
up.jsonを用意してupと叩けばアプリケーションがAWS Lambdaにデプロイされ、一瞬で全世界にAPIが公開されます。
初回は構成があるので20秒ぐらいかかりますが、以降は5秒ぐらいでデプロイできるので最高です。
100万リクエストまで無料なので50個ぐらい雑なAPIたててるけど今のところ無料で使えているので、こういう感じのAPIはどんどんAWS Lambdaにデプロイすればいいと思います。
さて、up.jsonの作成ですが、touch-altを使い時短します。
これはtouchで新規ファイルを作成する際、テンプレートが登録されているファイルを代わりに作成します。
これでup.jsonの雛形ができました。
あとはupするだけ。
$ touch up.json
{
"name": "console-api"
}
up url
でデプロイ先のurlが取得できるので、展開してcurlに食べさせます。
$ up
$ curl `up url`?name=tj
["express","koa","mocha","stylus","co"]
これで、無事にconsole.logのみをJSON APIとしてデプロイできました。
upについて詳しく知りたい人は、GitHubやtj本人の記事などを見てください。
あと、touch-alt、readmeとか.babelrcの雛形生成するのに便利なので使ってください。
akameco/touch-alt
touch-alt - Create from a template instead of a new file
How to Work?
さて、どのようにして動いているでしょうか?
一言で言うと、Babelでトランスパイルしているだけです。
それを行っているプラグインがbabel-plugin-api-over-consoleです。
このプラグインが行っているのは、console.log
の変換とprocess.argv
の変換です。
そして、babel-templateを用いて、処理をexpressのapp.get('/', callback)
のコールバックでラップします。
それほど難しい処理はしてないので、あとはコードを見てください。
個人的にはjQueryを書くよりBabel Pluginを書く方が楽ですね。
さて、Babel Pluginの詳しい話ですが、Web上に良い資料があるのでそれを参考にするとよいです。
まずは、thejameskyle先生のBabel Handbookに目を通すのがよいと思います。
https://github.com/thejameskyle/babel-handbook/blob/master/translations/en/plugin-handbook.md
astexplorerを使うと非常に直感的に理解ができてよいです。
https://astexplorer.net/
Babel Pluginのテストは、babel-plugin-testerを使うとよいです。
snapshotテストで簡単にテストできます。
babel-plugin-api-over-consoleでも使っているので参考にしてください。
https://github.com/babel-utils/babel-plugin-tester
また、consoleでASTを確認するのにbabel-logを使うと便利です。
https://github.com/babel-utils/babel-log
他の知見としては、BabelのレポジトリからFlowtypeの型定義ファイルを持ってくると開発がスムーズです。
https://github.com/babel/babel/blob/7.0/lib/types.js
babel公式のAPIについてのドキュメントも必須です。
こちらをにらめっこしながら書くことになると思います。
しかし、コメントまわりなどの処理を書こうとするとここに載っていないAPIを使うことになり、Babelのコードの読みに行く必要があります。
https://babeljs.io/docs/core-packages/babel-types/
おわりに
いちいちexpressでlocalhostで出力確認とかしないでconsole.logだけでいいので、雑にやる分にはいいのではないでしょうか?
もし気に入ってくれたなら、スターをくれると嬉しいです。
なにか議論があれば、コメント欄、Twitterで議論しましょう。
あ、ありのまま今起こったことを話すぜ。
— 無職.js (@akameco) 2017年8月29日
「CLIアプリをJSON APIとしてデプロイできるようになった。」
な、何を言っているのかわからねーと思うが、俺も何をしたいかわからないhttps://t.co/1lBV45NO8o pic.twitter.com/WhDnSUFH1k
最高の開発環境を見てくれ pic.twitter.com/eHom7QO2F3
— 無職.js (@akameco) August 30, 2017
本記事は、Medium からの転載です。よかったらフォローしてください。