{"componentChunkName":"component---src-templates-post-js","path":"/개발/2020/10/10/start-next-js-2/","result":{"data":{"markdownRemark":{"fields":{"slug":"/개발/2020/10/10/start-next-js-2/","date":"2020-10-10"},"frontmatter":{"title":"Next.js 시작해보자 2/5 - Assets, Metadata, and CSS","tags":["nextjs","react framework","assets","metadata","css"],"author":"jslee"},"id":"4f3471c9-c19e-53b9-adc6-cbe59b4b4950","html":"<h1>목록</h1>\n<ul>\n<li><code class=\"language-text\">Next.js</code>에서는 <code class=\"language-text\">CSS</code>, <code class=\"language-text\">Sass</code>를 지원한다.</li>\n<li>images, videos를 어떻게 Next.js에 추가하는지</li>\n<li>각 페이지의 <code class=\"language-text\">&lt;head&gt;</code>를 어떻게 customize 하는지</li>\n<li><code class=\"language-text\">CSS Modules</code>을 사용해서 reusable React component를 만드는지</li>\n<li>global CSS 추가하는 방법</li>\n<li>유용한 styling</li>\n</ul>\n<h1>Assets</h1>\n<p><a href=\"https://nextjs.org/learn/basics/assets-metadata-css/assets\">https://nextjs.org/learn/basics/assets-metadata-css/assets</a></p>\n<p>이미지와 같은 <code class=\"language-text\">static assets</code>을 추가하기 위해서는 <code class=\"language-text\">public</code>에 추가하면 된다. <code class=\"language-text\">public/vercel.svg</code>를 추가하고 사용하고자 하는 페이지에 아래와 같이 코드를 추가하면 된다.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token operator\">&lt;</span>img src<span class=\"token operator\">=</span><span class=\"token string\">\"/vercel.svg\"</span> alt<span class=\"token operator\">=</span><span class=\"token string\">\"Vercel Logo\"</span> className<span class=\"token operator\">=</span><span class=\"token string\">\"logo\"</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span></code></pre></div>\n<p>추가로 <code class=\"language-text\">public</code>에는 <code class=\"language-text\">robots.txt</code>, Google Site Verification 을 추가해서 사용할수 있는 폴더이다.</p>\n<h1>Metadata</h1>\n<p><a href=\"https://nextjs.org/learn/basics/assets-metadata-css/metadata\">https://nextjs.org/learn/basics/assets-metadata-css/metadata</a></p>\n<p><code class=\"language-text\">&lt;title&gt;</code>과 같은 HTML tag의 metadata를 수정하고 싶을때는 아래와 같이 사용해보자. <code class=\"language-text\">&lt;head&gt;</code>가 아닌 <code class=\"language-text\">&lt;Head&gt;</code>를 사용해야 한다. <code class=\"language-text\">&lt;Head&gt;</code>는 <code class=\"language-text\">Next.js</code>의 head 모듈을 추가해서 사용이 가능하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> Head <span class=\"token keyword\">from</span> <span class=\"token string\">\"next/head\"</span>\n<span class=\"token keyword\">import</span> Link <span class=\"token keyword\">from</span> <span class=\"token string\">\"next/link\"</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">FirstPost</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Head<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>title<span class=\"token operator\">></span>First Post<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>title<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Head<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>h1<span class=\"token operator\">></span>First Post<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h1<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Link href<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>a<span class=\"token operator\">></span>Back to home<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>a<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span><span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h1>CSS Styling</h1>\n<p><a href=\"https://nextjs.org/learn/basics/assets-metadata-css/css-styling\">https://nextjs.org/learn/basics/assets-metadata-css/css-styling</a></p>\n<p><code class=\"language-text\">styled-jsx</code>의 library를 사용해서 스타일링을 할 수 있다. <code class=\"language-text\">CSS-in-JS</code> 라이브러리는 React Component에서 CSS로 작성이 가능하도록 (다른 컴포넌트는 영향을 받지 않는다.)</p>\n<p><code class=\"language-text\">Next.js</code>는 <code class=\"language-text\">styled-jsx</code>, CSS-in-JS인 <code class=\"language-text\">styled-components</code>, <code class=\"language-text\">emotion</code>, <code class=\"language-text\">Tailwaind CSS</code>를 사용한다.</p>\n<h1>Layout Component</h1>\n<p><a href=\"https://nextjs.org/learn/basics/assets-metadata-css/layout-component\">https://nextjs.org/learn/basics/assets-metadata-css/layout-component</a></p>\n<p><code class=\"language-text\">Layout</code> 컴포넌트를 생성해서 가장 바깥쪽 컴포넌트를 만들수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// components/layout.js</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">Layout</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> children <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>children<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// pages/posts/first-post.js</span>\n<span class=\"token keyword\">import</span> Head <span class=\"token keyword\">from</span> <span class=\"token string\">\"next/head\"</span>\n<span class=\"token keyword\">import</span> Link <span class=\"token keyword\">from</span> <span class=\"token string\">\"next/link\"</span>\n<span class=\"token keyword\">import</span> Layout <span class=\"token keyword\">from</span> <span class=\"token string\">\"../../components/layout\"</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">FirstPost</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>Layout<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Head<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>title<span class=\"token operator\">></span>First Post<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>title<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Head<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>h1<span class=\"token operator\">></span>First Post<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h1<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>h2<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Link href<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span><span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>a<span class=\"token operator\">></span>Back to home<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>a<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h2<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Layout<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><figure class=\"gatsby-resp-image-figure\" style=\"margin: 0 0;\">\n    <span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 800px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/860416fb968601191b3b1b95d6e44e8d/2876f/layout-before.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 81%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAABYlAAAWJQFJUiTwAAAApElEQVQ4y+3RyQrCMBAG4L7/i9hbvdj0CSzowX05GK1Q6CLSBYoZavJLBYuCiAkePPSHYQYCHzPEIiI8IoRoZ6XUS/82ljtw4Th9eMwDYwx2z4Y/9FtMG6wloaxyFGWGq6qRFWdcqHraThPcTWLwaYKI5wiWKQ7zFMf1CVIanrxfxNiMQgSrBM28HYfgs8gc/PSoi93BZpN3ZfzL+HE6sAP/AbwBy9jwR2Jr8gYAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n        <source\n          srcset=\"/static/860416fb968601191b3b1b95d6e44e8d/a5e6d/layout-before.webp 200w,\n/static/860416fb968601191b3b1b95d6e44e8d/2276a/layout-before.webp 400w,\n/static/860416fb968601191b3b1b95d6e44e8d/cf465/layout-before.webp 800w,\n/static/860416fb968601191b3b1b95d6e44e8d/ece56/layout-before.webp 968w\"\n          sizes=\"(max-width: 800px) 100vw, 800px\"\n          type=\"image/webp\"\n        />\n        <source\n          srcset=\"/static/860416fb968601191b3b1b95d6e44e8d/56d15/layout-before.png 200w,\n/static/860416fb968601191b3b1b95d6e44e8d/d9f49/layout-before.png 400w,\n/static/860416fb968601191b3b1b95d6e44e8d/78d47/layout-before.png 800w,\n/static/860416fb968601191b3b1b95d6e44e8d/2876f/layout-before.png 968w\"\n          sizes=\"(max-width: 800px) 100vw, 800px\"\n          type=\"image/png\"\n        />\n        <img\n          class=\"gatsby-resp-image-image\"\n          src=\"/static/860416fb968601191b3b1b95d6e44e8d/78d47/layout-before.png\"\n          alt=\"Adding CSS 이전\"\n          title=\"Adding CSS 이전\"\n          loading=\"lazy\"\n          style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        />\n      </picture>\n  </a>\n    </span>\n    <figcaption class=\"gatsby-resp-image-figcaption\">Adding CSS 이전</figcaption>\n  </figure></p>\n<h2>Adding CSS</h2>\n<p><code class=\"language-text\">Layout</code>의 컴포넌트를 구성했다면 <code class=\"language-text\">CSS Modules</code>을 이용해서 스타일링을 추가할 수 있다.</p>\n<blockquote>\n<p><code class=\"language-text\">CSS Modules</code>을 사용하기 위해서는 반드시 파일의 이름이 <code class=\"language-text\">.module.css</code></p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token comment\">/* layout.mmodules.css */</span>\n<span class=\"token selector\">.container</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 36rem<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 0 1rem<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 3rem auto 6rem<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> black<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> styles <span class=\"token keyword\">from</span> <span class=\"token string\">\"./layout.module.css\"</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">Layout</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> children <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>div className<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>styles<span class=\"token punctuation\">.</span>container<span class=\"token punctuation\">}</span><span class=\"token operator\">></span><span class=\"token punctuation\">{</span>children<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><figure class=\"gatsby-resp-image-figure\" style=\"margin: 0 0;\">\n    <span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 800px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/10fe39509dfbdf097899211d9944355c/f3b60/layout-after.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 19.499999999999996%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAZ0lEQVQY063MvQmAMBRG0YdZUy0yTRKMBAsVBEXzB26gLpCtPkEcQCHFaW5xKaWEZV4QQoB3/uGc+81aixgjiHMOIsqCMQaqyvoNRZ7xeVzoxYbJeIztitns6JoBQgoopT6TUkJrjRuAoJqMKqgsrQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n        <source\n          srcset=\"/static/10fe39509dfbdf097899211d9944355c/a5e6d/layout-after.webp 200w,\n/static/10fe39509dfbdf097899211d9944355c/2276a/layout-after.webp 400w,\n/static/10fe39509dfbdf097899211d9944355c/cf465/layout-after.webp 800w,\n/static/10fe39509dfbdf097899211d9944355c/cbd37/layout-after.webp 1200w,\n/static/10fe39509dfbdf097899211d9944355c/53908/layout-after.webp 1262w\"\n          sizes=\"(max-width: 800px) 100vw, 800px\"\n          type=\"image/webp\"\n        />\n        <source\n          srcset=\"/static/10fe39509dfbdf097899211d9944355c/56d15/layout-after.png 200w,\n/static/10fe39509dfbdf097899211d9944355c/d9f49/layout-after.png 400w,\n/static/10fe39509dfbdf097899211d9944355c/78d47/layout-after.png 800w,\n/static/10fe39509dfbdf097899211d9944355c/64756/layout-after.png 1200w,\n/static/10fe39509dfbdf097899211d9944355c/f3b60/layout-after.png 1262w\"\n          sizes=\"(max-width: 800px) 100vw, 800px\"\n          type=\"image/png\"\n        />\n        <img\n          class=\"gatsby-resp-image-image\"\n          src=\"/static/10fe39509dfbdf097899211d9944355c/78d47/layout-after.png\"\n          alt=\"Adding CSS 이후\"\n          title=\"Adding CSS 이후\"\n          loading=\"lazy\"\n          style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        />\n      </picture>\n  </a>\n    </span>\n    <figcaption class=\"gatsby-resp-image-figcaption\">Adding CSS 이후</figcaption>\n  </figure></p>\n<p><code class=\"language-text\">CSS Module</code>은 자동으로 uqniue class names을 생성해준다. 또한 <code class=\"language-text\">Next.js</code>의 code splitting features은 <code class=\"language-text\">CSS Module</code>에서도 작동을 한다. (각 페이지에서 최소한의 CSS가 로드되도록, 결과적으로 번들 크기가 작아진다. = 빠르다)</p>\n<h1>Global Styles</h1>\n<p><a href=\"https://nextjs.org/learn/basics/assets-metadata-css/global-styles\">https://nextjs.org/learn/basics/assets-metadata-css/global-styles</a></p>\n<p><code class=\"language-text\">CSS Modules</code>은 component-level sytles에 유용하다. 그러나 모든 페이지에서 일부 CSS를 로드하려면 Next.js에서도 지원을 한다. global CSS 파일들을 로드하기 위해서는 <code class=\"language-text\">_app.js</code>를 <code class=\"language-text\">pages</code>의 아래에 추가하면 된다.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">App</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> Component<span class=\"token punctuation\">,</span> pageProps <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>Component <span class=\"token punctuation\">{</span><span class=\"token operator\">...</span>pageProps<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><code class=\"language-text\">App</code> 컴포넌트는 top-level component로 모든 다른 페이지에서 공통적으로 사용. 해당 컴포넌트를 사용해서 페이지 사이를 이동할때 상태 유지가 가능하다.</p>\n<blockquote>\n<p><code class=\"language-text\">pages/_app.js</code>를 추가할때는 반드시 서버를 재시작 해야한다.</p>\n</blockquote>\n<h2>Adding Global CSS</h2>\n<p><code class=\"language-text\">pages/_app.js</code>를 제외하고 다른곳에서는 global CSS를 어디서도 가져올수 없으니 반드시 <code class=\"language-text\">pages/_app.js</code>를 사용하자. 이렇게 막아놓은 이유는 전역 CSS가 페이지의 모든 요소에 영향을 주기 때문이다.</p>\n<p><code class=\"language-text\">styles</code>의 디렉토리를 생성하고 <code class=\"language-text\">global.css</code>를 그 안에 생성하자.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token comment\">/* styles/global.css */</span>\n\n<span class=\"token selector\">html,\nbody</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">font-family</span><span class=\"token punctuation\">:</span> -apple-system<span class=\"token punctuation\">,</span> BlinkMacSystemFont<span class=\"token punctuation\">,</span> Segoe UI<span class=\"token punctuation\">,</span> Roboto<span class=\"token punctuation\">,</span> Oxygen<span class=\"token punctuation\">,</span> Ubuntu<span class=\"token punctuation\">,</span>\n    Cantarell<span class=\"token punctuation\">,</span> Fira Sans<span class=\"token punctuation\">,</span> Droid Sans<span class=\"token punctuation\">,</span> Helvetica Neue<span class=\"token punctuation\">,</span> sans-serif<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">line-height</span><span class=\"token punctuation\">:</span> 1.6<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 18px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">*</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">box-sizing</span><span class=\"token punctuation\">:</span> border-box<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">a</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">color</span><span class=\"token punctuation\">:</span> #0070f3<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">text-decoration</span><span class=\"token punctuation\">:</span> none<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">a:hover</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">text-decoration</span><span class=\"token punctuation\">:</span> underline<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">img</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 100%<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> block<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>마지막으로 <code class=\"language-text\">ppages/_app.js</code>에 아래와 같이 추가하면 끝</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token string\">\"../styles/global.css\"</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">App</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> Component<span class=\"token punctuation\">,</span> pageProps <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>Component <span class=\"token punctuation\">{</span><span class=\"token operator\">...</span>pageProps<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><figure class=\"gatsby-resp-image-figure\" style=\"margin: 0 0;\">\n    <span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 800px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/968ec934d1abddf9b827fe4b290fe288/e19bc/global-css.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 27.999999999999996%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAkklEQVQY052PuwrCQBRE8/8fEh+NKQULA2KXFDYimDQuRgIKixtdYXfv0U1hJUIyxXBhhsPchI+a5kLbtmitUUphjMFaGyNEhCFKQggURUmaTljnOYssYzqbc6zqvhDzIdDkd1lGreuB0ba1Y7l3lCfPpnKsDp7d2X+hgxZG617C7SHcraCfwrUL/T0K+K885uU34b/VLNmR8ZEAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n        <source\n          srcset=\"/static/968ec934d1abddf9b827fe4b290fe288/a5e6d/global-css.webp 200w,\n/static/968ec934d1abddf9b827fe4b290fe288/2276a/global-css.webp 400w,\n/static/968ec934d1abddf9b827fe4b290fe288/cf465/global-css.webp 800w,\n/static/968ec934d1abddf9b827fe4b290fe288/cbd37/global-css.webp 1200w,\n/static/968ec934d1abddf9b827fe4b290fe288/f3388/global-css.webp 1346w\"\n          sizes=\"(max-width: 800px) 100vw, 800px\"\n          type=\"image/webp\"\n        />\n        <source\n          srcset=\"/static/968ec934d1abddf9b827fe4b290fe288/56d15/global-css.png 200w,\n/static/968ec934d1abddf9b827fe4b290fe288/d9f49/global-css.png 400w,\n/static/968ec934d1abddf9b827fe4b290fe288/78d47/global-css.png 800w,\n/static/968ec934d1abddf9b827fe4b290fe288/64756/global-css.png 1200w,\n/static/968ec934d1abddf9b827fe4b290fe288/e19bc/global-css.png 1346w\"\n          sizes=\"(max-width: 800px) 100vw, 800px\"\n          type=\"image/png\"\n        />\n        <img\n          class=\"gatsby-resp-image-image\"\n          src=\"/static/968ec934d1abddf9b827fe4b290fe288/78d47/global-css.png\"\n          alt=\"adding global css\"\n          title=\"adding global css\"\n          loading=\"lazy\"\n          style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        />\n      </picture>\n  </a>\n    </span>\n    <figcaption class=\"gatsby-resp-image-figcaption\">adding global css</figcaption>\n  </figure></p>\n<h1>Polishing Layout</h1>\n<p><a href=\"https://nextjs.org/learn/basics/assets-metadata-css/polishing-layout\">https://nextjs.org/learn/basics/assets-metadata-css/polishing-layout</a></p>\n<p>간단한 <code class=\"language-text\">CSS Modules</code>과 React 코드로 간단하게 구현을 해봤는데 <code class=\"language-text\">data fetching</code>을 하기 전에 page styling과 코드를 세련되게 해보자 (=polishing layout)</p>\n<p><figure class=\"gatsby-resp-image-figure\" style=\"margin: 0 0;\">\n    <span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 800px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/8ecb7efe31dff7b7fd1ab12b9990491f/46d5f/polishing-layout.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 69.5%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAABY0lEQVQ4y51Ty27CMBDk/3+DE0LiBjcunIp6aqSKPiAuzdvOQ0QiITjJ1OviVlASUUYa2dmsx7P2eoAraNv2bLz1H2GADpgF8nhElqTI0hR1XfeKdQqaBSTgOy4272u8rV4ReP59Dk3ysarA1htsbaZFiVLK/wnqREUaabH36cDWDl8Q+gGapul12evQoNjv0dZNb86PYHtyY0gOCIwxjEYjLBYLPCyXGA6HmM/nmM1miOP4docmKc9zTKdTTCYTWJaF8Xisxeg7DMNuQbpJOitipS6Bvol9rUEwZ/lLvQUGZVnCUa1hqxKJjH3Atm3NoihwO75FlUOJRISqcYVqYA4eeuCcw3VdCKFiWYYgCHTMcRxdbhRF8DwPvu9D8Ag82SE/nBzuDxJPG4EV47DWER6ft1pMJyvBVL0QEqA5xUiQSJvQGAt+LijVa0pUZbsKSEsgK3EnTiXT5C+vHXp7NXZ5KV/YSD3yJyRy+AAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n        <source\n          srcset=\"/static/8ecb7efe31dff7b7fd1ab12b9990491f/a5e6d/polishing-layout.webp 200w,\n/static/8ecb7efe31dff7b7fd1ab12b9990491f/2276a/polishing-layout.webp 400w,\n/static/8ecb7efe31dff7b7fd1ab12b9990491f/cf465/polishing-layout.webp 800w,\n/static/8ecb7efe31dff7b7fd1ab12b9990491f/cbd37/polishing-layout.webp 1200w,\n/static/8ecb7efe31dff7b7fd1ab12b9990491f/09a89/polishing-layout.webp 1364w\"\n          sizes=\"(max-width: 800px) 100vw, 800px\"\n          type=\"image/webp\"\n        />\n        <source\n          srcset=\"/static/8ecb7efe31dff7b7fd1ab12b9990491f/56d15/polishing-layout.png 200w,\n/static/8ecb7efe31dff7b7fd1ab12b9990491f/d9f49/polishing-layout.png 400w,\n/static/8ecb7efe31dff7b7fd1ab12b9990491f/78d47/polishing-layout.png 800w,\n/static/8ecb7efe31dff7b7fd1ab12b9990491f/64756/polishing-layout.png 1200w,\n/static/8ecb7efe31dff7b7fd1ab12b9990491f/46d5f/polishing-layout.png 1364w\"\n          sizes=\"(max-width: 800px) 100vw, 800px\"\n          type=\"image/png\"\n        />\n        <img\n          class=\"gatsby-resp-image-image\"\n          src=\"/static/8ecb7efe31dff7b7fd1ab12b9990491f/78d47/polishing-layout.png\"\n          alt=\"polishing layout 최종 화면\"\n          title=\"polishing layout 최종 화면\"\n          loading=\"lazy\"\n          style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        />\n      </picture>\n  </a>\n    </span>\n    <figcaption class=\"gatsby-resp-image-figcaption\">polishing layout 최종 화면</figcaption>\n  </figure></p>\n<h2>Download Your Profile Picture</h2>\n<ul>\n<li><a href=\"https://github.com/vercel/next-learn-starter/blob/master/basics-final/public/images/profile.jpg\">https://github.com/vercel/next-learn-starter/blob/master/basics-final/public/images/profile.jpg</a> 의 프로필 이미지를 다운로드</li>\n<li><code class=\"language-text\">images</code>의 디렉토리를 <code class=\"language-text\">public</code> 디렉토리 아래 생성</li>\n<li><code class=\"language-text\">public/images/profile.jpg</code> 파일을 추가</li>\n</ul>\n<h2>Update <code class=\"language-text\">components/layout.module.css</code></h2>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.container</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 36rem<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 0 1rem<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 3rem auto 6rem<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.header</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">flex-direction</span><span class=\"token punctuation\">:</span> column<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">align-items</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.headerImage</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 6rem<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 6rem<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.headerHomeImage</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 8rem<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 8rem<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.backToHome</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 3rem 0 0<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2>Create <code class=\"language-text\">styles/utils.module.css</code></h2>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.heading2Xl</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 2.5rem<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">line-height</span><span class=\"token punctuation\">:</span> 1.2<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">font-weight</span><span class=\"token punctuation\">:</span> 800<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">letter-spacing</span><span class=\"token punctuation\">:</span> -0.05rem<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 1rem 0<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.headingXl</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 2rem<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">line-height</span><span class=\"token punctuation\">:</span> 1.3<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">font-weight</span><span class=\"token punctuation\">:</span> 800<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">letter-spacing</span><span class=\"token punctuation\">:</span> -0.05rem<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 1rem 0<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.headingLg</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 1.5rem<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">line-height</span><span class=\"token punctuation\">:</span> 1.4<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 1rem 0<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.headingMd</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 1.2rem<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">line-height</span><span class=\"token punctuation\">:</span> 1.5<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.borderCircle</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">border-radius</span><span class=\"token punctuation\">:</span> 9999px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.colorInherit</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">color</span><span class=\"token punctuation\">:</span> inherit<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.padding1px</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">padding-top</span><span class=\"token punctuation\">:</span> 1px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.list</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">list-style</span><span class=\"token punctuation\">:</span> none<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.listItem</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 0 0 1.25rem<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.lightText</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">color</span><span class=\"token punctuation\">:</span> #999<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2>Update <code class=\"language-text\">components/layout.js</code></h2>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> Head <span class=\"token keyword\">from</span> <span class=\"token string\">\"next/head\"</span>\n<span class=\"token keyword\">import</span> styles <span class=\"token keyword\">from</span> <span class=\"token string\">\"./layout.module.css\"</span>\n<span class=\"token keyword\">import</span> utilStyles <span class=\"token keyword\">from</span> <span class=\"token string\">\"../styles/utils.module.css\"</span>\n<span class=\"token keyword\">import</span> Link <span class=\"token keyword\">from</span> <span class=\"token string\">\"next/link\"</span>\n\n<span class=\"token keyword\">const</span> name <span class=\"token operator\">=</span> <span class=\"token string\">\"Your Name\"</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> siteTitle <span class=\"token operator\">=</span> <span class=\"token string\">\"Next.js Sample Website\"</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">Layout</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> children<span class=\"token punctuation\">,</span> home <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>div className<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>styles<span class=\"token punctuation\">.</span>container<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Head<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>link rel<span class=\"token operator\">=</span><span class=\"token string\">\"icon\"</span> href<span class=\"token operator\">=</span><span class=\"token string\">\"/favicon.ico\"</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>meta\n          name<span class=\"token operator\">=</span><span class=\"token string\">\"description\"</span>\n          content<span class=\"token operator\">=</span><span class=\"token string\">\"Learn how to build a personal website using Next.js\"</span>\n        <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>meta\n          property<span class=\"token operator\">=</span><span class=\"token string\">\"og:image\"</span>\n          content<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">https://og-image.now.sh/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token function\">encodeURI</span><span class=\"token punctuation\">(</span>\n            siteTitle\n          <span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">.png?theme=light&amp;md=0&amp;fontSize=75px&amp;images=https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Ffront%2Fassets%2Fdesign%2Fnextjs-black-logo.svg</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>meta name<span class=\"token operator\">=</span><span class=\"token string\">\"og:title\"</span> content<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>siteTitle<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>meta name<span class=\"token operator\">=</span><span class=\"token string\">\"twitter:card\"</span> content<span class=\"token operator\">=</span><span class=\"token string\">\"summary_large_image\"</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Head<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>header className<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>styles<span class=\"token punctuation\">.</span>header<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n        <span class=\"token punctuation\">{</span>home <span class=\"token operator\">?</span> <span class=\"token punctuation\">(</span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>img\n              src<span class=\"token operator\">=</span><span class=\"token string\">\"/images/profile.jpg\"</span>\n              className<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>styles<span class=\"token punctuation\">.</span>headerHomeImage<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>utilStyles<span class=\"token punctuation\">.</span>borderCircle<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">}</span>\n              alt<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>name<span class=\"token punctuation\">}</span>\n            <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>h1 className<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>utilStyles<span class=\"token punctuation\">.</span>heading2Xl<span class=\"token punctuation\">}</span><span class=\"token operator\">></span><span class=\"token punctuation\">{</span>name<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h1<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>Link href<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span><span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span>a<span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span>img\n                  src<span class=\"token operator\">=</span><span class=\"token string\">\"/images/profile.jpg\"</span>\n                  className<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>styles<span class=\"token punctuation\">.</span>headerImage<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>utilStyles<span class=\"token punctuation\">.</span>borderCircle<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">}</span>\n                  alt<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>name<span class=\"token punctuation\">}</span>\n                <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>a<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>h2 className<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>utilStyles<span class=\"token punctuation\">.</span>headingLg<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span>Link href<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span><span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span>a className<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>utilStyles<span class=\"token punctuation\">.</span>colorInherit<span class=\"token punctuation\">}</span><span class=\"token operator\">></span><span class=\"token punctuation\">{</span>name<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>a<span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h2<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>header<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>main<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>children<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>main<span class=\"token operator\">></span>\n      <span class=\"token punctuation\">{</span><span class=\"token operator\">!</span>home <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>\n        <span class=\"token operator\">&lt;</span>div className<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>styles<span class=\"token punctuation\">.</span>backToHome<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Link href<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span><span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>a<span class=\"token operator\">></span>← Back to home<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>a<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n      <span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2>Update <code class=\"language-text\">pages/index.js</code></h2>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> Head <span class=\"token keyword\">from</span> <span class=\"token string\">\"next/head\"</span>\n<span class=\"token keyword\">import</span> Layout<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> siteTitle <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"../components/layout\"</span>\n<span class=\"token keyword\">import</span> utilStyles <span class=\"token keyword\">from</span> <span class=\"token string\">\"../styles/utils.module.css\"</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">Home</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>Layout home<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Head<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>title<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>siteTitle<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>title<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Head<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>section className<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>utilStyles<span class=\"token punctuation\">.</span>headingMd<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>p<span class=\"token operator\">></span><span class=\"token punctuation\">[</span>Your Self Introduction<span class=\"token punctuation\">]</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>p<span class=\"token operator\">></span>\n          <span class=\"token punctuation\">(</span>This is a sample website <span class=\"token operator\">-</span> you’ll be building a site like <span class=\"token keyword\">this</span> on<span class=\"token punctuation\">{</span><span class=\"token string\">\" \"</span><span class=\"token punctuation\">}</span>\n          <span class=\"token operator\">&lt;</span>a href<span class=\"token operator\">=</span><span class=\"token string\">\"https://nextjs.org/learn\"</span><span class=\"token operator\">></span>our Next<span class=\"token punctuation\">.</span>js tutorial<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>a<span class=\"token operator\">></span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">)</span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>section<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Layout<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h1>Styling</h1>\n<p><a href=\"https://nextjs.org/learn/basics/assets-metadata-css/styling-tips\">https://nextjs.org/learn/basics/assets-metadata-css/styling-tips</a></p>\n<p>styling tips!</p>\n<h2>Using <code class=\"language-text\">classnames</code> library to toggle classes</h2>\n<p><a href=\"https://github.com/JedWatson/classnames\">classnames</a>을 쉽게 전환 할 수 있는 간단한 라이브러리로 <code class=\"language-text\">yarn add classnames</code>로 설치가 가능하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.success</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">color</span><span class=\"token punctuation\">:</span> green<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">.error</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">color</span><span class=\"token punctuation\">:</span> red<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>위를 <code class=\"language-text\">classnames</code>을 사용하면</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> styles <span class=\"token keyword\">from</span> <span class=\"token string\">\"./alert.module.css\"</span>\n<span class=\"token keyword\">import</span> cn <span class=\"token keyword\">from</span> <span class=\"token string\">\"classnames\"</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">Alert</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> children<span class=\"token punctuation\">,</span> type <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>div\n      className<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token function\">cn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n        <span class=\"token punctuation\">[</span>styles<span class=\"token punctuation\">.</span>success<span class=\"token punctuation\">]</span><span class=\"token operator\">:</span> type <span class=\"token operator\">===</span> <span class=\"token string\">\"success\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">[</span>styles<span class=\"token punctuation\">.</span>error<span class=\"token punctuation\">]</span><span class=\"token operator\">:</span> type <span class=\"token operator\">===</span> <span class=\"token string\">\"error\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n    <span class=\"token operator\">></span>\n      <span class=\"token punctuation\">{</span>children<span class=\"token punctuation\">}</span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2>Customizing PostCSS Config</h2>\n<p>configuration 없이 바로 사용할수 있는 <code class=\"language-text\">Next.js</code>는 <a href=\"https://postcss.org/\">postcss</a>를 사용하여 CSS를 컴파일 합니다. <code class=\"language-text\">PostCSS conifg</code>를 커스터마ㅇ이즈 하기 위해서는 <code class=\"language-text\">postcss.config.js</code>를 생성하면 된다. <code class=\"language-text\">Tailwind CSS</code>와 같은 라이브러리를 사용하는 경우 유용하다.</p>\n<p>아래와 같이관련된 패키지를 설치하고</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> tailwindcss postcss-preset-env postcss-flexbugs-fixes</code></pre></div>\n<p><code class=\"language-text\">postcss.config.js</code>를 아래와 같이 작성한다</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">module<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  plugins<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token string\">\"tailwindcss\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"postcss-flexbugs-fixes\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">[</span>\n      <span class=\"token string\">\"postcss-preset-env\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">{</span>\n        autoprefixer<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n          flexbox<span class=\"token operator\">:</span> <span class=\"token string\">\"no-2009\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n        stage<span class=\"token operator\">:</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span>\n        features<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token string\">\"custom-properties\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><code class=\"language-text\">tailwind.config.js</code>에서 <code class=\"language-text\">purge</code>를 이용해 사용하지 않는 CSS는 제거를 한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// tailwind.config.js</span>\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  purge<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token comment\">// Use *.tsx if using TypeScript</span>\n    <span class=\"token string\">\"./pages/**/*.js\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"./components/**/*.js\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2>Using Sass</h2>\n<p><a href=\"https://nextjs.org/docs/basic-features/built-in-css-support#sass-support\">Sass</a>도 역시 임포트가 가능하다. <code class=\"language-text\">CSS Modules</code>을 통해 component-level Sass를 사용할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">npm install sass</code></pre></div>","excerpt":"목록 에서는 , 를 지원한다. images, videos를 어떻게 Next.js에 추가하는지 각 페이지의 를 어떻게 customize 하는지 을 사용해서 reusable React component를 만드는지 global CSS…"}},"pageContext":{"pagePath":"/개발/2020/10/10/start-next-js-2/","next":{"fields":{"slug":"/개발/2020/10/10/start-next-js-3/"},"frontmatter":{"title":"Next.js 시작해보자 3/5 - Pre-rendering and Data Fetching","tags":["nextjs","react framework","rendering","data fetching","server-side rendering","client-side rendering","static generation"]}},"prev":{"fields":{"slug":"/개발/2020/10/10/start-next-js-1/"},"frontmatter":{"title":"Next.js 시작해보자 1/5 - Next.js App 생성, 페이지 추가, Navigate Between Pages, Link, code splitting, client-side navigation, and prefetching","tags":["nextjs","react framework"]}}}},"staticQueryHashes":["1981752614","3361508366"]}