Open30

Next.js のおべんきょう

ちあきちあき

疑問:body 要素にidとかclassNameのせたいときとかどうするんだろ?

ちあきちあき

TS71005: "className" is not a valid layout prop.
って言われるんだよなー。idもしかり。

ちあきちあき

template.tsxは状態変える必要があるときにつかう。ハンバーガーメニューとか。
layout.tsxと同じ階層にあるときはlayoutの子要素になる(layout.tsxのchildrenのなか)
https://nextjs.org/docs/app/building-your-application/routing/pages-and-layouts#templates

ちあきちあき

試しにハンバーガーメニューをlayout.tsxにおいてみるとそんな気はしてたけどエラー。
metadataと共存できないから、やっぱりハンバーガーメニューもtemplate.tsxかな?

./src/app/layout.tsx
ReactServerComponentsError:

You are attempting to export "metadata" from a component marked with "use client", which is disallowed. Either remove the export, or the "use client" directive. Read more: https://nextjs.org/docs/getting-started/react-essentials#the-use-client-directive
ちあきちあき

トップ以外はレイアウトを共通化したいとかのときはRoute Groupsでlayout.tsxをつくる。
配下で更に入れ子にできるので、「このディレクトリだけボタン足したい」というときは、そのディレクトリ内でlayout.tsx作ればおk

https://nextjs.org/docs/app/building-your-application/routing/route-groups

https://zenn.dev/chot/articles/next-layout-for-admin-page?fbclid=IwAR0DhvVNQMXY1y0kSZXp4Y2tfC4L-UhPRYM0uXFAtnCSGHR7lJ9RfoO_SwA

https://zenn.dev/masa5714/articles/04745ab1eb4231?fbclid=IwAR0rRvjsqp1JYM2HqBhewzUPJT0bN17q02OiWtiyzzAo3f_3GqS13u1_ntc

ちあきちあき

CSS Modulesってpostcssに対応してない?

Syntax error: Selector "&:hover" is not pure (pure selectors must contain at least one local class or id)

って怒られるな……

ちあきちあき

使ったことなかったな〜と思って触ってみたけどpostcss使えないのはちょっと合わないかなあ。
CSS in JSは個人的にあんまり好きじゃない(CSSはCSSファイルに書きたい人)からどうしようかな

ちあきちあき

storybookで @/components/**/* みたいなパスが解決できてない!ページ内でもだめならtsconfig.jsの設定だよね〜ってページに作ったコンポーネント入れたけど、ページ側はエラーなしで表示できた。(ただしpostcssでエラー)

ちあきちあき

TS18048:  config.resolve  is possibly  undefined 

が出るので

if (config.resolve === undefined) {
    return config;
}

を上に入れてみる

ちあきちあき

tailwindcss でなんらかの拡張(特にcolorとか)をしたいときは extendの中でやる。

/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ['./src/**/*.{js,ts,jsx,tsx,mdx}'],
  theme: {
    colors: {
      primary: '#ff6881',
    },
  },
};

これだとデフォルト値が上書きされるので、他の色が全部使えなくなる

https://tailwindcss.com/docs/theme#customizing-the-default-theme

ちあきちあき
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ['./src/**/*.{js,ts,jsx,tsx,mdx}'],
  theme: {
    extend: {
      colors: {
        primary: '#ff6881',
      },
    },
  },
};

追加したいならこう

ちあきちあき

そういえばstorybookいれたときのサンプルで satisfies があったなあしらんなこれと思ったけどべんりそう

https://zenn.dev/moneyforward/articles/typescript-as-const-satisfies

ちあきちあき

(・∀・)イイネ!!

satisfies の特徴は、型チェックが行われつつも、型推論結果が保持されることです。 「satisfies」(サティスファイズ)は「(条件などを)満たす、確信させる」といった意味があります。

次の colorList オブジェクトにおいて、green は ColorList の型の一部であることがチェックされ、かつ number[] 型と推論されます。配列なので、配列用メソッド map() が使えます。