LoginSignup
17
5

More than 5 years have passed since last update.

CLIアプリをJSON APIとしてデプロイする

Last updated at Posted at 2017-08-30

https://gyazo.com/304c28e7e55f9506374121bbe6de5364

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です。

akameco/babel-plugin-api-over-console
babel-plugin-api-over-console - transfrom to JSON Server from CLI app!!!

このプラグインが行っているのは、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だけでいいので、雑にやる分にはいいのではないでしょうか?

もし気に入ってくれたなら、スターをくれると嬉しいです。

akameco/babel-plugin-api-over-console
babel-plugin-api-over-console - transfrom to JSON Server from CLI app!!!

なにか議論があれば、コメント欄、Twitterで議論しましょう。

本記事は、Medium からの転載です。よかったらフォローしてください。

17
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
5