フロントエンド開発に役立つモックサーバー構築:@graphql-tools/mock と Faker を使った実践ガイド

2024/12/25に公開

はじめに

フロントエンド開発では、バックエンドが完成する前にUIや機能の開発を進めたいことがよくあります。しかし、バックエンドのAPIがまだ用意されていない段階では、データの取得や操作が難しくなることもあります。そんなときに役立つのがモックサーバーです。

本記事では、モックサーバーを立ち上げるために、GraphQLを使ったバックエンドのモックデータを作成し、@graphql-tools/mock と Faker を活用して、フロントエンド開発をスムーズに進める方法を解説します。これを実現することで、バックエンドのDBが整うまでの間でも、フロントエンドの作業を効率よく進めることができます。

モックサーバーを構築する手順とともに、実際の開発環境での活用例をご紹介しますので、ぜひ実践してみてください。

なお今回はスキーマ定義に関して下記のブログで作成したものを用いて構築していきます。

https://shinagawa-web.com/blogs/typescript-apollo-server-express-mongodb-guide

プロジェクトのセットアップ

モックサーバー用のプロジェクトを新規作成し必要なパッケージをインストールします。

mkdir express-mongodb-graphql-with-typescript
cd express-mongodb-graphql-with-typescript
npm init -y

パッケージのインストール

package.jsonに下記の内容を貼り付けたのちに

  "dependencies": {
    "@apollo/server": "^4.11.3",
    "cors": "^2.8.5",
    "dotenv": "^16.4.7",
    "express": "^4.21.2",
    "graphql": "^16.10.0",
    "graphql-tag": "^2.12.6"
  },
  "devDependencies": {
    "@types/cors": "^2.8.17",
    "@types/express": "4.17.2",
    "@types/express-serve-static-core": "^4.17.21",
    "@types/graphql": "^14.5.0",
    "@types/node": "^22.10.5",
    "ts-node-dev": "^2.0.0",
    "typescript": "^5.7.3"
  }

まとめてパッケージをインストールします。

npm install

GraphQLスキーマの定義

今回はTODOアプリを作成する想定で以下の項目を用意します。

src/graphql/schema.ts
import { gql } from 'graphql-tag';

export const typeDefs = gql`
  scalar Date

  type Todo {
    id: ID!
    title: String!
    isCompleted: Boolean!
    createdAt: Date!
    updatedAt: Date
  }

  type Query {
    todos: [Todo!]
    todo(id: ID!): Todo
  }
`;

併せてカスタムスカラーを定義します。

src/graphql/scalar.ts
import { GraphQLScalarType, Kind } from 'graphql';

export const DateScalar = new GraphQLScalarType({
  name: 'Date',
  description: 'Date custom scalar type',
  serialize(value) {
    if (value instanceof Date) {
      return value.toISOString();
    }
    throw Error('GraphQL Date Scalar serializer expected a `Date` object');
  },
  parseValue(value) {
    if (typeof value === 'number') {
      return new Date(value);
    }
    throw new Error('GraphQL Date Scalar parser expected a `number`');
  },
  parseLiteral(ast) {
    if (ast.kind === Kind.INT) {
      return new Date(parseInt(ast.value, 10));
    }
    return null;
  },
});

モックデータの作成

上記のスキーマに基づいたモックデータを生成するための設定を行います。

パッケージのインストール

npm install @graphql-tools/mock @faker-js/faker
  • @graphql-tools/mock: GraphQL スキーマに基づいてモックデータを生成します。
  • faker: ランダムなデータ(名前、日付、ID など)を生成するためのライブラリです。

https://the-guild.dev/graphql/tools

https://fakerjs.dev/

モックデータ

クエリtodotodosの定義を行なっています。

todosでは10件レスポンスが返るよう設定しています。

src/mocks/mock.ts
import { faker } from '@faker-js/faker';

export const mocks = {
  Todo: () => ({
    title: faker.lorem.sentence(),
    isCompleted: faker.datatype.boolean(),
    createdAt: faker.date.past().toISOString(),
    updatedAt: faker.datatype.boolean() ? faker.date.recent().toISOString() : null,
  }),
  Query: () => ({
    todos: () => Array.from({ length: 10 }),
    todo: () => ({}),
  }),
};

モックサーバーの起動

最後にこれらの定義を用いてApollo Serverを起動します。

PORT番号は8080に設定しています。

src/mockServer.ts
import express from 'express'
import { ApolloServer } from '@apollo/server';
import { expressMiddleware } from '@apollo/server/express4';
import cors from 'cors';

import { addMocksToSchema } from '@graphql-tools/mock';
import { makeExecutableSchema } from '@graphql-tools/schema';
import { typeDefs } from './graphql/schema';
import { mocks } from './mocks/mock';

const schema = makeExecutableSchema({ typeDefs });

const mockedSchema = addMocksToSchema({
  schema,
  mocks,
});

const app = express();
const PORT = 8080;

const server = new ApolloServer({
  schema: mockedSchema,
});

async function startServer() {
  await server.start();
  app.use(
    '/graphql',
    cors(),
    express.json(),
    expressMiddleware(server)
  );

  app.listen(PORT, () =>
    console.log(`Mock GraphQL server running at http://localhost:${PORT}/graphql`)
  );
}

startServer();

動作確認

下記コマンドでサーバーを起動します。

npx ts-node-dev src/mockServer.ts

todosクエリを実行しますと下記のようにレスポンスが返ってきます。

Image from Gyazo

todoクエリもレスポンスが返ってくることが確認できます。

Image from Gyazo

スキーマ定義と幾つかのパッケージを組み合わせるとモックサーバーを起動することが可能となります。

ローカルで起動しておくことでフロントエンドからGraphQLアクセスを行うことができバックエンドの開発を待たずとも実装を進められます。

さいごに

この記事では、GraphQLとExpressを使ってモックサーバーを立て、フロントエンド開発を迅速に進めるための方法を紹介しました。モックサーバーを活用することで、バックエンドの実装が完了する前にフロントエンドの実装を行い、開発効率を大幅に向上させることができます。

さらに、モックデータをランダムに生成するために@faker-js/fakerを使用し、リアルなデータをシミュレートすることで、より実践的な開発環境を提供しました。このようなモックサーバーを活用することで、フロントエンドチームはバックエンドの実装を待つことなく、開発を進めることができ、よりスムーズな連携が可能になります。

フロントエンド開発とバックエンド開発を並行して行いたい場合、モックサーバーは非常に有用なツールとなります。是非、自分のプロジェクトにも取り入れてみてください。

最後まで読んでいただき、ありがとうございました!モックサーバーを使った開発が少しでも効率的に進むことを願っています。

記事に関するお問い合わせ📝

記事の内容に関するご質問、ご意見などは、下記よりお気軽にお問い合わせください。
ご質問フォームへ

技術支援などお仕事に関するお問い合わせ📄

技術支援やお仕事のご依頼に関するお問い合わせは、下記よりお気軽にお問い合わせください。
お問い合わせフォームへ