Cybozu Frontend Monthly #15

タイトル画像

イベント概要

サイボウズフロントエンドマンスリー は、サイボウズ社内で行っているフロントエンド情報共有会「フロントエンドウィークリー」の公開版です。

その月に気になったフロントエンドの情報を、サイボウズのフロントエンドエキスパートチームのメンバーが共有していきます。

このイベントのハッシュタグは #サイボウズフロントエンドマンスリー です。

※フロントエンドウィークリーとは

毎週火曜の 17:00 〜 18:00 で社内向けに行っているフロントエンドの気になる記事を紹介する会です。2016年3月15日から行われています。
ハッシュタグ #サイボウズフロントエンドウィークリー で実況しています。

zennのpublicationにてウィークリーのまとめも投稿していますので、ぜひこちらもご覧ください。 https://zenn.dev/p/cybozu_frontend

開催日

2021年09月28日

イベントページ

https://cybozu.connpass.com/event/225277/

配信URL

https://www.youtube.com/watch?v=4O3mVeUC-u0

メンバー

ゲスト


コンテンツ

Internet Explorer への対応が8月17日で終了します

SmartHRは昨年末にIE対応終了PJを発足して活動を続け、ついに先日IE対応を終了しました。それをどう進めていったかという話をしましょう。


タイピングゲームを作りました

SmartHR 社のエンジニア向けオンライン採用イベントのコンテンツとしてタイピングゲームを作りました。
イベントの1日のために1ヶ月使って作ったものですが、もったいないので共有させていただきます。

技術的な部分は次のようになっています。

後々ちゃんとした形で一般公開したりソースコード公開したりなどをする予定です。


フロントエンドのテストは皆のためのもの

フロントエンドでのテストの種類と、テストの種類ごとにカバーする領域や目的を紹介しています。何をどうやって何のためにテストするかが簡潔に書かれているので、これからテストについて知りたい人も、フロントエンドのテストを何のためにどこまでやればいいか悩んでいる人にもおすすめの記事です。


リンクのデフォルトスタイルはなぜ青いのか、それを歴史から解説している記事です。

結論から話すと、急に青いハイパーリンクが登場したらしいです。 このことについて記事の最後に考察があります。 最初に青いハイパーリンクになったのはモザイクからなのですが、カラーモニターが流行ってたからという結論になってました。 その後モザイクが標準ブラウザになり、モザイクの UI が Web のデファクトになった流れが IE や Netscape に受けつがれたという見解。

あと、WWW ができたときに、ブラウザは白黒しかなく、白黒の濃淡だけでリンクを示していたので色覚障害のために下線が引かれたのも面白かったです。

ブラウザの歴史を簡易的に知ることもでき、「なぜこのようなUIになっているのか」について深く考えたことがなかったので、 歴史から学ぶことができて面白い記事でした。


JavaScript eventing deep dive

preventDefaultstopPropagation が何をしているのかを解説している記事。 いずれも主にイベントバブリング周りで用いられることが多いメソッドですが、実際にこれらがどのような動作をしているのか気になったので読んでみました。

イベントキャプチャーとイベントバブリングについて

イベントキャプチャーとイベントバブリングはどちらもイベントが DOM ツリーに伝搬していくことを指しますが、両者の違いはそれぞれがイベントをリッスンするタイミングにあります。

イベントハンドリングにはキャプチャーフェーズ、ターゲットフェーズ、バブリングフェーズの 3 つの段階があります。

例えば、イベントがディスパッチされた際には window からイベントターゲットへ向かって DOM ツリーを下るようにイベントが起動していきます。 このようにイベントターゲットから下向きにイベントが適用されていく段階がキャプチャーフェーズと呼ばれます。 DOM ツリーを降り切った後、イベントターゲットとなる DOM にてイベントが発火する段階をターゲットフェーズと呼びます。 最後にイベントターゲットから window に向かって DOM ツリーを登るようにイベントが起動します。これがバブリングフェーズです。

開発者は addEventListener の第 3 引数等で、キャプチャーフェーズとバブリングフェーズのどちらでイベントを認識するか設定をすることができます。

event.stopPropagation と event.preventDefault

stopPropagation は呼び出された時点以降のイベントが伝搬するのを停止させます。 例えばキャプチャーフェーズでこれが呼び出された場合、それ以降のキャプチャーフェーズとターゲットフェーズ、バブリングフェーズに登録されたイベントは一切発火しなくなります。

一方、preventDefault はイベントが持つデフォルトの挙動を抑制します。 例えば、 <a> タグのクリックイベントには href 属性で指定された URL へページ遷移をする挙動が含まれますが、 preventDefault を呼び出すことでその動作を抑制できます。(元記事では他にもいくつかのわかりやすい例が書かれているのでより詳細に知りたい方は見ることをお勧めします。)

これらのことから、stopPropagationpreventDefault は不審な挙動の解決策としてよく同列に扱われる一方で、それぞれ全く別の用途であることが理解できると思います。 どちらもイベントハンドリングの挙動に関して何かを抑制する挙動をしていますが、実際に抑制されるものは全くの別物なので今後扱う場面があった場合には念頭におきたいですね。


Reducing The Need For Pseudo-Elements

疑似要素である :before :after を利用したCSSでのスタイリングをモダンなCSSプロパティを使うことで一部を代替する方法について、具体例を交えて解説している記事。

例1: 右側が三角になってるボタン

ホバー時などのスタイルの適用箇所が減る / 複数行表示になった場合に崩れない / 右側の三角だけでなく、複数アングルでの切り取りも表現できる といったメリットがある

例2: ワイプ効果のあるコンテンツ

例3: カラーなどのオーバレイ表現

z-index による重なり制御が不要となるメリットもある。


notes/meetings/2021-08 · tc39/notes

Stage 3 -> 4

proposalexamplenote
Array.prototype.at[1, 2, 3].at(-1); // 3link
Object.hasOwnObject.hasOwn({ bar: 3 }, "bar");link
Class Static Blocksclass Foo { static { console.log("HI!"); } }link

Stage 1 -> 2

proposalexamplenote
Change array by copy[1, 2, 3].withPushed(4); // [1, 2, 3, 4]link
Pipeline operatorsvalue |> foo(^) |> bar(^) link

Stage 0 -> 1

proposalexamplenote
String is USV String???link
Array.asyncFromawait Array.fromAsync(function* () { for (let i = 0; i < 4; i++) yield i; }()); // [0, 1, 2, 3]link
BigInt MathMath.abs(-1n); // 1nlink
Get Intrinsicconst $String = getIntrinsic("%String%"); link
Fixed Layout Objectsstruct class Foo { x; constructor(x) { this.x = x; } }link

Stage 0

proposalexamplenote
RegExp Feature Parity???link

その他


Web Vitals patterns

カルーセルなどよくあるUIコンポーネントに関するCore Web Vitals最適化の実例をまとめたページです。 このページでは次のコンポーネントについて、どういう実装が問題になってどうすればいいか簡単な説明とデモが用意されています。

コードも載っているので、実際にどういうふうに実装されているかわかりやすくなっていると思います。 また、それぞれさらに詳しく解説されているページが用意されており、そのページへのリンクも掲載されています。


SmartHR はエンジニアを募集しています

TypeScript, React, Redux が好きな方、 Ruby on Rails にアレルギーがない方、長期間使われるサービスを運用していきたい方など、良かったら気軽にカジュアル面談しましょう!


フロントエンドエキスパートチームについて

https://speakerdeck.com/cybozuinsideout/frontendexpert-team