🛠️

TERASSの開発者体験を向上させる社内ボイラープレートをざっくり解説

2023/07/03に公開

こんにちは、株式会社TERASSでエンジニアをしているiwaseshiです。

今回は、開発者体験を向上させるために社内で提供しているボイラープレートプロジェクト「tera-tera」について紹介します。

tera-teraの概要

tera-teraは、Node.jsエコシステムを活用したボイラープレートプロジェクトであり、新規リポジトリの作成時のテンプレートとして利用できます。

弊社では既に複数のプロジェクトを持ち、それらはすべてNode.js系の技術を活用しています。

tera-teraは、これらのプロジェクトで蓄積された知識をボイラープレートとして集約し、新規開発時の開発者体験を向上させることを目的としています。

tera-teraが提供する開発者体験

tera-teraは、アプリケーション開発に必要な機能や仕組みを初期状態から提供し、"開発を始めるための開発"といった準備作業を軽減します。

具体的には、以下の3つの主要な機能を提供し、これによりフルスタックフレームワークを利用しているかのような開発者体験を実現します。

  • スケルトンプロジェクトの提供
  • アプリケーションの共通コンポーネントの提供
  • 開発環境構築/テスト/ビルドの仕組み

また、tera-teraではモノレポ構成を採用しており、各アプリケーションをappsディレクトリで管理し、共通機能をpackagesディレクトリで管理しています。

スケルトンプロジェクト (apps) の提供

tera-teraは、開発を始めるための基本的なプロジェクト構造を提供します。

以下のアプリケーションをスケルトンとして提供しており、プロジェクトに適したものを選択して使用することができます。

  • cli
  • functions
  • express-api
  • next-web
  • vite-web

これらのアプリケーションはtera-teraによって初期セットアップされ、開発者はビジネスロジックの実装に集中することができます。

また、各アプリケーションは独立しており、不要なものを削除しても他に影響を与えません。

cli

cliアプリケーションは、各プロジェクトで使用するコマンドラインツールです。データの生成やアプリケーションのランナーなど、プロジェクト固有のスクリプトの実装に使用されます。cliアプリケーションの開発には、Node.jsの豊富なパッケージエコシステムが活用されます。

functions

functionsアプリケーションは、Cloud Functions上で動作するバックエンドアプリケーションです。バッチ処理や軽量なサーバーサイドの機能実装に使用されます。functionsアプリケーションでは、クラウドプロバイダが提供する環境での開発とデプロイを行うため、サーバーレスなアーキテクチャが実現されます。

express-api

express-apiアプリケーションは、Expressフレームワークを使用したバックエンドアプリケーションです。主に後述のnext-webアプリケーションなどで使用するサーバーサイドの機能実装に使用されます。express-apiアプリケーションでは、APIとしての機能提供を行うために、tRPCを採用しています。tRPCは、型安全なAPI通信を実現するライブラリです。

next-web

next-webアプリケーションは、Next.jsフレームワークを使用したフロントエンドアプリケーションです。動的なWebアプリケーションの作成に使用されます。Next.jsは、SSR(サーバーサイドレンダリング)やSSG(静的サイトジェネレート)などの強力な機能を提供し、パフォーマンスに優れたWebアプリケーションを構築することができます。

vite-web

vite-webアプリケーションは、Viteビルドツールを使用したフロントエンドアプリケーションです。静的なWebページの作成に使用されます。Viteは、高速な開発サーバーと効率的なビルドプロセスを提供し、リアルタイムな開発体験を実現します。

アプリケーションの共通コンポーネント (packages) の提供

tera-teraは、アプリケーション開発における共通のコンポーネントを提供します。これらのコンポーネントは、ログ出力やAPI通信などの一般的な機能に焦点を当て、モジュラー化されています。これにより、プロジェクト間でのコンポーネントの再利用性が高まります。

以下はtera-teraが提供する主な共通コンポーネントの一部です。(他にもあります)

eslint-config

eslint-configパッケージは、各アプリケーションで使用されるESLintの設定を含むJSONファイルを管理しています。これにより、コードの品質や一貫性の向上に役立ちます。

logger

loggerパッケージは、高性能なログ生成ライブラリであるpinoを使用して共通のログ機能を提供します。pinoは非常に高速でありながら、JSON形式のログ出力を行い、可読性と拡張性を両立させます。また、ログレベルの設定やログの書式設定など、豊富なカスタマイズオプションを提供します。

また、このパッケージはGoogle Cloud Platform (GCP) 上でのアプリケーション開発に最適化されています。

開発環境構築/テスト/ビルドの仕組み

tera-teraでは、効率的な開発環境構築とテスト、ビルドの仕組みを提供しています。以下の機能やツールを活用することで、開発プロセスをスムーズに進めることができます。

turborepo

ビルドツールとしてturborepoを採用しています。turborepoは、JavaScript系のモノレポ環境を対象とした高速なビルドツールです。キャッシュを利用して差分がある箇所のみのビルドを行い、ビルド時間を大幅に短縮します。また、複数のタスクを並列で実行できるため、開発プロセスの並行性を高めます。

tera-teraのプロジェクトでは、turborepoを使用してアプリケーションのビルドやテストを実行することができます。

Remote Container

開発環境の構築を簡素化するために、VSCodeのRemote Containerを活用しています。Remote Containerを使用することで、Dockerベースの開発環境を簡単にセットアップできます。開発環境をコンテナ化することで一貫性のある環境を提供し、開発者の環境構築の手間を軽減します。

Remote Containerを使用しない場合でも、tera-teraはcorepackを有効にし、ローカル環境のパッケージマネージャのバージョンを揃えることで、開発環境の整合性を確保します。

vitest

高速なテストランナーであるvitestを採用しています。vitestは、Viteエコシステム内で動作し、テストケースを一度だけコンパイルし、その後はキャッシュから読み込むことでテストの実行時間を大幅に削減します。また、各テストケースを分離した環境で並列に実行することができ、大規模なテストスイートでも高速なフィードバックを提供します。

vitestは、テストケースのキャッシュ、並列実行、カスタマイズ可能な設定などの機能を提供しています。開発者は自身のプロジェクトに最適なテストランナーの設定を行うことができます。

これらのテスト/ビルドの仕組みを活用することで、開発者は効率的な開発プロセスを実現し、品質の高いアプリケーションを構築することができます。

おわりに

弊社では開発者体験の向上に取り組んでおり、tera-teraはその一環です。
今回はコンセプトや使用技術についてざっくりと説明しましたが、Node.jsをベースとしたアプリケーション開発の参考になれば幸いです。

最後まで読んでいただきありがとうございました。

P.S.

開発者体験向上に関心や興味がある方、TERASSについてもっと知りたい方は、ぜひカジュアルにお話しましょう!

Terass Tech Blog

Discussion