フロントエンドの慣習のまとめ

## 1. はじめに
フロントエンドを始めたばかりの頃、参考書や参考サイトで当然のように使われているものの、特に說明がないような**「慣習」**や**「テクニック」**に困惑したり、その理由が気になった経験を思い出したので、その一部を簡単にまとめてみました。

## 2. HTML

### 2-1. iタグでアイコン
```html
<i class="icon"></i>テキスト
```
>HTML の興味深いテキスト要素 (\<i\>)は、何らかの理由で他のテキストと区別されるテキストの範囲を表します。例えば、技術用語、外国語のフレーズ、架空の人物の思考などです。英文においてはよく斜体で表示されるものです。

>[\<i\>: 興味深いテキスト要素 - HTML: HyperText Markup Language | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/i)

仕様上は適切な使用方法ではなさそうですが、「[Bootstrap Icons](https://icons.getbootstrap.com/icons/alarm/)」や「[Font Awesome](https://fontawesome.com/)」などでも採用されているように、普及している印象があります。

ちなみにHTML4.01では**テキストを斜体（イタリック）にする**ものとして定義されていました。


### 2-2. ボタンのマークアップ
```html
<a href="#">こちらをクリック！</a>
<button type="button">こちらをクリック！</button>
```
そのボタンが**リンク機能を持つ場合はaタグ**で、**それ以外はbuttonタグ**を使用することが多いです。
inputタグにも`type="button"`がありますが、デザイン調整のしづらさ（疑似要素が使えない）からあまり使われることはありません。
divやspanでも作成できますが、フォーカスが効かない、エンターキーやスペースキーでの操作ができない、スクリーンリーダーに対応していないなどのデメリットがあり、別途対応の手間がかかってしまいます。
ちなみにbuttonタグのtypeを明記しない場合は**submitが既定値**になります。
[ボタンは\<button\>で実装しよう - Qiita](https://qiita.com/sukoyakarizumu/items/978df93755c4720d5cdc)

### 2-3. 一部分だけタグが改行されていない or タグ間の謎のコメントアウト
```html
<ul>
  <li>hoge</li><li>fuga</li><li>piyo</li>
</ul>

<ul>
  <li>hoge</li><!--
  --><li>fuga</li><!--
  --><li>piyo</li>
</ul>
```
`display:inline-block;`は横並び時に不要な隙間ができてしまうので、それを防止するテクニックのひとつです。
他者が作成した上記のようなHTMLをメンテする際、その意味を確認せず整形したりコメントアウトを除去してしまうと、デザイン崩れを引き起こす可能性があります。
そのため基本的にはCSSでの対応がおすすめです。
[inline-blockの隙間をなくす方法 - Qiita](https://qiita.com/BEMU/items/0f500e0306471073ed63)


### 2.4. scriptタグをbody閉じタグ直前に設置
```html
<body>
  ...
  <script src="hoge.js">
</body>

```
scriptタグはhtmlのどこにでも記述可能ですが、JavaScriptの読み込み中は**レンダリングがストップ**してしまい表示が遅くなってしまうということと、JavaScriptでDOM操作をする場合、**DOM構築が完了**している必要があるため、scriptタグをbody閉じタグ直前に設置するという慣習が生まれました。
ちなみにheadタグ内にscriptタグを記述した場合でも**defer**属性をつけることで上記の問題は解決できます。
[\<script\>: スクリプト要素 - HTML: HyperText Markup Language | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/script#attr-defer)


## 3. CSS
### 3-1. クリアフィックス

```scss
.clearfix::after {
  display: block;
  clear: both;
  content: "";
}
```

最近では要素の横並びは**Flexbox**を使用する機会が増え、**float**を使うことは少なくなりましたが、これは**floatを解除**するためのテクニックです。
float適用要素もしくはそのラッパー要素のafter疑似要素で解除することで、次に続く要素の先頭での解除を不要にします。
`overflow: hidden;`でも解除できますが、内包要素が親要素からはみだすようなデザインの場合には不向きです。
IEが非対応なら`display: flow-root;`という方法もあります。
[Clearfix · Bootstrap v5.0](https://getbootstrap.jp/docs/5.0/helpers/clearfix/)


### 3-2. 表示上は何も変わらないtransform設定
```scss
transform: translate3d(0,0,0);
transform: translateZ(0);
backface-visibility: hidden;
```
これらの設定によりCSSアニメーションに**GPU処理**が取り入れられるようになり、アニメーションがスムーズになるケースがあります。

また、最近では以下のようなプロパティによる設定方法もあります。
[will-change - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/will-change)

しかしこれらはいずれも**乱用すべきテクニックではない**ため使用には注意が必要です。
[CSS アニメーションについて深く知る - Qiita](https://qiita.com/yuki153/items/9aac0e5c8d7230a7bbe2#%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BCgpu%E3%81%AE%E7%94%9F%E6%88%90%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)


### 3-3. ズーム率を等倍
```scss
zoom: 1;
```
IE7までは内部にhaslayoutという値をもっており、これがデフォルトでfalseだったため、レイアウトが崩れるという事象がありました。
上記コードによりtrueへと変更することで、レイアウト崩れを直せるケースがありました。
目にすることはあっても、もう自分で書く機会はないと思います。


## 4. JavaScript
### 4-1. for文のカウンタ変数「i」
```js
for (let i = 0; i < 9; i++) {
  console.log(i);
}
```
**FORTRAN**という世界最初の高水準プログラミング言語があり、その言語では**変数名は一文字だけしか使用できず**、そのうち整数をあらわすものは**I～Nの６個だけ**だったことによる慣習らしいです。
Index,Iterator,Integerなどの頭文字というわけではなかったんですね。
**i**のほかにもそれに続く**j,k**などが使用されたりします。
[なぜループカウンタ変数のほとんどに “i”が使用されるのか？ - Qiita](https://qiita.com/yaju/items/38f63900491d4ac51af7)


### 4-2. $から始まる変数
```js
const $hoge = $('.hoge');
```
先頭に**「$」**を付与することで、ひと目で**jQueryオブジェクト**が格納されていることがわかります。


### 4-3. that, _this, selfという変数名
```js
const that = this;
```
**this**の参照を保存するためによく使われる変数名ですが、[Airbnbのスタイルガイド](https://mitsuruog.github.io/javascript-style-guide/#naming--self-this)では
> アロー関数かFunction#bindを利用すること

が推奨されています。


### 4-4. アンダースコアから始まる変数・関数名
```javascript
const _hoge = 'hoge';
function _doSomething() {…};
```
JavaScriptには仕様上、**アクセス修飾子**（public,private,protected,static）がないため、**プライベート（ローカルスコープ内だけでの使用を想定）**であることを明示したいときなどに使われることがあります。
また「_this」のように予約語を回避するために使用されることもあります。
ちなみに[Airbnb JavaScript スタイルガイド](https://mitsuruog.github.io/javascript-style-guide/#naming--leading-underscore)では、
> JavaScriptは、プロパティやメソッドについてのプライバシーの概念を持っていません。先頭のアンダースコアは「非公開」を意味する一般的な規則ですが、実際にはこれらのプロパティは完全に公開されているため公開APIの一部です。この規約により、開発者は変更が壊れているとは見なされない、またはテストが必要ではないと誤って考える可能性があります。

として、「末尾または先頭のアンダースコアを避ける」ことが推奨されていました。


### 4-5. クラス名はアッパーキャメル
```js
class HogeFuga {...}
const hogeFuga = new HogeFuga();
```
ちなみに[Airbnb JavaScript スタイルガイド](https://mitsuruog.github.io/javascript-style-guide/#naming--camelCase)にも
>オブジェクト、関数、インスタンスにはキャメルケース（小文字から始まる）を使用すること。
>クラスやコンストラクタにはパスカルケース（大文字から始まる）を使用すること。

と明記されています。
クラス名を**アッパーキャメル（パスカルケース）**にしておくと、インスタンス化する時に**ローワーキャメル（キャメルケース）**にするだけでいいという利便性もあります。


### 4-6. 定数は大文字
```javascript
const HOGE_FUGA = 42;
```
定数は大文字をアンダースコアでつないだ**アッパースネークケース**で書かれることがあります。
[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/const#basic_const_usage)には
>定数は大文字または小文字で宣言することができますが、すべて大文字で宣言するのが慣例です。

と書かれておりますが、[Airbnb JavaScript スタイルガイド](https://mitsuruog.github.io/javascript-style-guide/#naming--camelCase)では、
>ファイル内の定数には大文字を使用しないでください。ただしエクスポートされた定数には使用する必要があります。

となっています。


### 4-7. 即時関数によるスコープ
```js
;(function() {...})();
```
**即時関数**（即時に実行される関数式）により、**スコープ**を作るテクニックです。
**スコープ**とは**「変数の名前や関数などの参照できる範囲を決めるもの」**です。
functionの前に「**(**」があるのは、これがないと関数式ではなく関数宣言だと構文解析されエラーになってしまうから（+や!などが使われているパターンも）。
先頭に「**;**」が付けられていることもありますが、これはファイル結合された場合、直前のファイルの最後にセミコロンが抜けていると構文エラーになってしまうことを防止するためです。
`(function($){…})(jQuery);`のように引数が渡されている場合もありますが、これは変数$の衝突を回避するためです。


### 4-8. 名前空間パターン
```js
const Hoge = window.Hoge || {};
Hoge.Fuga = function() {...}:
```
**グローバル空間に公開するオブジェクトを最小限にし、予期せぬ名前の衝突を防ぐ**テクニックです。
「||」は論理和演算子で、左辺と右辺のいずれかがtrueの場合trueとなり、その値を返却します。
つまり**「もし変数Hogeがすでに設定されていたならそれを流用し、未使用なら新規オブジェクトを代入する」**ことにより、**すでにある変数の上書きを回避**します。


## 5. その他
### 5-1. ほげ
```javascript
const ary = ['hoge','fuga','piyo'];
```
>メタ構文変数（メタこうぶんへんすう、metasyntactic variable）はプログラミング言語の記述で使われる識別子の一種。サンプルプログラムなどで意味のない名前が必要な場合に利用される、「意味のない名前」であることが広く知られた識別子のことである。

>メタ構文変数 - Wikipedia https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BF%E6%A7%8B%E6%96%87%E5%A4%89%E6%95%B0#hoge%E3%81%A8piyo

日本で主に使用されている**メタ構文変数**です。
由来についてはいくつか仮説があるものの、よくわかっていないようです。
使用する順番が決まっており、たとえばいきなりfugaから使用するということはありません。
ちなみに英語圏では**foo**,**bar**,**baz**などが採用されています。


### 5-2. 英文のダミーテキスト「Lorem ipsum」
```html
<p>Lorem ipsum dolor sit amet, consectetur adipisci elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p>
```
>lorem ipsum（ロレム・イプサム、略してリプサム lipsum ともいう）とは、出版、ウェブデザイン、グラフィックデザインなどの諸分野において使用されている典型的なダミーテキスト。書籍やウェブページや広告などのデザインのプロトタイプを制作したり顧客にプレゼンテーションしたりする際に、まだ正式な文章の出来上がっていないテキスト部分の書体（フォント）、タイポグラフィ、レイアウトなどといった視覚的なデザインを調整したりわかりやすく見せるために用いられる。

>lorem ipsum - Wikipedia https://ja.wikipedia.org/wiki/Lorem_ipsum

もとは古代ローマの政治家・哲学者キケロの**『De finibus bonorum et malorum』**（善と悪の究極について）という著作から取られているそうです。
デザインよりも文章の内容に意識が集中しないようにするための工夫です。

ちなみにHTMLやCSSを省略記法で簡潔に記述するためのツール「[Emmet](https://emmet.io/)」に対応したエディタで、「lorem」と入力し変換すると、毎回、ランダムなlorem ipsumを生成してくれるので便利です。


### 5-3. TODOというコメントアウト
```js
// TODO: totalはオプションパラメータとして設定されるべき。
// FIXME: グローバル変数を使用するべきではない。
```
**アノテーションコメント**といい、問題を指摘して再考を促す場合や、問題の解決策を提案する場合に使用されます。
上記以外にも種類があり、エディタによってはこれらをハイライトや一覧で見ることができます。
[TODO: 以外のアノテーションコメントをまとめた - Qiita](https://qiita.com/taka-kawa/items/673716d77795c937d422)


### 5-4. READMEファイル名を大文字にする
```
README.md
```
>リードミー（Readme）とは、ソフトウェアを配布する際の添付文書のひとつ。配布物の一般的な情報を記載したファイルである。多くの場合、そのソフトウェアをインストールし使用する前に読むべきものとされている。

>リードミー - Wikipedia https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%BC%E3%83%89%E3%83%9F%E3%83%BC

なぜ大文字なのかということについては、**「目立つから」「並び順が小文字よりも先になるから」**といった理由が散見されました。


## 6. おわりに
まだまだ挙げればキリがありませんが、あらためて感じたことは、たいていの慣習にはなんらかの理由や目的があるということでした。
このような慣習に対する深い理解は、応用や発展に向けて有用だと思いました。

## 7. 参考サイト
- [Bootstrap · 世界で最も人気のあるフロントエンドフレームワーク](https://getbootstrap.jp/)
- [開発者向けのウェブ技術 | MDN](https://developer.mozilla.org/ja/docs/Web)
- [Airbnb JavaScript スタイルガイド() { | javascript-style-guide](https://mitsuruog.github.io/javascript-style-guide/)
- [javascriptイディオム集](https://qiita.com/cocottejs/items/cb2623316a0c82b603c4)
- [JavaScript イディオム集](http://nmi.jp/archives/488)