2024.12.10
“放置系”なのにサイバー攻撃を監視・検知、「統合ログ管理ツール」とは 最先端のログ管理体制を実現する方法
新規サービスにNuxt.jsを採用した話(全1記事)
リンクをコピー
記事をブックマーク
島村崇氏:こんにちは。本日は「新規サービスにNuxt.jsを採用した話」という内容でお話をさせていただこうと思います。よろしくお願いします。
(会場拍手)
まず自己紹介ですが、DMM.comのテクノロジー本部CTO室でエンジニアをしている島村と申します。経歴は、2014年にDMMに入社してこんな感じで、実は一昨年まではマネジメントもやっていました。
では、さっそくなのですが、今回紹介するサービスは、9月リリースに向けて今まさに新規開発しているEC系のサービスになります。開発メンバーですが、エンジニアは5名で、デザイナー、POという構成で、その中にフロント実装するエンジニアが3名います。
アプリケーションの構成はざっくりとこんな感じで、フロントはサービスサイトと管理サイト、両方ともNuxt.jsで実装していて、API側はGo言語で実装しています。
今回、Nuxt.jsを採用した理由をご紹介したいと思います。先ほどご紹介したように複数人でフロントの実装をするので、コードの統一感を担保したいという話があがりました。Nuxt.jsはフレームワークのルールに沿って開発ができるので、コードの統一感が担保できてよいのではないか。ということで、まずこれが採用理由の1つになりました。
もう1つが学習コストを抑えられることです。Nuxt.jsは公式ドキュメントが充実していたり、DMM社内での知見が多かったり、また同じチーム内にもNuxt.jsの経験者がいたので、これらも今回の採用理由になりました。あと、Vue.jsなので、HTML・CSS・JSの基本的な知識があれば、Reactなどに比べて理解しやすいのかなと思って採用しました。
では、実際Nuxt.jsを選んでどうだったのか。
学習コストについては狙いどおりでした。公式ドキュメントを読めばだいたい実装ができたのと、なにかあったときにすぐ聞ける知見が社内にあったのはやはり心強かったです。
あとは、環境構築が楽でした。Nuxt.jsは必要なライブラリが最初からだいたい揃っていて、プラグインも設定ファイルを書くだけで簡単に追加できてしまうので、すごくよかったなと。あと、Vuexやルーティングの設定はNuxt.jsがやってくれるので、ここらへんもかなり楽できたかなと思います。
ただ、Nuxt.jsを導入したときの注意点なのですが、ルールに沿ってとはいっても、やはり設計はいろいろ必要だったなという感想です。例えば、値の保持をどうするか。storeもしっかり設計しないとすぐ肥大化してしまうので、ここらへんの設計周りとか。
やはりコンポーネントの粒度の話ですね。やはりここらへんもしっかり設計しておかないと、componentsディレクトリ配下がぐちゃぐちゃで大変なことになってしまいます。
あとは、今回サーバサイドレンダリングをしたのですが、Nuxt.jsはVue.jsに加えて独自のライフサイクルメソッドがあったり、サーバサイドとクライアントサイドで挙動が変わったりするので、そこをしっかり意識して実装する必要はありました。とくに画面をリロードしたときの挙動はけっこう注意が必要でした。
それとwindowなどのブラウザのAPIですね。今回ローカルストレージも使ったのですが、そういったところにアクセスする際は「クライアントサイドのみ」という分岐処理を書く必要もありました。
では、今回、開発に伴って工夫したことをいくつか紹介したいと思います。
まずパフォーマンスチューニングなのですが、1つがコンポーネントのキャッシュです。propsの値で一意の描画結果が決まるものは、サーバ側でコンポーネントをキャッシュしました。v-forなどで何度も繰り返すようなコンポーネントには、キャッシュ処理は有効だったかなと思います。
ソースコードだとこんな感じです。このserverCacheKey というメソッドを実装して、propsをもとにキャッシュするためのキーを文字列でリターンしてあげると、サーバ側でコンポーネントをキャッシュすることができます。別途モジュールのインストールは必要なのですが、実装としてはこんな感じになります。
もう1つパフォーマンスチューニングとして、非同期コンポーネントがあげられます。v-ifなどで必要なタイミングで表示するコンポーネントの場合は、非同期コンポーネントにするとJSのbundleに含まれなくなるので、初期表示にかかる時間の削減が期待できます。
ソースコードだとこんな感じです。コンポーネント設定するところをこういったかたちでダイナミックインポートすると、非同期で必要なコンポーネントを必要なタイミングで読むようになります。
あと最後に、今回はCSS設計に「RSCSS」という手法を採用しました。Vue.jsなのでしっかりとしたCSS設計は不要だったのですが、複数人で開発するのに何もルールがなのはやはり可読性が悪くなるので、最低限のルールとして採用しました。
コンポーネントベースにマッチしていて、ルールもシンプルで学習コストもけっこう低く、採用してみてよかったので、ご紹介したいと思います。
ソースコードだとこんな感じで、コンポーネント名はkebab-caseで2単語以上というルールがあります。その下のelementsはなるべく子セレクタを使用して定義します。あと、variantではダッシュ・プレフィックスをつけて、こんな感じで書きます。
BEMなど使われている方はわかるかなと思うのですが、それよりもかなりシンプルに書けるので、見通しも良くなってよかったかなと思います。
というわけで、まとめです。Nuxt.jsを導入してみて、学習コストは狙いどおり低めにできたのと、環境構築にかかるコストがかなり削減できたのですごくよかったなと。
ただし、注意としては、細かい設計は必要という点と、サーバサイドとクライアントサイドの処理をしっかり意識する必要があるという点。あとは、CSSはゆるくでもルール設定しておいてよかったな、という感想です。
では、ちょっと最後スポンサーっぽいことを言わせてください。DMM.comでは共に働くエンジニアを募集しています。ということで、本日はどうもありがとうございました。
(会場拍手)
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
2024.12.09
国内の有名ホテルでは、マグロ丼がなんと1杯「24,000円」 「良いものをより安く」を追いすぎた日本にとって値上げが重要な理由
2024.12.09
10点満点中7点の部下に言うべきこと 部下を育成できない上司の特徴トップ5
2024.11.29
「明日までにお願いできますか?」ちょっとカチンとくる一言 頭がいい人に見える上品な言い方に変えるコツ
2024.12.04
いつも遅刻や自慢話…自分勝手な人にイラっとした時の切り返し 不平等な関係を打開する「相手の期待」を裏切る技
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.12.06
嫌いな相手の行動が気になって仕方ない… 臨床心理士が教える、人間関係のストレスを軽くする知恵
2024.12.03
職場の同僚にイライラ…ストレスを最小限に抑える方法 臨床心理士が語る、「いい人でいなきゃ」と自分を追い込むタイプへの処方箋
2024.12.05
「今日こそやろう」と決めたのに…自己嫌悪でイライラする日々を変えるには
PR | 2024.12.04
攻撃者はVPNを狙っている ゼロトラストならランサムウェア攻撃を防げる理由と仕組み