#■はじめに
・目的はNext.jsの大枠に触れてみるというところです。
※学習コストの低いVueを使ってポートフォリオを作成したもののNext.jsが気になりすぎて
※そのため、アプリ作成と書いてはいますが、アプリの具体的な中身はほぼ空っぽです。
※今後、簡単なプロフィールサイトを作成していく予定です
#■デプロイ先
・Vercel(https://profsite.vercel.app/)
#■手順
##1.環境構築
・next.jsのプロジェクト作成
npx create-next-app profsite
・ターミナルでプロジェクトディレクトリに移動
cd profsite
##2.node.jsのインストール(ver10.13 以上必要)
・バージョン確認
node -v
※未インストールの場合(こちらの記事がとてもわかりやすいです。)
https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09
##3.ローカルサーバー起動
・コンパイル
npm run dev
・http://localhost:3000へアクセスするとトップ画面が表示される
##4.Editorでトップ画面を少し編集してみる
・/pages/index.jsを編集すると、トップ画面が変更される(pages/index.js = ルート)
##5.新しくディレクトリを切ってみる
・pages/skills/my-skills.jsを作成(自身のスキルセットを表示するページを想定)
export default function showSkills() {
return (
<h1>My Skills</h1>
)}
・http://localhost:3000/skills/my-skillsへアクセスすると表示される
つまり、作成したディレクトリ構造がそのままURLになる
##6.クライアントサイドナビゲーション
・ページ遷移をクライアント側のjavascript処理で実行し、サーバには通信を行わないのでサクサク
・リンクコンポーネントを使用する必要があるので、index.jsに読み込む
【index.js】
import Link from 'next/link'
export default function Home() {
return (
<Link href="/skills/my-skills"><a>My Skills</a></Link>
)}
※余談
Adjacent JSX elements must be wrapped in an enclosing tag
・エラーがでてしまった
コンポーネントを以下のように、div等の要素で囲んで上げる必要がある
(Reactで作成するコンポーネントは、 トップレベル(一番親となる階層)の要素を
一つにする必要があるため)
【index.js】
import Link from 'next/link'
export default function Home() {
return (
<div>
<Link href="/skills/my-profile"><a>My Profile</a></Link>
<Link href="/skills/my-works"><a>My Works</a></Link>
<Link href="/skills/my-skills"><a>My Skills</a></Link>
<Link href="/skills/contact"><a>Contact</a></Link>
</div>
)}
リンクをクリックするとクライアントサイドナビゲーション(ページ遷移をクライアント側のjavascript処理で実行し、サーバには通信を行わない)が動作するので、サクサクです。
##7.画像ファイルの読み込み
・publicフォルダでurl(src)を管理している
・publicをルートとしたルートパスで記載する
【my-profile.js】
export default function showProfiles() {
return (
<div>
<h1>My Profile</h1>
<div>
<img src="/myface.JPG" alt="私の画像" />
</div>
</div>
)}
##8.メタデータ編集
・headコンポーネントを使用することで、headタグをページごとに設定できる
・下記は一例
【index.js】
import Link from 'next/link'
import Head from 'next/head'
export default function Home() {
return (
<div>
<Head>
<title>home</title>
</Head>
<Link href="/profile/my-profile"><a>My Profile</a></Link>
<Link href="/works/my-works"><a>/My Works</a></Link>
<Link href="/skills/my-skills"><a>/My Skills</a></Link>
<Link href="/contact/contact"><a>/Contact</a></Link>
</div>
)}
【my-profile.js】
import Head from 'next/head'
export default function showProfiles() {
return (
<div>
<Head>
<title>my profile</title>
</Head>
<h1>My Profile</h1>
<div>
<img src="/myface.JPG" alt="私の画像" />
</div>
</div>
)}
##9.cssでレイアウトを変更してみる
・小さなcss modulesを作成後、layoutコンポーネントを対象のjsコンポーネントにラップすることで、
cssを適用することが可能
・cssモジュールは基本、機能ごとに分ける。(文字のサイズ、フォントを整えるためのモジュール、画像のサイズを整えるためのモジュール等)
・ルートにcomponentsディレクトリを作成しlayout.jsを配置
/components/layout.js
【layout.js】
※childrenはreactの特別なpropsの書き方(Layoutコンポーネントで囲まれた要素を返す)
export default function Layout({ children }) {
return (
<div>{children }</div>
)}
・コンポーネント(どれでも良い。例としてmy-profile.js)をLayoutコンポーネントでラップする
【my-profile.js】
import Head from 'next/head'
import Layout from '../../components/layout'
export default function showProfiles() {
return (
<div>
<Layout>
<Head>
<title>my profile</title>
</Head>
<h1>My Profile</h1>
<div>
<img src="/myface.JPG" alt="私の画像" />
</div>
</Layout>
</div>
)}
・上記だけだとdivで囲んだだけなので、css moduleを使ってレイアウトを変更する
・/componentsディレクトリにlayout.module.cssを作成(※拡張子は必ず.module.css)
【layout.module.css】
.container {
max-width: 36rem;
padding: 0 1rem;
margin: 3rem auto 6rem;
}
・layout.module.cssを読み込んで、layout.jsのclassNameに適用する
【layout.js】
import styles from './layout.module.css'
export default function Layout({ children }) {
return (
<div className={ styles.container }>
{ children }
</div>
)}
【ブラウザ】
・Layoutコンポーネントにラップされている要素にcssが適用される
※class名がユニークな値になる仕様
##10.グローバルcssを適用する
・_app.js(pages/_app.js)にimportしたcssは全てのコンポーネントに適用される
・大元のglobals.cssは_app.jsでのみimportすることができる
・つまり、globals.cssの内容を_app.jsにimportすれば全コンポーネントにcssが適用されるということ
【_app.js】
import '../styles/globals.css'
function MyApp({ Component, pageProps }) {
return <Component {...pageProps} />
}
export default MyApp
【styles/globals.css】
・わかりやすいように、テキストカラーを赤に。
html,
body {
color:red;
padding: 0;
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
}
a {
color: inherit;
text-decoration: none;
}
* {
box-sizing: border-box;
}
##11.gitにpush
いつものやつなので、割愛。。
・githubでリポジトリ作成
・gitにpush
cd profsite
git init
git remote add origin https://github.com/masayan1126/profsite.git
git remote -v
git add .
git commit -m ""
git push -u origin master
##12.Vercel(バーサル)へデプロイ
・初期設定でデプロイすると、static generation(コンパイル時にHTML生成)が適用される
・カスタムドメイン(取得した有料ドメインを使用することも可能)
・自動でSSL化されている(すご)
・アカウント作成
ここからは画面の指示通りで簡単な手順なので詳細は割愛します。
githubのアカウントサインインし、あとはプロジェクト名とか、取り込み対象の
リポジトリを選択してデプロイして完了です。
【リポジトリのインポート】
【デプロイ完了】
#■最後に
・Next.jsを作られた方、天才すぎます!!
・所要時間は2時間くらいで、この記事を書く時間よりも短かったです。(笑)