# はじめに
server components(sc)と client components(cc)という機能が nextjs のapp
ディレクトリ内で使用できるようになりました。先日試していたときに、vscode の import のめんどくささがあったのでメモしておきます。より良い方法などあれば教えてください。
# 結論
vscode 前提です。 typescript のバージョンが 4.8 以上である必要があります。
{
"typescript.tsdk": "node_modules/typescript/lib",
"typescript.preferences.autoImportFileExcludePatterns": [
// 除外したいものを書く
]
}
# 使用例的なもの
app ディレクトリと UI フレームワーク、例えばchakra uiを組み合わせたいとします。
とりあえず、ChakraProvider
でルートコンポーネントを囲みたいんですが、以下のような感じだと動きません。
import { ChakraProvider } from '@chakra-ui/react';
export const metadata = {
title: 'Tatsumi Yamamoto',
description: 'yamamoto tatsumi dayo',
};
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang='ja'>
<head />
<ChakraProvider>
<body>{children}</body>
</ChakraProvider>
</html>
);
}
理由は layout.tsx に'use client';
がなく、sc では state などが使えないからです。ChakraProvider は内部で state とかを使っているのでエラーになります。
そこで、'use client';
を足して cc にしてみますが、これは良くないみたいです。
root layout はデフォルトで Server component であり、Client Component にすることはできません。 (The root layout is a Server Component by default and can not be set to a Client Component.)
'use client';
import { ChakraProvider } from '@chakra-ui/react';
export const metadata = {
title: 'Tatsumi Yamamoto',
description: 'yamamoto tatsumi',
};
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang='ja'>
<head />
<ChakraProvider>
<body>{children}</body>
</ChakraProvider>
</html>
);
}
そのため、以下のように一旦 cc から全てを export します。
'use client';
export * from '@chakra-ui/react';
そして、chakra ui のコンポーネントを使うときはここから import するようにします。
import { ChakraProvider } from './chakraComponents';
export const metadata = {
title: 'Tatsumi Yamamoto',
description: 'yamamoto tatsumi',
};
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang='ja'>
<head />
<ChakraProvider>
<body>{children}</body>
</ChakraProvider>
</html>
);
}
このときに、@chakra-ui/react
からは import したくないのですが、vscode では import の候補に出てしまうので、一旦以下のような記述で黙らせることができます。
{
"typescript.tsdk": "node_modules/typescript/lib",
"typescript.preferences.autoImportFileExcludePatterns": [
"node_modules/@chakra-ui"
]
}
app
ディレクトリを本格的に使ったことがないので、もしかしたらこの設定で問題が出るかもしれませんし、ui フレームワーク側の何かしらの対応で解決するかもしれませんが、とりあえずメモです。
# 参考
![Next.js 13のappディレクトリの基礎(Layout, Suspense, Data Fetching...)](https://reffect.co.jp/wp-content/uploads/2022/11/nextjs-13.png)
![Next.js 13 app directory で記事投稿サイトを作ってみよう](https://res.cloudinary.com/zenn/image/upload/s--4mkkZoA7--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:Next.js%252013%2520app%2520directory%2520%25E3%2581%25A7%25E8%25A8%2598%25E4%25BA%258B%25E6%258A%2595%25E7%25A8%25BF%25E3%2582%25B5%25E3%2582%25A4%25E3%2583%2588%25E3%2582%2592%25E4%25BD%259C%25E3%2581%25A3%25E3%2581%25A6%25E3%2581%25BF%25E3%2582%2588%25E3%2581%2586%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:azukiazusa%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzBlZDk2NGM2M2YuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png)