1
/
5

【Tech Blog】GameWith の フロントエンド を TypeScript へマイグレーションする

            ※本ストーリーは当社運営の「GameWith Developer Blog」の転載になります。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

はじめに                      

こんにちは!Incremental Stream Team の @53able です!

今回は現在自分が着手中の TypeScript マイグレーション PJ について書いていきたいと思います!

GameWith の JavaScript              

まず GamewWith の JavaScript について紹介していきたいと思います。

JavaScript のボリューム

Cloc というツールを利用し JavaScript のコード行をカウントしてみました。

GitHub - AlDanial/cloc: cloc counts blank lines, comment lines, and physical lines of source code in many programming languages.
cloc counts blank lines, comment lines, and physical lines of source code in many programming languages. Latest release: v1.90 (May 1, 2021) cloc moved to GitHub in September 2015 after being hosted at http://cloc.sourceforge.net/ since August 2006. Step
https://github.com/AlDanial/cloc
brew

経由でインストールし、

cloc ディレクトリ名

を実行すれば、カウントしてくれます。

brew install cloc
cloc /Gamewith

結果は3万6千行でした!

JavaScript のビルドフロー

次に、ビルドフローについて紹介します。

GameWith は Gulp を利用して JavaScript を連結・圧縮しています。

gulp.js
Since 2013, gulp has been the toolkit of choice for developers and designers alike. Not only do we have communities who've relied on us since the beginning, but there's also a constant flow of new users who find out how great their workflow can be with gu
https://gulpjs.com/

GameWith メインリポジトリでは Vue, React といったフレームワークは導入しておらず、jQuery を利用しています。

※GameWithDesignSystem のリポジトリでは Vue を利用しています

GameWithのリプレイスについて vol.2 ~Web Components を Vue で書いたら最高だった編~ #GameWith #TechWith - GameWith Developer Blog
こんにちは!Incremental Stream Team の@53able, @inosy22, @nog です! 前回のブログでは Gamewith で行っているリプレイスの概要について紹介しました。 今回は Web Components を Vueで開発するための、システム( GameWithDesignSystem)を開発したので紹介したいと思います。 Vue で実装したコンポーネントを Web Components として配布をし、どんなプロジェクトでも利用できるコンポーネントを提供するシステム
https://tech.gamewith.co.jp/entry/2020/04/21/185819

TypeScript 化                    

今回 GameWith の3万6千行を一度に TypeScript 化し、リリースするのは現実的ではないと判断しました。

そのため、ファイル単位で TypeScript 化して修正をするという影響範囲を小さくしたマイグレーションのフローにしました。

新しいビルドフロー

TypeScript 化の際に長年積み上げてきた Gulp で行っているビルドフローの改修はとてもリスクが大きいため、Gulp は引き続き利用することにしました。

新しいビルドフローは Gulp の前に TypeScript を割り込ませ、既存のフローをできるだけ変更せず導入を考えています。

JavaScript を中間コードとして扱う発想でこの新しいビルドフローを考えました。

マイグレーションの作業フロー

JavaScript -> TypeScript は

ts-migration

というツールを利用しました。

GitHub - airbnb/ts-migrate: A tool to help migrate JavaScript code quickly and conveniently to TypeScript
ts-migrate is a tool for helping migrate code to TypeScript. It takes a JavaScript, or a partial TypeScript, project in and gives a compiling TypeScript project out. ts-migrate is intended to accelerate the TypeScript migration process. The resulting code
https://github.com/airbnb/ts-migrate

今回マイグレーションの作業フローを作るにあたって、以下の作業を行いました。

1.ts-migration をいくつか適当なファイルに実行
2.生成された TypeScript のファイルを ESLint で整形し既存の JavaScript のファイルと目で差分のチェック
3.次に、自動化したいフローを洗い出すため手動でファイル操作を行いました
 1.ts-migration はフォルダをターゲットに動作するため、変換用フォルダへ JavaScript をコピーする
 2.ts-migration をフォルダ指定で実行し TypeScript へマイグレーション
 3.マイグレーションで変換後の TypeScript を元の JavaScript と同じ場所へコピーする
 4.TypeScript を tsc でコンパイルし、オリジナルの JavaScript が上書きされる ( ここで JavaScript 👉  TypeScript 👉 JavaScript の差分がわかる)
 5.TypeScript 化された JavaScript は ESLint 対象外、ファイルを削除し、.gitignore に追加する

ts-migration は、ディレクトリをターゲットに TypeScript へマイグレーションするので、一旦変換用のディレクトリに作業ファイルをコピーしてマイグレーションを実行するようにしています。

手動で作業を確認後、同等の動作を Node で動作するスクリプトを書き、自動化をしました。

※スクリプトを書く際に js-fire を利用しました

GitHub - hobochild/js-fire: A javascript clone of google/python-fire 🔥
A javascript implementation of google/python-fire js-fire is a library for automatically generating command line interfaces (CLIs) from most js objects. js Fire is a simple way to create a CLI in js. js Fire helps with exploring existing code or turning o
https://github.com/hobochild/js-fire

最終的に完成した自動化のスクリプトは下記のように3つになりました。

// 1. 変換させるたのフォルダへ JavaScript をコピーする
npm run migrate -- start /GameWith/xxx.js

// 2. `ts-migration` をフォルダ指定で実行し TypeScript へマイグレーション
// 3. マイグレーションで変換後の TypeScript を元の JavaScript と同じ場所へコピーする
// 4. TypeScript を `tsc` でコンパイルし、オリジナルの JavaScript が上書きされる
npm run migrate:sync

// 5. TypeScript 化された JavaScript は ESLint 対象外、ファイルを削除し、`.gitignore` に追加する
npm run migrate -- end /GameWith/xxx.js

スクリプトは下記のようなイメージです。

const migration = {
    start: async (jsFile) => {
        // 1. 変換させるたのフォルダへ JavaScript をコピーする
        return jsFile;
    },
    end: async (jsFile) => {
        // 5. TypeScript 化された JavaScript は ESLint 対象外、ファイルを削除し、`.gitignore` に追加する
        return jsFile;
    },
};

fire(migration);

おわりに                       

破壊的なビルドフローの変更ではなく、既存ファイル以前のソースコードを設けることにより、マイグレーションコストを格段に減らしました。

TypeScript へマイグレーションしますが、中間コードが JavaScript なので、既存ファイルと共存は問題ないようにしています。

また、短期間ですべての JavaScript をマイグレーションしてしまうと既存の動いている他案件とコンフリクトし、解消するコストがかなり高くなってしまうため、修正の際に1ファイルずつ案件を担当するエンジニアがマイグレーションできるフローにしました!

まだマイグレーションは始まったばかりですが、完走したいと思います!

☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆

現在、GameWithでは「ゲームをより楽しめる世界を創る」というMissionの下、そんな世界を実現するべく仲間を募集しております。記事をご覧頂き、少しでもご興味を持って頂けましたら嬉しい限りです。

サーバサイドエンジニア
GameWithがPHPが得意なサーバサイドエンジニアを大募集!
----------------------------------------------------------------------- ゲーム業界の発展とゲーマーの地位向上を牽引 ----------------------------------------------------------------------- GameWithは、「ゲームをより楽しめる世界を創る」をミッションに掲げ、「ゲームに熱中し、ゲームで繋がり、ゲームを仕事にし誇れる」ための基盤を作り、ゲーム業界の発展とゲーマーの地位向上を牽引する会社です。 ゲームメディア事業を軸に成長してきた当社は、2013年に創業し、2017年に東証マザーズ上場、2019年には東証一部に市場変更しています。(現在はスタンダード市場) 現在もゲームメディア「GameWith」は月間約5~9億PVを誇る国内最大級のゲームメディアとして成長を続けていますが、当社ではメディア事業にとどまることなく積極的な事業拡大を行っています。 ----------------------------------------------------------------------- GameWithのサービス・事業 ※グループ会社含む ----------------------------------------------------------------------- ・ゲームメディア「GameWith」(https://gamewith.jp/) ・NFTゲーム「EGGRYPTO」(https://eggrypto.com/) ・オンラインゲーム向け光回線「GameWith光」(https://gamewith-hikari.gamewith.co.jp/) ・ゲーム実況クリエイターブランド「GGG-Studio」(https://ggg-studio.com/) ・eスポーツチーム「DetonatioN Focus Me」(http://team-detonation.net/) ・NFTゲームメディア「GameWith NFT」(https://gamewith-nft.jp/) ・ゲーム情報メディア・コミュニティ「アットウィキ」(https://atwiki.jp/) ・合弁会社GameWithARTERIA(https://www.gamewith-arteria.com/) ■当社ホームページ https://gamewith.co.jp/
株式会社GameWith
株式会社GameWithでは一緒に働く仲間を募集しています
1 いいね!
1 いいね!
今週のランキング
株式会社GameWithからお誘い
この話題に共感したら、メンバーと話してみませんか?