1
/
5

開発環境改善化プロジェクト - VSCode編

Photo by Luke Chesser on Unsplash

はじめに

PREVENTでフロントエンドエンジニアをやっている伊賀本です。

私達は、Mystarという高血圧/脂質異常症/糖尿病の治療中の方を対象にした重症化予防支援事業「Mystar」を運営しており、その中でユーザー管理WebアプリのMystarProというものを開発しています。

日々開発業務を行う中で、VSCodeの動作が重くなる問題に直面したので今回はその問題をどう解決したかについて書いていこうと思います。

直面した問題

前項でも書いた通り、VSCodeの動作が重く、TypeScriptのLintの警告表示が、問題があるのに表示されなかったり、問題がないのに表示されたりということが発生していました。

また、補完が効いてくれないこともあり、開発業務に大きな支障をきたしていました。

暫定対応として ウィンドウの再読み込みをしていましたが、都度再読み込みを行っていると開発効率が落ち、ストレスも溜まるため、根本的な解決に乗り出しました。

VSCodeを手軽にリロードする為のショートカット - Qiita
Why not register and get more from Qiita?
https://qiita.com/Naturalclar/items/ae9e84fa8cf16a14c7e9

原因の究明

この問題をフロントエンドエンジニアのチームMTGで相談したところ、業務委託メンバーから「このあたりが怪しいかも」という情報をいただいたので、まずはそこを調査しようということになりました。

怪しい部分のコードの1部は下記の通りです。

export type FasyItemInArray<ArrayType extends unknown[]> = ArrayType[number];

type UnionToIntersection<U> = (U extends any
? (k: U) => void
: never) extends (k: infer I) => void
  ? I
  : never;

type RecursivePicker<T> = {
  [K in keyof T]?: T[K] extends object | undefined | null
    ? RecursivePicker<T[K]>
    : true;
};

export type _RecursivePick<T, KO extends RecursivePicker<T>> = Pick<
  {
    [K in keyof T]: K extends keyof KO
      ? KO[K] extends true
        ? T[K]
        : KO[K] extends infer KOK
        ? KOK extends RecursivePicker<T[K]>
          ? RecursivePick<T[K], KOK>
          : T[K] extends infer TKArray
          ? TKArray extends unknown[]
            ? RecursivePick<FasyItemInArray<TKArray>, KOK>[]
            : never
          : never
        : never
      : never;
  },
  keyof T & keyof KO
>;

export type RecursivePick<T, KO> = UnionToIntersection<T> extends never
  ? Maybe<_RecursivePick<NonNullable<T>, KO>>
  : _RecursivePick<T, KO>;

以下、こちらのコードのことをRecursivePickとします

コードの内容としては、バックエンド側で採用している99designs/gqlgenがFragmentsが未対応だったため、型情報をprivate registry経由で読み込み、上記のRecursivePickで型を生成しています。

GitHub - 99designs/gqlgen: go generate based graphql server library
gqlgen is a Go library for building GraphQL servers without any fuss. gqlgen is based on a Schema first approach - You get to Define your API using the GraphQL Schema Definition Language. gqlgen prioritizes Type safety - You should never see map[string]in
https://github.com/99designs/gqlgen

開発が進むにつれqueryやmutationが増大し、RecursivePickで型の解決ができず、TS Serverが落ちてしまっているのではないか、という仮説を立てました

対策した内容

プロダクトの成長に伴いRecursivePickでの型生成に限界を感じたため、別の方法で型を生成できないか調査しました。

調査の結果graphql code generatorを使ってフロント側で型生成を行っておく方法がよさそうだったため、今回はこちらを導入し対策を行います。

GraphQL Code Generator
Generate code from your GraphQL schema and operations with a simple CLI Generate code from your GraphQL schema and GraphQL operations with a single function call regardless of your environment or code format. Generate code from your GraphQL schema and Gra
https://www.graphql-code-generator.com/

プラグインの導入

MystarProはNuxt.js, TypeScriptで開発しているので、それに合わせてプラグインを導入していきます。

今回使用したプラグインは以下の通りです。

TypeScript | GraphQL Codegen Plugin Hub
This plugin generates the base TypeScript types, based on your GraphQL schema. The types generated by this plugin are simple, and refers to the exact structure of your schema, and it's used as the base types for other plugins (such as typescript-operation
https://www.graphql-code-generator.com/plugins/typescript
TypeScript Operations | GraphQL Codegen Plugin Hub
This plugin generates TypeScript types based on your GraphQLSchema and your GraphQL operations and fragments. It generates types for your GraphQL documents: Query, Mutation, Subscription and Fragment. Note: In most configurations, this plugin requires you
https://www.graphql-code-generator.com/plugins/typescript-operations

設定ファイルの作成

設定ファイルを作成していきます。先程紹介したプラグインや対象ファイル、スキーマなどを設定していきます。

今回スキーマはバックエンドの本番のものを使用しました。

もちろんAuthorizationの設定が必要となるので、型生成の際には、自身でログインした際に生成されるaccess_tokenを使用して型を生成することになります。

overwrite: true
schema:
  - {本番のAPIのURL}/query:
      headers:
        Authorization: "{access_token}"
documents:
  - src/**/*.{vue,ts}
  - src/store/*.ts
generates:
  src/__generated__/types.ts:
    plugins:
      - "typescript"
      - "typescript-operations"
    config:
      maybeValue: "T | null"
      enumsAsTypes: true
      scalars:
        ID: "number"

クエリの用意

ここまでできたら、型を生成したいクエリを .vue ファイルに記述していきます。

export const UserCard = gql`
  fragment UserCard on UserProgramDetail {
    user {
      ID
      firstName
      lastName
    }
  }
`;

型生成

該当の.vueファイルがcodegen.ymldocumentsで指定されているのを確認して、codegenしてみます。

$ yarn graphql-codegen --config codegen.yml

そうすると該当の型が生成されます。

export type UserCardFragment = {
  __typename?: 'UserProgramDetail';
  user: {
    __typename?: 'UserDetail';
    ID: number;
    firstName: string;
    lastName: string;
  };
};

効果

導入以前はTS Serverが頻繁にクラッシュしていましたが、導入を行って以降はほぼ発生しなくなりました。

また、長時間VSCodeを立ち上げていると発生頻度が上がる傾向がありましたが、長時間でも問題なく開発が行えています。

ファンが全開で回ってPCが熱くなることも起きなくなりました。

それだけでも、大きな効果と言えます。

今後は

上記の改善を行ったのですがまだ完璧ではなく、同じクエリを別のコンポーネントで使用している場合、Fragment名が被ってしまい、どの型を参照しているのかわからないという問題があります。

ですので、一意なFragment名にするためのルールが必要となります。

なので今後はこのような問題を改善するためにはどのようなルールが必要なのか検討してどのように運用していくか、また記事にできたらと思います。

まとめ

以上が、今回行った開発環境の改善となります。

一口にVSCodeが重いと言っても色んな状況があるので、調査したり、懸念点を潰していったりと、色んな方法があるとは思いますが、もし現在の環境に不満がある場合は、よりよい環境で開発するために、改善活動を行ってみてはいかがでしょうか!

最後に

現在、PREVENTではフロントエンドエンジニアを募集しています!

  • Vue.js / Nuxt.js / TypeScriptでバリバリ開発したい方
  • 技術力のあるエンジニアからレビューをもらって自らの技術力の底上げをしたい方
  • リモートワークでライフバランスを取りながら開発したい方
  • 社会課題の解決にチャレンジしたいフロントエンドエンジニアの方
  • 急成長中のスタートアップで挑戦してみたい方
  • 名古屋から、一流のエンジニアになりたい、日本で代表されるサービスを作りたい方

どれかに当てはまった方は是非チェックしてカジュアルにお話しましょう!

フロントエンドエンジニア
Vue.jsを使用し、さらなるスキルアップを目指すフロントエンドを募集!
[Mystar(重症化予防支援事業)] 高血圧/脂質異常症/糖尿病の治療中の方を対象にした6ヶ月間の遠隔での医療相談サービスを健康保険組合向けに提供しています。 生活習慣改善をサポートすることで、脳梗塞や心筋梗塞といった重症疾患の再発・重症化の予防に取り組んでいます。 [Myscope(データ解析事業)] レセプトデータや特定健診データなどの医療データ解析を行っています。名古屋大学と共同開発したアルゴリズムを用いて生活習慣病の重症化や疾病発症の予測シュミレーションを行っています。 [参考記事] ***弊社のニュースリリース*** ★住友生命によるPREVENTの株式取得・子会社化を発表 https://prevent.co.jp/news/20231208/%e4%bd%8f%e5%8f%8b%e7%94%9f%e5%91%bd%e3%81%ab%e3%82%88%e3%82%8bprevent%e3%81%ae%e6%a0%aa%e5%bc%8f%e5%8f%96%e5%be%97%e3%83%bb%e5%ad%90%e4%bc%9a%e7%a4%be%e5%8c%96%e3%82%92%e7%99%ba%e8%a1%a8 重症化予防に特化したスマホアプリMystarをリリースしました。 http://thebridge.jp/2018/08/mystar 愛知県内14の健康保険組合さまとコンソーシアムの立ち上げについて掲載頂きました。 https://www.nikkei.com/article/DGXMZO34631260X20C18A8L91000/ https://tech.nikkeibp.co.jp/dm/atcl/news/16/082811437/?ST=health MorningPitchに弊社代表萩原が登壇しました。 http://morningpitch.com/startups/7693/ 野村HD主催アクセラレータプログラム「VOYAGER」に採択されました。 http://accelerator.nomura.co.jp/index.html 経産省主催ジャパン・ヘルスケアビジネスコンテスト2018で優秀賞を受賞しました。 http://techon.nikkeibp.co.jp/atcl/feature/15/327442/012300158/?ST=health&amp;amp;P=3
PREVENT
テックリード
急成長中のヘルステック企業のテックリードを募集!
[Mystar(重症化予防支援事業)] 高血圧/脂質異常症/糖尿病の治療中の方を対象にした6ヶ月間の遠隔での医療相談サービスを健康保険組合向けに提供しています。 生活習慣改善をサポートすることで、脳梗塞や心筋梗塞といった重症疾患の再発・重症化の予防に取り組んでいます。 [Myscope(データ解析事業)] レセプトデータや特定健診データなどの医療データ解析を行っています。名古屋大学と共同開発したアルゴリズムを用いて生活習慣病の重症化や疾病発症の予測シュミレーションを行っています。 [参考記事] ***弊社のニュースリリース*** ★住友生命によるPREVENTの株式取得・子会社化を発表 https://prevent.co.jp/news/20231208/%e4%bd%8f%e5%8f%8b%e7%94%9f%e5%91%bd%e3%81%ab%e3%82%88%e3%82%8bprevent%e3%81%ae%e6%a0%aa%e5%bc%8f%e5%8f%96%e5%be%97%e3%83%bb%e5%ad%90%e4%bc%9a%e7%a4%be%e5%8c%96%e3%82%92%e7%99%ba%e8%a1%a8 重症化予防に特化したスマホアプリMystarをリリースしました。 http://thebridge.jp/2018/08/mystar 愛知県内14の健康保険組合さまとコンソーシアムの立ち上げについて掲載頂きました。 https://www.nikkei.com/article/DGXMZO34631260X20C18A8L91000/ https://tech.nikkeibp.co.jp/dm/atcl/news/16/082811437/?ST=health MorningPitchに弊社代表萩原が登壇しました。 http://morningpitch.com/startups/7693/ 野村HD主催アクセラレータプログラム「VOYAGER」に採択されました。 http://accelerator.nomura.co.jp/index.html 経産省主催ジャパン・ヘルスケアビジネスコンテスト2018で優秀賞を受賞しました。 http://techon.nikkeibp.co.jp/atcl/feature/15/327442/012300158/?ST=health&amp;amp;P=3
PREVENT

また、フロントエンドエンジニアではない方の募集もありますので、是非ご覧ください!

マネージャー/幹部候補
テクノロジーの力でヘルスケアの課題解決に取り組みたいPdM募集!
[Mystar(重症化予防支援事業)] 高血圧/脂質異常症/糖尿病の治療中の方を対象にした6ヶ月間の遠隔での医療相談サービスを健康保険組合向けに提供しています。 生活習慣改善をサポートすることで、脳梗塞や心筋梗塞といった重症疾患の再発・重症化の予防に取り組んでいます。 [Myscope(データ解析事業)] レセプトデータや特定健診データなどの医療データ解析を行っています。名古屋大学と共同開発したアルゴリズムを用いて生活習慣病の重症化や疾病発症の予測シュミレーションを行っています。 [参考記事] ***弊社のニュースリリース*** ★住友生命によるPREVENTの株式取得・子会社化を発表 https://prevent.co.jp/news/20231208/%e4%bd%8f%e5%8f%8b%e7%94%9f%e5%91%bd%e3%81%ab%e3%82%88%e3%82%8bprevent%e3%81%ae%e6%a0%aa%e5%bc%8f%e5%8f%96%e5%be%97%e3%83%bb%e5%ad%90%e4%bc%9a%e7%a4%be%e5%8c%96%e3%82%92%e7%99%ba%e8%a1%a8 重症化予防に特化したスマホアプリMystarをリリースしました。 http://thebridge.jp/2018/08/mystar 愛知県内14の健康保険組合さまとコンソーシアムの立ち上げについて掲載頂きました。 https://www.nikkei.com/article/DGXMZO34631260X20C18A8L91000/ https://tech.nikkeibp.co.jp/dm/atcl/news/16/082811437/?ST=health MorningPitchに弊社代表萩原が登壇しました。 http://morningpitch.com/startups/7693/ 野村HD主催アクセラレータプログラム「VOYAGER」に採択されました。 http://accelerator.nomura.co.jp/index.html 経産省主催ジャパン・ヘルスケアビジネスコンテスト2018で優秀賞を受賞しました。 http://techon.nikkeibp.co.jp/atcl/feature/15/327442/012300158/?ST=health&amp;amp;P=3
PREVENT
バックエンドエンジニア
ヘルスケアベンチャーでGolangを使用するバックエンドエンジニア募集!
[Mystar(重症化予防支援事業)] 高血圧/脂質異常症/糖尿病の治療中の方を対象にした6ヶ月間の遠隔での医療相談サービスを健康保険組合向けに提供しています。 生活習慣改善をサポートすることで、脳梗塞や心筋梗塞といった重症疾患の再発・重症化の予防に取り組んでいます。 [Myscope(データ解析事業)] レセプトデータや特定健診データなどの医療データ解析を行っています。名古屋大学と共同開発したアルゴリズムを用いて生活習慣病の重症化や疾病発症の予測シュミレーションを行っています。 [参考記事] ***弊社のニュースリリース*** ★住友生命によるPREVENTの株式取得・子会社化を発表 https://prevent.co.jp/news/20231208/%e4%bd%8f%e5%8f%8b%e7%94%9f%e5%91%bd%e3%81%ab%e3%82%88%e3%82%8bprevent%e3%81%ae%e6%a0%aa%e5%bc%8f%e5%8f%96%e5%be%97%e3%83%bb%e5%ad%90%e4%bc%9a%e7%a4%be%e5%8c%96%e3%82%92%e7%99%ba%e8%a1%a8 重症化予防に特化したスマホアプリMystarをリリースしました。 http://thebridge.jp/2018/08/mystar 愛知県内14の健康保険組合さまとコンソーシアムの立ち上げについて掲載頂きました。 https://www.nikkei.com/article/DGXMZO34631260X20C18A8L91000/ https://tech.nikkeibp.co.jp/dm/atcl/news/16/082811437/?ST=health MorningPitchに弊社代表萩原が登壇しました。 http://morningpitch.com/startups/7693/ 野村HD主催アクセラレータプログラム「VOYAGER」に採択されました。 http://accelerator.nomura.co.jp/index.html 経産省主催ジャパン・ヘルスケアビジネスコンテスト2018で優秀賞を受賞しました。 http://techon.nikkeibp.co.jp/atcl/feature/15/327442/012300158/?ST=health&amp;amp;P=3
PREVENT
Androidエンジニア
アプリ開発Androidエンジニア募集!予防医療を行うヘルスケアベンチャー
[Mystar(重症化予防支援事業)] 高血圧/脂質異常症/糖尿病の治療中の方を対象にした6ヶ月間の遠隔での医療相談サービスを健康保険組合向けに提供しています。 生活習慣改善をサポートすることで、脳梗塞や心筋梗塞といった重症疾患の再発・重症化の予防に取り組んでいます。 [Myscope(データ解析事業)] レセプトデータや特定健診データなどの医療データ解析を行っています。名古屋大学と共同開発したアルゴリズムを用いて生活習慣病の重症化や疾病発症の予測シュミレーションを行っています。 [参考記事] ***弊社のニュースリリース*** ★住友生命によるPREVENTの株式取得・子会社化を発表 https://prevent.co.jp/news/20231208/%e4%bd%8f%e5%8f%8b%e7%94%9f%e5%91%bd%e3%81%ab%e3%82%88%e3%82%8bprevent%e3%81%ae%e6%a0%aa%e5%bc%8f%e5%8f%96%e5%be%97%e3%83%bb%e5%ad%90%e4%bc%9a%e7%a4%be%e5%8c%96%e3%82%92%e7%99%ba%e8%a1%a8 重症化予防に特化したスマホアプリMystarをリリースしました。 http://thebridge.jp/2018/08/mystar 愛知県内14の健康保険組合さまとコンソーシアムの立ち上げについて掲載頂きました。 https://www.nikkei.com/article/DGXMZO34631260X20C18A8L91000/ https://tech.nikkeibp.co.jp/dm/atcl/news/16/082811437/?ST=health MorningPitchに弊社代表萩原が登壇しました。 http://morningpitch.com/startups/7693/ 野村HD主催アクセラレータプログラム「VOYAGER」に採択されました。 http://accelerator.nomura.co.jp/index.html 経産省主催ジャパン・ヘルスケアビジネスコンテスト2018で優秀賞を受賞しました。 http://techon.nikkeibp.co.jp/atcl/feature/15/327442/012300158/?ST=health&amp;amp;P=3
PREVENT
Invitation from PREVENT
If this story triggered your interest, have a chat with the team?
PREVENT's job postings
31 Likes
31 Likes

Weekly ranking

Show other rankings
Like 衛 伊賀本's Story
Let 衛 伊賀本's company know you're interested in their content