GraphQL(Backend)を試した
TypeScriptで作ってみるシリーズの作業ログです。
今回はGraphQLを試してみます。
前回まではこちらです。Backendの処理のWeb化まで行なっています。
とりあえずGraphQLを試す
まずはGraphQLに慣れるため、簡易なGraphQL serverをNode.jsで作ります。
graphql-yogaを使います。
npm install --save graphql-yoga
GraphQLのスキーマ定義やリゾルバを実装します。
index.js
const { GraphQLServer } = require('graphql-yoga') const typeDefs = ` type Query { info: String! } ` const resolvers = { Query: { info: () => `This is the API of a Hackernews Clone` } } const server = new GraphQLServer({ typeDefs, resolvers, }) server.start(() => console.log(`Server is running on http://localhost:4000`))
type Query
でGraphQLのクエリを定義しています。
resolvers
はクエリに対しての実際の処理になります。
ここでは単純にThis is the API of a Hackernews Clone
という文字列を返しています。
GraphQL serverを起動します。
node index.js
localhost:4000
をブラウザで開きます。
以下のクエリを実行します。
query { info }
クエリ結果が表示されます。
WebAPIをGraphQL化する
GraphQL対応
GraphQLに対応するために以下のように変更しました。
前述の簡易的に作った方法とあまり変わりません。
index.ts
import { GraphQLServer } from 'graphql-yoga'; import { main } from './main'; const resolvers = { Query: { get: () => main().then(v => v), info: () => `This is the API of a Hackernews Clone`, }, }; const server = new GraphQLServer({ resolvers, typeDefs: './dist/schema.graphql', }); const port = process.env.PORT || '3000'; server.start({ port }, () => console.info(`API running on localhost:${port}`));
スキーマ定義は別ファイルにしています。
schema.graphql
type Query { info: String! get: [Qiita] } type Qiita { rendered_body: String body: String coediting: Boolean comments_count: Int created_at: String group: Group id: String likes_count: Int private: Boolean reactions_count: Int tags: [Tag] title: String updated_at: String url: String user: User page_views_count: Int } type Tag { name: String versions: [String] } type User { description: String facebook_id: String followees_count: Int followers_count: Int github_login_name: String id: String items_count: Int linkedin_id: String location: String name: String organization: String permanent_id: Int profile_image_url: String team_only: Boolean twitter_screen_name: String website_url: String } type Group { created_at: String id: Int name: String private: Boolean updated_at: String url_name: String }
そのほかにDockerfile
、package.json
、tsconfig.json
を修正しています。
実行
クライアント側のクエリの内容に応じて結果が返ります。
ここでは、ユーザの名前と記事のタイトル名のみを取得しています。
クエリを変えることで取得するデータを変えることができるのが面白いです。
最終的なプログラムはこちらです。
まとめ
GraphQLをベースとしたスキーマ駆動開発は便利そうです。
OpenAPIなどもありますが、GraphQLはAPIの定義がシンプルなので開発者体験も良さそうです。
参考
こちらを参考にしました。
www.howtographql.com
2018年で学んだ技術
今年を振り返る的な投稿です。
今年も色々学べました。ただ技術の進歩が早すぎて学んでも学んでもより良いものが出てきてしまいますね。それを楽しめるようになってこそのエンジニアなのかもしれません。
パブリッククラウド
- AWS
- Amazon Rekognitionで人物の画像処理
- Athenaを使ったRekognitionによる人物データの分析
- Firehoseを使ってのデータ収集基盤の構築
- EC2、Lambda、S3の扱い方
- Azure
- Cognitive ServicesのFace API試用
Azure来るだろうと思って昨年はよく学習してましたが、あまりAzureは来ませんでした。やはりAWSの需要が大きい。
画像処理
クラウドサービスを含めた画像処理についてはこの記事で言及 hi1280.hatenablog.com
Webフロントエンド
- AngularとFirebaseでWebアプリ作成
- PWAの理解と試用
- React、Vue.jsを試用
- Reduxライクな状態管理を試用
コンテナ技術
- Docker、Docker Compose、Kubernetesを試用
- サンプルのWebアプリを動作させてみる
IoT
- Amazon EchoからAWS IoTを使ってラズパイを操作
まとめ
来年のテクノロジ・トレンドがガートナーから発表されています。 enterprisezine.jp
概ね昨年と傾向は変わらず、AI、IoT、MR、ブロックチェーンのようです。
量子コンピューティングは気になります。
来年は何をしようかな。
コードが公開されているAngularの使用例をまとめてみた
モチベーション
Vue.jsのドキュメントにある使用例(https://jp.vuejs.org/v2/examples/)の内容が魅力的だったので、Angularにもそういうものがないかを探してみました。
実際に動くものを見ると、どんなことができるのかイメージできるので良いと思っています。
使用例の紹介
Tour of Heroes
Angular公式ドキュメントのチュートリアルです。まずはこれでAngularの基本を学びつつ、どんな風に作って、どんなことが出来るかを理解できると思います。
Angular+Firebaseでチャットアプリを作る
AngularからFirebaseを使うための内容が細かく解説されています。Firebaseを使うことやNgRxの説明など一通りAngularの基本的なことを学んだ人の次のステップとして学んでおくと良いことが色々載っていると思います。
チュートリアル形式で学べるようになっています。2018年12月15日の時点でまだ未完のようです。
Angular RealWorld Example App
Mediumのクローンアプリです。モジュールの分け方などAngular公式のスタイルガイドに則って作られているちゃんとしたアプリなので学べるものが多いです。
Tour of Heroesを一通り実施した人が実用的なアプリを作りたい時に参考になるアプリだと思います。認証処理が参考になります。
Angular NgRx Material Starter
Angular+NgRx+Angular Materialを使って作成されたスタータープロジェクトです。
NgRxが全面的に使われていてNgRxを学びたい人にとっては参考になる内容だと思います。
以下の内容が盛り込まれています。
- カスタムテーマのサポート (4つのテーマがある)
- フィーチャーモジュールの遅延ロード
- ローカルストレージでの画面状態の永続化
@ngrx/effects
によるAPIリクエストの発行- レスポンシブデザイン対応
- angular-material and custom components in
SharedModule
- Angular Materialと
SharedModule
内にカスタムコンポーネントを配置 - CypressによるE2Eテスト
- プロダクション向けDockerfileによるアプリ公開
E2Eテストが用意されているのは珍しいと思います。
Hackernews clone using Angular 5
シンプルかつ実用的なアプリになっているのが良いです。Angular5なので若干古いです。
TuneIn
おしゃれなアプリです。こちらもシンプルかつ実用的なアプリです。Angular6なので比較的新しいです。
Angular公式サイト
Angularの公式サイトですが、実はAngularで作られています。コードも見ることができます。
流石に作り込まれている感じでパッと見ではよく分かりません。
dgeniというドキュメントを生成するツールが使われているようです。
Angular Console
Angular CLIの機能+αをGUIで使えるようにしたプロダクトです。
Nxという大規模組織向けのAngularプロジェクト構成ツールが使われているため、通常のAngularプロジェクト構成とは異なるので理解しにくいところがあります。
NxはAngular Consoleを作った会社が作っているライブラリのようです。
ElectronやGraphqlを利用しているのが注目ポイントだと思います。
まとめ
とりあえずアプリケーションっぽいものを集めました。コードが公開されているものを前提にしたのでだいぶ限定されました。
Angularが使用されているところを調べてみると色々なところで使われているんだなぁということが分かりました。
https://www.madewithangular.com/
サンプルやUI部品での使用例を集めるのも良さそうです。