スマレジエンジニアyushiのブログ

スマレジエンジニアのブログ

【プロフィールページ改修 第5回】ざっくりコーディング

引き続き、プロフィールページを作成していきます。

yushi-dev.hatenablog.com

技術スタックは下記の通りです。

  • nuxt.js
  • SCSS
  • Tailwind CSS

今回はざっくりコーディングを進めていきます。

方針

コーディングを進めていきます。
今回採用しているVue.jsをできるだけ活用していきます。

  • セクションや部品ごとに、Single File Component(SFC、.vueファイル)に分けて定義する
  • 繰り返し項目は、JS上で内容を定義し、v-forで表示する

実例

スキルのセクションでは、画像のように実装しました。

f:id:yushi0:20220123220143p:plain

この画面では、PHPJavaScriptなどの持っているスキルについて、名前・経験年数・説明の3項目を含むカードを並べて表示しています。

SFCとしては、SkillSection.vueとSkillCard.vueの2ファイルです。

SkillCard.vueでは、カードの中身を表現します。

<template>
  <li class="card-wrap">
    <h3 class="h3">{{ title }}</h3>
    <p class="experience">{{ experience }}</p>
    <p class="description">{{ description }}</p>
  </li>
</template>

...

SkillSection.vueは、Skillsセクション全体の表示と、SkillCardのコンテンツの管理を行います。

<template>
  <section>
    <h2 id="skills" class="section-title">SKILLS</h2>
    <ul class="flex flex-wrap justify-between">
      <SkillCard
        v-for="skill in skills"
        :key="skill.title"
        :title="skill.title"
        :experience="skill.experience"
        :description="skill.description"
        class="skill-card"
      />
      ...
    </ul>
  </section>
</template>

<script>
export default {
  computed: {
    skills() {
      return [
        {
          title: 'PHP',
          experience: '実務4年',
          description: 'サーバサイドではPHPを使う機会が多い。Laravelを中心に、CakePHP2も経験がある。'
        },
        ...
      ]
    }
  },
}
</script>

Pull Request

https://github.com/nek0meshi/profile/pull/4

まとめ

Vue.jsだとコンポーネントごとに分けられたり、繰り返しを簡単に記述できるのがメリットです。
デメリットとしては、ビルドに結構時間がかかることです。
viteを使えるとかなり速くなるのですが...。

【プロフィールページ改修 第4回】デザイン

引き続き、プロフィールページを作成していきます。

yushi-dev.hatenablog.com

技術スタックは下記の通りです。

  • nuxt.js
  • SCSS
  • Tailwind CSS

今回はデザインを行なっています。

デザイン

本職でもプライベートでもデザインの経験は一切ないのですが、今回はチャレンジしてみます。
家族にWeb制作でデザインもやっている人がいるので、教えてもらいながら挑戦しました。

Figma

デザインツールとしては、Figmaを採用しました。

Figma: the collaborative interface design tool.

現職ではAdobe系が使われているのですが、直近でFigmaの話を聞くことが多かったため、試してみました。

使い方の勉強は、こちらの動画を利用しました。

youtu.be

初心者向けで、Webページのデザインを行いながらFigmaの使い方を解説してくれる動画です。

僕もこの動画を見ながら同じようにFigmaで再現したのですが、動画がわかりやすく、それだけで簡単な使い方は把握することができました。

情報収集

デザインするにあたって、まずは参考にすべく色々なWebページのデザインを見て回りました。

主には、下記のページを参考にしました。

デザイン

Figmaを使って実際に製作したのがこちらです。

f:id:yushi0:20220110230400p:plain

f:id:yushi0:20220110230404p:plain

まとめ

初めてのデザインの割にはそれなりに形にできたかなと思っています。

一度経験して以降、他のWebページの見え方も少し変わったような気がしていて、挑戦してよかったなと思っています。

gulpの学習

最近業務でgulpを使う機会があったので、プライベートでも触ってみて、まとめました。

gulpとは

gulpjs.com

gulpとは、JavaScriptCSS管理におけるタスクランナーツールと呼ばれるものです。

作成したJS・CSSを、minifyしたり、多環境対応したり、といった具合に使います。

似たような用途でwebpackなどもありますが、こちらはbundle(複数のファイルを1つにまとめる)することが主目的で、JS modulesが当たり前な現代では採用されがちです。
今回は、JS modulesがまだ適用されていなかったため、gulp採用となりました。

gulpfile

完成したgulpfileがこちらです。

https://github.com/nek0meshi/frontend-learn/blob/master/gulp/gulpfile.js

作成したJSとCSSに対して、いろいろな処理をして本番環境用のビルドを行います。

下記のコマンドを実行することで動作を確認できます。

cd gulp

# ライブラリのダウンロード
npm i

# gulpの実行
npm run gulp

# JSのみ、gulpの実行
npm run gulp scripts

# CSSのみ、gulpの実行
npm run gulp styles

# watch(ファイル更新を監視し、自動実行)
npm run gulp watch

browserslist

ブラウザの対応範囲を指定します。

https://github.com/nek0meshi/frontend-learn/blob/master/gulp/.browserslistrc

後述のbabelやautoprefixerと組み合わせて使います。

autoprefixer

CSSのベンダープレフィックスを自動作成するツールです。

autoprefixer

github.com

ベンダープレフィックスについて

developer.mozilla.org

babel

babelとは、JSをより古いバージョンの実装に書き換えることで、幅広いブラウザで動作させるような仕組みです。

babeljs.io

sass

sassは、CSSをより簡単に記述する仕組みです。

よりCSSライクなSCSSと、より簡易に記述できるSassが存在します。

sass-lang.com

今回は、Sassで動作を試しました。

https://github.com/nek0meshi/frontend-learn/blob/master/gulp/src/index.sass

minify

minifyとは、改行・スペースやコメントなどを削除することで、ファイルサイズを削減する仕組みです。

JSではuglify、CSSではclean-cssを使っています。

https://www.npmjs.com/package/uglify-js

https://github.com/clean-css/clean-css

まとめ

僕が仕事を始めた時点では既にwebpack全盛で、gulpを使う機会を逃していました。

gulpは今でも全然現役ですし、開発の歴史を知ることで現在の開発に対する理解も深まるなと感じました。

今他に気になっているものとして、laravel-mixがあります。Laravelから独立して単独で使うこともあるとか...。

【プロフィールページ改修 第3回】CSS開発の準備

引き続き、プロフィールページを作成していきます。

yushi-dev.hatenablog.com

技術スタックは下記の通りです。

  • nuxt.js
  • SCSS
  • Tailwind CSS

今回は、CSS開発のための様々な準備を行います。

tailwindcssの導入

今回は、tailwindcssを使ってみます。

以前の別の開発ではbulmaを使いました。
bulmaの利点の1つとしては、すぐ使えるようなコンポーネント...例えばボタン、モーダル、ページネーションといったものが用意されていることがあります。
これはWebアプリなどで素早く機能を実装していきたいような開発では大きな長所ですが、逆にHP制作のような細かくデザインしたいケースでは、あまり生かせません。

tailwindの場合は、単にCSSを書くのを楽にする、というような向きが強いのかなと思っており、今回の開発において採用してみました。

nuxtにおけるinstallは、下記のように行いました。

yarn add -D @nuxtjs/tailwindcss tailwindcss@latest postcss@latest autoprefixer@latest
npx tailwindcss init
(nuxt.config.js)
export default {
  ...
    buildModules: [
      ...
+      '@nuxtjs/tailwindcss',
      ...
    ],
    ...
}

SCSSの導入

いつも通りSCSSを入れます。

他の選択肢としては、例えばSassなどもありますが、僕はまだCSSに慣れていないので、記法がCSS自体に近いSCSSを採用しました。

yarn add -D sass sass-loader@10 fibers

nuxtにおいてグローバル変数を登録するための、@nuxtjs/style-resourcesも導入します。

yarn add -D @nuxtjs/style-resources

fontの設定

Google fontsで良さそうなfontを探してみました。

結局エンジニアっぽく、Red Hat Monoというfontを選びました。terminalで見慣れた感じです。

fonts.google.com

@import url('https://fonts.googleapis.com/css2?family=Red+Hat+Mono&family=Zen+Kaku+Gothic+Antique&display=swap');

* {
  font-family: 'Red Hat Mono', 'Zen Kaku Gothic Antique', monospace, sans-serif;
  text-align: center;
  font-size: 16px;
}

Pull Request

https://github.com/nek0meshi/profile/pull/3

あとがき

先日、初めて開発チームで夜のご飯会にいきました!
入社時点で既にコロナ禍だったので、やっとの会でした。
毎日のように顔を合わせる面々ですが、こういう場じゃないと深まらない部分もあるよなあ、と感じました。
とても楽しかったです。

【プロフィールページ改修 第2回】プロジェクト作成

引き続き、プロフィールページを作成していきます。

yushi-dev.hatenablog.com

技術スタックは下記の通りです。

  • nuxt.js
  • SCSS
  • Tailwind CSS

node.jsのバージョン

node.jsは、Maintenance LTSのv14を採用します。

Releases | Node.js

最新のv16も試してみたのですが、sassが導入時に必要なfibersが対応しておらず、断念しました。

fibers v5 はまだ Node.js v16に対応していない。 | eureka

プロジェクト生成

yarnを利用して、createコマンドを実行します。

Nuxt - Installation

yarn create nuxt-app <project-name>

不要なファイルの削除

不要なTutorial.vue、NuxtLogo.vue、store/は削除します。

代わりに、rootのファイルとしてApp.vueを登録します。

<template>
  <div>
    Hello World!
  </div>
</template>

開発サーバの起動

開発サーバを起動します。

yarn dev

f:id:yushi0:20211129013031p:plain

ブラウザで確認してみると、App.vueに記述したHello World!が表示されます。

f:id:yushi0:20211129013047p:plain

Pull Request

https://github.com/nek0meshi/profile/pull/2

あとがき

ここ最近は第2回女流ABEMAトーナメントを観てました。

熱戦に次ぐ熱戦にドラマチックな展開など、出来過ぎなくらいよくできた棋戦になっています。

有料会員登録が必要かもしれませんが、興味のある方は是非に。

abema.tv

【プロフィールページ改修 第1回】プロフィールページ改修

以前一度、プロフィールページを作りました。

yushi-dev.hatenablog.com

作成時から一年ほど経ち、プロフィールもフロントエンドのスキルも多少更新されたので、
今回プロフィールページを更新してみようと思います。

方針

前回よりは、デザイン・CSSに力を入れたいと考えています。
といっても現職ではあまりそういう開発はしていないので、
勉強しながら進めました。

このブログでも紹介した通り、学習のためのいくつかの開発を行ったので、それも掲載したいと考えています。

yushi-dev.hatenablog.com

yushi-dev.hatenablog.com

yushi-dev.hatenablog.com

技術スタック

nuxt.js

引き続き、ベースはnuxt.jsで作ってみます。

Gatsbyなども検討しましたが、 今回はどちらかというとデザインやCSSに力を入れようと考えているので、
JSライブラリは比較的使い慣れたものを採用します。

vueのバージョンは2です。3対応版は未リリース、のはず...。

SCSS

引き続きSCSSを利用します。

前回はnode-sassだったようですが、今回はdart-sassです。

Tailwind CSS

前回はBulmaでしたが、今回はよりCSSを丁寧に書いていきたいと考え、Tailwindを採用することにしました。

Figma

今回はFigmaでデザインにも挑戦してみました。

といっても、本当に入門レベルです。

事前に、下記の動画で勉強しました。

youtu.be

node.js

Dockerを使わず、ローカル環境でnode.jsを動かします。

nodenvで環境を導入しています。

まとめ

今回から複数回に分けて、プロフィールページのversion 2を作っていきます。

【タイピングゲーム 第6回】"っ"に対応する

タイピングゲームを作っています。

yushi-dev.hatenablog.com

技術スタックは下記の通りです。

  • Vue.js3
  • Vite

今回は、"っ"に対応します。

"っ"の対応

小さい"っ"の入力は、例えば「って」と入力したい時に、

  1. ltute
  2. tte

の2種類の入力方式があります。

「1. ltute」の入力方式は、他の文字の入力と変わらないですが、
「2. tte」は、次のひらがなに応じて入力文字が変わるのが難しいです。

今回は、下記のように対応しました。

入力可能文字列一覧

入力可能文字列一覧のcomputed propertyがありますが、下記のように実装しました。

  const textAlphabetArray = computed(() => textArray.value
    .map((letter) => parse(letter))
    .map((letter, index) => {
      switch (letter) {
        case 'っ':
          if (textArray.value.length >= index) {
            // 次の文字の、最初のアルファベット.
            return [
              parse(textArray.value[index + 1])[0][0],
              ...parse(letter)
            ]
          }
      }

      return parse(letter)
    })

ポイントはparse(textArray.value[index + 1])[0][0]の箇所で、これは次のひらがなの最初の文字を取得しています。
例えば、残りの入力ひらがなが「っこ」の場合は、この頭の"k"を入力できるような判定としています。

入力時の処理

実際の文字入力時(前の例の"k")の処理は、下記のようになっています。

    switch (textArray.value[inputIndex.value]) {
      ...
      case 'っ':
        if (
          inputCurrentLetter.value === ''
          && key !== 'l'
          && textAlphabetArray.value.length >= inputIndex.value + 1
          && textAlphabetArray.value[inputIndex.value + 1].map((item: string) => item[0]).includes(key)
        ) {
          inputCurrentLetter.value = key
          goNextChar()
          reserved.value = textAlphabetArray.value[inputIndex.value].filter((item: string) => item.startsWith(key))
          return true
        }
        break
    }

単純にいうと、"kko"のうち"k"の入力がされたときに、即座に「こ」の入力に移る、
というような処理です。

Pull Request

https://github.com/nek0meshi/typing/pull/6

あとがき

先日29歳になりました。20代ラストイヤーも頑張ります。