mizdra's blog

https://www.mizdra.net/

ぽよぐらみんぐ

フィード

記事のアイキャッチ画像
株式会社はてなに入社しました
mizdra's blog
株式会社はてなに入社しました 株式会社はてなに入社しました - hitode909の日記
2ヶ月前
記事のアイキャッチ画像
似ているけどちょっと違うものをスタイリングする CSS テクニック
mizdra's blog
React + CSS Modules なプロジェクトを例にサンプルコードを書いてるけど、それ以外の構成のプロジェクトでも使えるテクニックのはず。記事タイトルは id:hitode909 さんの 似ているけどちょっと違うものたちをモデリングする技術 - hitode909 のリスペクトです。 data 属性, 属性セレクター, CSS カスタムプロパティを使う 記事のリストがあって、記事のカテゴリごとに文字色やボーダーの色を変えたい、みたいな状況だったとする。多分素朴に書くと以下のようになるはず。 import styles from './Entry.module.css'; import …
3ヶ月前
記事のアイキャッチ画像
fetch の中断と Back/Forward Cache からの復元で発生する奇妙な現象について
mizdra's blog
TL;DR あるリソースの fetch 中にページ遷移すると、一部ブラウザでは fetch が中断される 中断されると、TypeError が throw される ページ遷移時は、ブラウザによって遷移前のページの実行が"停止"され、"捨てられる"ので、通常 throw された後のことは考えなくて良い しかし、そのページが Back/Forward Cache から復元されうるなら、話は別 ブラウザバックすると、エラーが throw された後からページが再開される!!! そして発生する、奇妙な現象の数々... はじまりは、あるサービスの不具合報告 ある日、「Webサービスから外部サービスにページ…
5ヶ月前
記事のアイキャッチ画像
ESLint の Suggestions から学ぶ、コードの自動修正の奥深さ
mizdra's blog
これは、はてなエンジニアアドベントカレンダー2023 4日目の記事です。 3日目は id:mechairoi さんの「SQLiteでLinderaを使った日本語全文検索」でした。 blog.chairoi.me 今日のテーマは、JavaScript 向けの Linter 「ESLint」についてです。ESLint を使うと、JavaScript で書かれたコードを静的解析して、よくある間違いを検出したり、コーディングスタイルを統一できます。 通常、ESLint のルールによって報告された問題 (error や warn) は人が手で修正します。ただし、ルールが報告する問題の中には「fixabl…
6ヶ月前
記事のアイキャッチ画像
GraphQL のレスポンスのモックデータの作成を補助する TypeScript ライブラリを作った
mizdra's blog
GraphQL を使って Web アプリケーションを実装していると、GraphQL API のリクエストをモックしたいことがあると思います。 ユニットテストのために、ダミーレスポンスに差し替えたい ビジュアルリグレッションテストのために、ダミーレスポンスに差し替えたい Storybook で story を書くために、ダミーレスポンスに差し替えたい バックエンドの resolver 実装を待たずにフロントエンド側の開発を始めるために、ダミーレスポンスに差し替えたい 一般には GraphQL Client にモックするための機能が実装されてるので、そうしたものを使うことが多いと思います。 zen…
8ヶ月前
記事のアイキャッチ画像
react-relay の useFragment で本来取得できるはずの field が欠損する現象について
mizdra's blog
react-relay を使っていると、稀に「本来取得できるはずの field が欠けた状態のオブジェクトが useFragment から返される」現象に遭遇することがあります。 例えば、以下のようなエントリーのタイトルと本文を表示するエントリーページがあったと仮定します。デフォルトではタイトルのみが表示されていて、「本文を表示」ボタンを押すと、GraphQL API から本文が fetch されて表示されます。 import {PreloadedQuery, usePreloadedQuery, graphql, useFragment, useLazyLoadQuery} from 're…
8ヶ月前
記事のアイキャッチ画像
Next.js で言語ごとに異なるアセット画像を埋め込む
mizdra's blog
多言語対応している Web アプリで、あらかじめファイルに書き出しておいた画像 (アセット) が言語別にあって、それをページに埋め込むにはどうするか、という話題です。基本は言語ごとに別々の画像を出すことないと思いますが、たまーにあるんですよね。例えばGoogle Play のバッジが言語ごとに違うので、これを言語ごとに出し分けたいとか。 Google Play バッジ – Google 色々方法があるので、それをいくつか紹介します。 方法1. import 文を言語の数だけ書く シンプルにやるなら、言語の数だけ import 文を書いて、next/image の <Image> コンポーネント…
10ヶ月前
記事のアイキャッチ画像
Relay の %future added value, %other との向き合い方
mizdra's blog
前提 まず議論の土台は https://github.com/facebook/relay/issues/2351 GraphQL では Enum に対する variant の追加が破壊的変更になりうる 新しい variant が来ることを考慮してなくて、突然アプリケーションが壊れる可能性がある 自分たちで実装している GraphQL API なら、variant の追加タイミングを調整できるので問題にならないようにもできる しかし、外部の GraphQL API サーバーを利用している場合は、追加タイミングを予知できないので、ある日突然壊れる そのため、Relay は未知の値が来ても壊れない…
10ヶ月前
記事のアイキャッチ画像
アセットの import を簡単にする TypeScript Language Service Plugin を作った
mizdra's blog
Web ページを作るときに、あらかじめファイルに書き出しておいた画像 (アセット) をページに埋め込みたいことがよくあると思います。例えばヘッダーにサービスのロゴ画像を埋め込む場合、以下のようなコードを書くと思います。 // src/components/Header.tsx export function Header() { return ( <header> <img src="/assets/logo.png" alt="Logo image" /> {/* ... */} </header> ); } 一方で、最近のWeb フロントエンドフレームワーク (例: Next.js, Re…
10ヶ月前
記事のアイキャッチ画像
Node.js でフィクスチャーファイルを簡単に作成するライブラリを作った
mizdra's blog
よく Node.js で CLI ツールを作っているのだけど、そのテストコードを書くのが大変だなあという課題感があった。例えば、ESLint のエラーをルールごとにグルーピングして、ルール単位で修正できるツール (eslint-interactive) を作ったときは、以下のようなテストコードを書いていた。 // fixtures/semi.js const val = 0 // fixtures/prefer-const.js let val = 0; // fixtures/.eslintrc.js module.exports = { root: true, parserOptions:…
1年前
記事のアイキャッチ画像
Next.js で SSR を強制する
mizdra's blog
SSG も ISR も SSR も、どれも便利なのだけど、どれも扱いが難しい! SSR 1つを取っても、first paint の状態で GraphQL API から取得したデータがレンダリングされた状態を目指すなら、それなりに複雑な仕組みを getServerSideProps/_app.ts に実装しないといけない。 BFF で GraphQL API を叩いて、その結果を pageProps に焼き込んで、 コンポーネントのレンダリング時に pageProps から結果を取り出して GraphQL クライアントのキャッシュにそれを書き込んで…みたいなことを SSR でやる必要がある訳だけ…
1年前
記事のアイキャッチ画像
Relay でも msw の handler を型付きで書く
mizdra's blog
msw を使うと、GraphQL API をモックしてダミーレスポンスを返せます。以下のような handler と、その他少々のセットアップコードを用意するだけで簡単にモックできます。 // src/mocks/handlers.js import { graphql } from 'msw'; export const handlers = [ // ブログのトップページのクエリをモックする handler。 // `graphql.query` の第一引数には、 // `query <クエリ名> { ... }` の `<クエリ名>` の部分に対応した文字列を書く。 graphql.que…
1年前
記事のアイキャッチ画像
npm package を実装するための自分専用テンプレートリポジトリを作った
mizdra's blog
npm package を作る度にイチから開発環境の構築をしていて大変だったので、自分専用のテンプレートリポジトリを作りました *1。 github.com せっかくなので、テンプレートの特徴とか、どういうこと考えながら作ったとか紹介してみます。 はじめに: 基本的な技術スタック npm TypeScript Node.js Native ESM Prettier ESLint Vitest Renovate GitHub Actions vscode 向けの各種設定ファイル (extensions.json, launch.json, settings.json) GitHub の「テンプレ…
1年前
記事のアイキャッチ画像
Twitter に投稿したツイートを Mastodon に転送するようにした
mizdra's blog
去年の 11 月から続く一連の騒動を受けて、id:mizdra のフォロワーの中でも Twitter から Fediverse に移行してきている人が増えてきた。僕自身は移行するつもりはないけれど、移行したフォロワーが僕のツイートを Fediverse から見れるように、ツイートを Mastodon へと転送するようにしてみた。せっかくなので、そのやり方について書き残しておく。 作戦 IFTTT という「〇〇したらXXする」みたいなピタゴラスイッチをボタンポチポチで作れるサービスがある。これを使い、当該 Twitter アカウントでツイートがされたら、それを契機に Mastodon にトゥート…
1年前
記事のアイキャッチ画像
株式会社はてなに入社しました
mizdra's blog
株式会社はてなに入社しました 株式会社はてなに入社しました - hitode909の日記
1年前
記事のアイキャッチ画像
Next.js の getServerSideProps を共通化する
mizdra's blog
Next.js で開発していると、複数のページの getServerSidePropsで同じようなコードを度々書くことになると思う。例えば 「GraphQL クライアントでクエリを fetch して、そのレスポンスをpagePropsに焼き込むロジック」であったり、「(マルチテナントアプリケーションにおいて) リクエストヘッダーからテナントを特定するロジック」であったり。こうした大部分のページで使われるロジックのコードは、何度も書かずに済むよう、何らかの共通化をしたくなる。 すでに色々な人が似たような動機でgetServerSidePropsを共通化する方法を紹介していると思う。それを参考にし…
1年前
記事のアイキャッチ画像
YAPC::Kyoto 2023 に参加してきた
mizdra's blog
登壇とかではなく、いち聴者として参加してきました。 yapcjapan.org 前日祭も参加していて、土日での京都滞在でした。 yapcjapan.connpass.com 僕と YAPC YAPC への参加は去年の YAPC::Japan::Online 2022 に続いてとなり、YAPC::Kyoto 2023 で2回目です。オフラインの YAPC は初めてでした。 また、別の話として新卒入社のタイミングがコロナと重なっており、参加人数が数百人超える大きなカンファレンスに出たことがほとんどありませんでした (入社前のものを含めると HTML5 Conference 2018 と build…
1年前
記事のアイキャッチ画像
CPU シミュレータを用いて継続的ベンチマークを安定化させる
mizdra's blog
id:mizdra は eslint-interactive というツールをメンテナンスしています。このツールを使うと、多数の ESLint エラーを効率的に修正できます (詳しくは以前書いた記事を見てください)。 www.mizdra.net eslint-interactive では「中規模〜大規模なコードベースであってもキビキビ動く」を大事にしてます。その一環として、eslint-interactive には CI (GitHub Actions) でベンチマークを取り、以前から大きく劣化していたら CI を fail させる仕組みがあります。 https://github.com/mi…
1年前
記事のアイキャッチ画像
試行錯誤を邪魔しない開発環境
mizdra's blog
ある機能を実装する際、完成形のコードになるまでには、プログラムとして不正確な状態や、プロダクト品質ではない状態を経る 静的型検査や lint rule に違反したコードが途中に挟まる 型エラーや lint エラーは望ましくないので、できるだけ早くこうした情報を開発者に伝え、気付けるようにすると良い CI でこうしたエラーを検知して、Pull Request をマージする前に気づけるようにするとか エディタ上にエラーの情報を表示して、コーディング中に気づけるようにするとか エラーを積極的に通知してくれるのはありがたいけど、やりすぎには注意するべき なんとなくでも動いてくれたほうが嬉しい 例えば …
1年前
記事のアイキャッチ画像
ネイティブモジュールに依存しない node-canvas 代替ライブラリを使う
mizdra's blog
Web フロントエンドにて、Canvas を使った View のテストを書きたいことがたまにあります。ブラウザであれば以下のようにして Canvas を利用できますが、テストが実行される Node.js ではそのような API は生えていません。 const canvas = document.createElement('canvas'); canvas.width = 200; canvas.height = 200; const ctx = canvas.getContext('2d'); ctx.fillStyle = 'green'; ctx.fillRect(10, 10, 150…
1年前
記事のアイキャッチ画像
ある Web ページに関するリソースのうち、ブラウザにリークしているものを調べる
mizdra's blog
最近の Web フロントエンドの開発では、JavaScript/CSS ファイルを bundler (webpack, vite, ...) でバンドルして、それをブラウザに配信することが多いと思います。 例えば以下のようなコードを bundler でバンドルすると、react + react-dom/client + ./locales/ja-JP.json が結合された bundle.js というファイルが生成されます (出力されるファイル名は bundler によって異なるのでイメージです)。 import React from 'react'; import { createRoot …
1年前
記事のアイキャッチ画像
next lint は lint 対象のディレクトリが制限されている
mizdra's blog
ということに next lint を触っていて気づきました。公式ドキュメントにもそう書いてありました。 next lint runs ESLint for all files in the pages, components, and lib directories. It also provides a guided setup to install any required dependencies if ESLint is not already configured in your application. (https://nextjs.org/docs/api-reference/…
1年前
記事のアイキャッチ画像
最近書いた風変わりなテストコード 7 連発
mizdra's blog
テスト書く腕力鍛えるため & 個人開発のメンテナンスを楽にするために、最近なんでもテストコードを書きまくってます。あらゆるものをテストするぞという気概を持って手を動かした結果、ちょっと変わったテストコードを書いたりしてました。というわけで、この記事ではそれらを紹介していきます。 CLIツールの E2Eテスト dotfiles のインストール可能性のテスト ブラウザ拡張機能の content script の E2E テスト Scrapbox の UserScript の E2E テスト VSCode のコードジャンプの振る舞いのテスト レンダリングパフォーマンスのリグレッションテスト メモリリ…
1年前
記事のアイキャッチ画像
個人開発祭り #1 で LT しました
mizdra's blog
個人開発をテーマにしたこちらのイベントで、5 分の LT をしてきました。 nota.connpass.com 今回は Scrapbox で議事録を高速に取るための UserScript「icon-suggestion」を作った話をしました。 youtu.be scrapbox.io 個人開発というと、限られた時間と人手で開発しなければならないため、ついつい動けば良い状態になってしまいがちです。テストコードがなかったり、リファクタリングされずにコードが継ぎ足しされた結果、インターフェイスがめちゃめちゃになっていたり... 個人開発では開発者が1人なので、自分がコードを理解できていればよく、コー…
1年前
記事のアイキャッチ画像
Web フロントエンドにおけるコロケーション (co-location) という考え方について
mizdra's blog
Webフロントエンド界隈の文献などにあたっていると、「コロケーション (co-location)」という考え方が時々登場します。 コロケーションを簡単に説明すると、関連するリソース同士を近くに置いておく、という考え方です。 FooComponent.tsx と同じディレクトリに FooComponent.test.tsx を置く GraphQL fragment は、クエリを発行するコンポーネントファイル (pages/user.tsx) ではなく、fragment を利用するコンポーネントファイル (components/UserInfo.tsx) の中で定義する pages/user.ts…
1年前
記事のアイキャッチ画像
React コンポーネントの定義の仕方によって VSCode の定義元ジャンプの挙動が変わる
mizdra's blog
追記 (2024-05-13) この不具合は #57969 で修正されました。まだ Stable 版には入ってませんが、Nightly 版には既に取り込まれています。実際に TypeScript Playground で Nightly 版を使ってみたところ、コンポーネントを定義している箇所へワンクリックでジャンプできるようになっていました。 TypeScript: TS Playground - An online editor for exploring TypeScript and JavaScript この記事は「はてなエンジニア Advent Calendar 2022」の3日目の記…
1年前
記事のアイキャッチ画像
Prisma で本物のDBMSを使って自動テストを書く
mizdra's blog
DBMS に依存するロジックのテストを書く時、主に2つの手法があると思います。 Repository 層などを mock する Service 層のテストをする時は、その下位の Repository 層を mock して、DBMS に依存しない形にしてからテストする レイヤードなアプリケーションで適用できる手法 テスト実行時も DBMS を裏で動かして、それを使う 本番と同じスキーマを持つ DBMS に対して、実際に insert したり select してテストする DBMS は docker-compose upとかで事前に立ち上げておく 双方にそれぞれ良さがあって、プロダクトによってどっ…
1年前
記事のアイキャッチ画像
コードジャンプ可能な CSS Modules を実現する happy-css-modules の紹介
mizdra's blog
弊社では React で CSS を書くための手法として CSS Modules を全面的に採用しています。そこで CSS Modules を使った開発をより快適にするために、「happy-css-modules」というツールを作りました。 happy-css-modules のデモ。 この記事ではこのツールが必要になった背景、導入方法、そしてツールの技術的な仕組みについて紹介します。 CSS Modules の問題点と、typed-css-modules による解決 CSS Modules では、デフォルトでは存在しないクラス名を使用しても、(プロジェクトの設定次第ですが) TypeScri…
2年前
記事のアイキャッチ画像
ある npm package がどこから依存されているか調べる方法
mizdra's blog
このパッケージってどこからどう依存されてるんだっけ、と調べる時によく打ってるのでメモ。 npm npm v7 以降であれば npm explain <package> というサブコマンドでできる。npm v7 以前は npm-why や nls を別途インストールしてきて、それを使う必要があった。ちなみに npm why という名前の npm explain の alias も用意されている。 npm-explain | npm Docs $ npm explain ts-node [email protected] dev node_modules/ts-node dev ts-node@"^10…
2年前
記事のアイキャッチ画像
qwik の発明、及びマイクロフロントエンドへの活用について
mizdra's blog
最近調べた qwik というライブラリが結構面白かったので、実際どういうものなのかとか紹介してみます。 qwik とは qwik は Web 向けの View ライブラリです (React や Vue.js の仲間)。パフォーマンスオタクがパフォーマンスの最適化 (Web Vitals の改善) にこだわって作ったライブラリです *1。 すでにいくつも良い紹介資料があるので、まずはこれらをいくつか読んでみると良いと思います。 Resumable な JavaScript フレームワーク Qwik を学ぶ Qwikの基本概念である Resumable を理解する Qwikというフレームワークにつ…
2年前