なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

TypeScript

The inferred type of 'X' cannot be named without a reference to 'Y'. This is likely not portable. A type annotation is necessary.

pnpm 使って特定の tsconfig.json (Vite のデフォルトの tsconfig.json など) を参照した状態で tsc を走らせると、型エラーが出ることがある。 下記は、その例: The inferred type of 'default' cannot be named without a reference to '.pnpm/vite@5.0.1…

Google Chrome 拡張機能 / Firefox アドオン作成ボイラープレート 2024

この記事ははてなエンジニア Advent Calendar 2023 の 12 月 37 日......もとい 2024 年 1 月 6 日の記事です。 みなさんは Google Chrome 拡張機能や Firefox のアドオンは書いたことありますか?わたしは 2 年に 1 回くらい、なぜか書くタイミングがありま…

Cloudflare Workers を使って Web ページを段階的に移行したい

Web サービスリニューアルしたいことってありますよね? ただ、一度に一気にリニューアルすると、想定していない不具合が出てきたり、今の運用どうするの?っていう問題があったりします。 そこで、 Cloudflare Workers を使って段階的に移行する方法を紹介…

Contentful に Rich Text データを API 経由で登録したい

海外の大手 CMS に Contentful があるんですが、 API ドキュメントがびみょーに分かりにくいのでメモ。 例えば、ある Entry に対してデータを作成したい場合、こんな感じでリクエストを投げてね、とあります。 import { createClient, Environment } from "c…

React で子コンポーネントのテキストのみを取り出したい

React で children で渡ってきた子コンポーネントのうち、テキスト部分だけ取り出したいこと、ありますよね? そういうときに便利なのが React Children Utilities です。 こんな感じで使えます。 import Children from "react-children-utilities"; type Pr…

Contentful JavaScript SDK を TypeScript で使いたい

いまさら JavaScript なんて書けるか!ということで、 Contentful JavaScript SDK を TypeScript で使います。 まずはライブラリのインストール: $ pnpm add contentful いれたあと、以下のようにライブラリを定義すると良い。 import contentful from "con…

macaron で Media Query を使いたい

最近ゼロランタイム CSS-in-JS を触っていることがあるのですが、今回はラクスさんのブログで紹介していた macaron についての記事です。 macaron は、 styled-components などの CSS-in-JS とは異なり、ビルド時に静的な CSS を吐き出すいわゆるゼロランタ…

Vue3 でも React でいう useImperativeHandle をしたい

React で、子コンポーネントの関数を何らかの理由で呼び出したい場合、 useImperativeHandle を使います。 import React, { useImperativeHandle } from "react"; const SomeComponent = React.forwardRef((props, ref) => { useImperativeHandle(ref, () =>…

Vue3 の setup 構文でも named export をしたい

公式ドキュメントにちらっと書いてはいるけど、 script setup を使っていても、 named export したい! ということでやり方。 <script lang="ts" setup> type Colors = (typeof COLORS)[number]; type Props = { color: Colors; }; defineProps<Props>(); </script> <script lang="ts"> const COLORS = ["red", "…

Google の PageSpeed Insights で全スコア100点を取る

趣味で取りました。 サイト構成としては以下の通り: Next.js TailwindCSS Vercel 基本キャッシュは Vercel がうまいことやってくれているので、 Next.js だけパフォーマンスなり変えていく感じになります。 で、やったこととしては以下の通り。 lang=ja の…

JavaScript で value が undefined な key を取り除いたオブジェクトがほしい

JavaScript で、例えば以下のようなオブジェクトがあったとして、 const obj = { a: false, b: undefined, c: 0, d: "", }; value が undefined なキー、つまりは今回の場合は b を除いた、以下のようなオブジェクトが欲しいケースがある。 const obj = { a:…

ts-node で実行時に baseUrl と paths も考慮して欲しい

Next.js とか使ってると、 tsconfig.json を良い感じに設定してくれてて、実質ルートディレクトリからの相対パスでモジュールをインポートできて便利です。 ただ、 ts-node で実行しようとするとコケるので、コケないようにするやり方。 といっても方法は簡…

.env を 1Password で運用したい

.env みたいなのをいっぱい作りたくなかったり、良い感じにしたいので、 1Password に管理を任せてしまおう、という記事。 1Password には、開発者向けのツールとして、 1Password CLI が提供されています。 その CLI の機能に、環境変数を定義した .env を…

ts-node で ESM Native な感じに実行したい

TypeScript を直接実行できる ts-node 便利ですよね。 ところで、最近 (ってほどでもないですが) Node.js 界隈 ESM へ移行する流れがあります。 Node.js 界隈で多くの OSS をリリースしておられる Sindre さんのパッケージも、多くが ESM Native になってお…

@ant-design/plots で、特定条件を満たした場合だけラベルを表示したい

@ant-design/plots という、統計情報みたいなグラフを表示するための Alibaba グループの出しているライブラリがあります。 これは様々なカスタマイズができていろいろ便利なのですが、なにせドキュメントが英文化されていないのに加えて抜けがあるみたいな…

TypeScript で色を表現したい

TypeScript には、 Template Literal Types というものがあり、例えば、以下のような型を表現することが出来ます。 type Pixel = `${number}px`; const a: Pixel = "14px"; // valid const b: Pixel = "20pt"; // invalid TypeScript Playground これで、色…

React Hooks でフォームデータを送信したい

React Hooks でフォームデータ (multipart/form-data)を POST したいけど、いまいち参考例がなかったので、作ってみたというメモ。 といってもやり方は普通に useSWR や useFetch とかと同じ感じかな。 React Hooks 自体はこんな感じ import axios from "axi…

SWR で1回だけ fetch したい

React Hooks でデータフェッチングをするライブラリである SWR ですが、アプリケーションを通して 1 度だけ fetch したい、みたいな時もあると思います。 そのときの解決方法。 といっても、仕組みはすでに (v1.0 から) 用意されていて、以下にようにするだ…

Recoil と Recoil Sync で LocalStorage にデータを保存したい

個人的に最近よく使っている React のステート管理ライブラリである Recoil と、外部ストレージ (DB や URL) などとステートを同期するライブラリ Recoil Sync を使って、 LocalStorage にデータを保存しようという記事です。 ということで、いつも通り準備…

jest で配列の要素の順番に関係なく比較を行いたい

例えば、下のようなコードが合った場合、 jest の toEqual を使うと、確率で落ちます。 const arr = []; const mockDbInsert = (elem: number) => { return new Resolve((resolve) => { setTimeout(() => { arr.push(elem); }, Math.random() * 10); }); }; …

ブログを一部はてな記法に対応させてみた

ブログの一部分をはてな記法に対応させてみました。 こんな感じの記述をすることで、 URL を展開してくれた便利機能のことです。 https://www.youtube.com/watch?v=dPX0_IEXVRo:embed リンクだとこんな感じ https://www.youtube.com/watch?v=dPX0_IEXVRo:tit…

SWC の特定バージョン以前では class-transformer が正しく動作しない

JavaScript / TypeScript の高速な Rust 実装コンパイラーである SWC ですが、特定バージョン以前だとデコレーター・クラス周りの処理があるらしく、 デコレーター・クラス周りの処理をバリバリ使っている class-transformer を使用していると、以下のような…

Git LFS サーバーを自作して、 S3 などのストレージにデータをストアしたい

みなさん Git LFS を使用していますか? わたしは VRChat のアバタープロジェクトをまるまる GitHub へあげているついでに、 Git LFS で 3D モデルやテクスチャーも状態を保存しています。 そこで困るのが、 GitHub のストレージ課金です。 50GB で 60USD/ye…

JavaScript でメンバーがすべて undefined かどうかを調べたい

クラスやらオブジェクトのメンバーがすべて undefined かどうか調べたいときは以下のコードで出来る。 const obj = { a: undefined, b: undefined, c: undefined, }; const obj1 = { ...obj }; const obj2 = { ...obj, d: null }; const checkAllMembersAreU…

Express で application/json じゃないけど JSON で振ってくるものを良い感じにパースしたい

Git LFS のプロキシサーバーを Vercel に投げつけたんですが、そのとき req.body が undefined だったので、その対処法としての方法を紹介します。 Express (Vercel) を使ってる場合、 app.use(express.json()) で JSON に対応できるようになっています。 し…

contentlayer でらくらく Markdown ブログサイト構築

ここ最近は Unity の記事ばかりでしたが、今回は Node.js のお話と言うことで、最近お気に入りのライブラリー、 contentlayer について紹介します。 contentlayer は名前の通り、 Next.js などのコンテンツ周りを良い感じに取得してくれたり、コンパイルして…

Next.js で MDX (Markdown React) を使って SSG したい

このブログは互換性重視なので、極力通常の Markdown を書いているのですが、例えばドキュメントサイトとかだと、 React Component を扱えると便利なケースがあります。 よくあるパターンだと、タブとかそういうものですね。 ということで、 Next.js で MDX …

react-syntax-highlighter でファイル名を表示したい

このブログでは react-syntax-highlighter を使っているのですが、下のような形式の場合 ```javascript:next.config.js module.exports = { } ``` つまりは、言語名の後に :filename という形で指定された場合、ファイル名として表示する実装をしています。 …

TypeScript で配列かどうかを型付きで判別したい

下のような型をもつ変数 obj が提供されていて、 これが number なのか number[] なのかを区別したいとき。 type Value<T> = T | readonly T[] | undefined | null; declare const obj: Value<number>; こういう文法が使えるのを必要がなかったので知らなかったのだけど</number></t>…

TypeScript で paths を解決してビルドする

TypeScript の tsconfig.json に paths という機能があります。 簡単に言うと、以下のようなことが出来る機能です。 // paths を使わない import SomeModule from "../../Baz"; // paths を使う import SomeModule from "@/components/Baz" ただし、この機能…