Nunjucks를 사용하여 구성 요소로 정적 사이트 구축

게시 됨: 2022-03-10
요약 ↬ 클라이언트 측 JavaScript를 전혀 사용하여 사이트를 구축하지 않더라도 구성 요소로 구축하는 아이디어를 포기해야 하는 것은 아닙니다. HTML 전처리기를 사용하여 정적 사이트를 구축하는 방법을 배웁니다.

요즘은 꽤 인기가 있고, 감히 감히 감히 말할 수 없이 좋은 아이디어는 구성 요소가 있는 사이트를 구축하는 것입니다. 전체 페이지를 하나씩 작성하는 대신 구성 요소 시스템(예: 검색 양식, 기사 카드, 메뉴, 바닥글)을 만든 다음 해당 구성 요소와 함께 사이트를 구성합니다.

React 및 Vue와 같은 JavaScript 프레임워크는 이 아이디어를 매우 강조합니다. 그러나 사이트를 구축하기 위해 클라이언트 측 JavaScript를 전혀 사용하지 않는다고 해도 구성 요소로 구축하는 아이디어를 포기해야 한다는 의미는 아닙니다! HTML 전처리기를 사용하여 정적 사이트를 구축할 수 있으며 사이트와 콘텐츠를 재사용 가능한 구성 요소로 추상화하는 모든 이점을 얻을 수 있습니다.

정적 사이트는 요즘 대세이며 빠르고 안전하며 호스팅 비용이 저렴하기 때문에 당연히 그렇습니다. Smashing Magazine도 믿거나 말거나 정적인 사이트입니다!

이 기술을 사용하여 최근에 구축한 사이트를 살펴보겠습니다. 저는 CodePen Projects를 사용하여 Nunjucks를 전처리기로 제공하는 이 작업을 완벽하게 수행했습니다.

일관된 머리글, 탐색 및 바닥글이 있는 4페이지 사이트

마이크로사이트입니다. 수백 페이지를 처리하기 위해 완전한 CMS가 필요하지 않습니다. 상호 작용을 처리하기 위해 JavaScript가 필요하지 않습니다. 그러나 모두 동일한 레이아웃을 공유하는 소수의 페이지가 필요합니다.

일관된 머리글 및 바닥글
모든 페이지에서 일관된 머리글 및 바닥글
점프 후 더! 아래에서 계속 읽기 ↓

HTML만으로는 이에 대한 좋은 해결책이 없습니다. 우리에게 필요한 것은 수입품 입니다. PHP와 같은 언어는 <?php include "header.php"; ?> <?php include "header.php"; ?> , 그러나 정적 파일 호스트는 PHP를 (의도적으로) 실행하지 않으며 HTML만으로는 도움이 되지 않습니다. 다행히도 Nunjucks를 사용하여 포함을 사전 처리할 수 있습니다.

페이지로 구성 요소 가져오기
PHP와 같은 언어에서 구성 요소 가져오기가 가능합니다.

헤더, 탐색 및 바닥글을 나타내는 HTML 청크를 포함하여 레이아웃 을 만드는 것은 여기에서 완벽합니다. Nunjucks 템플릿에는 블록이라는 개념이 있으므로 레이아웃을 사용할 때 해당 지점에 콘텐츠를 삽입할 수 있습니다.

 <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>The Power of Serverless</title> <link rel="stylesheet" href="/styles/style.processed.css"> </head> <body> {% include "./template-parts/_header.njk" %} {% include "./template-parts/_nav.njk" %} {% block content %} {% endblock %} {% include "./template-parts/_footer.njk" %} </body>

포함된 파일의 이름은 _file.njk 와 같습니다. 꼭 필요한 것은 아닙니다. header.html 또는 icons.svg 일 수 있지만 1) 밑줄로 시작하는 파일이 부분적이라고 말하는 표준 방식이기 때문에 이러한 이름이 지정되었습니다. CodePen 프로젝트에서는 단독으로 컴파일을 시도하지 않는다는 의미입니다. 2) 이름을 .njk 로 지정하면 원하는 경우 더 많은 Nunjucks 항목을 사용할 수 있습니다.

이 비트들 중 어떤 것도 특별한 것이 전혀 없습니다. 그것들은 우리의 네 페이지 각각에서 사용하도록 의도된 HTML의 작은 비트일 뿐입니다.

 <footer> <p>Just a no-surprises footer, people. Nothing to see here.<p> </footer>

이렇게 하면 한 가지를 변경하고 네 페이지 모두에 변경 사항을 반영할 수 있습니다.

4페이지 레이아웃 사용하기

이제 네 페이지 각각이 파일이 될 수 있습니다. CodePen 프로젝트에서 자동으로 처리되고 저장할 때마다 index.html 파일을 생성하는 index.njk 로 시작하겠습니다.

index.njk 파일
index.njk 파일로 시작하기

다음은 레이아웃을 사용하고 해당 블록에 일부 콘텐츠를 삭제하기 위해 index.njk 에 넣을 수 있는 내용입니다.

 {% extends "_layout.njk" %} {% block content %} <h1>Hello, World!</h1> {% endblock %}

그것은 우리에게 완전한 기능의 홈페이지를 살 것입니다! 멋진! 네 페이지 각각은 똑같은 일을 할 수 있지만 블록에 다른 콘텐츠를 넣을 수 있으며 관리하기 쉬운 작은 네 페이지 사이트가 있습니다.

컴파일된 index.html
index.njk 파일은 index.html로 컴파일됩니다.

기록을 위해, 나는 우리가 컴포넌트 를 재사용하는 이 작은 덩어리를 부를지 확신하지 못합니다. 우리는 효율적이고 레이아웃을 청크로 분할하고 있습니다. 나는 컴포넌트를 데이터를 받아들이고 해당 데이터와 함께 고유한 버전을 출력하는 재사용 가능한 청크와 더 비슷하다고 생각합니다. 우리는 그것에 도달할 것입니다.

활성 탐색 만들기

네 페이지에서 동일한 HTML 덩어리를 반복했으므로 개별 탐색 항목에 고유한 CSS를 적용하여 현재 페이지를 식별할 수 있습니까? JavaScript로 할 수 있고 window.location 등을 볼 수 있지만 JavaScript 없이 할 수 있습니다. 트릭은 각 페이지에 고유한 <body> class 를 CSS에서 사용하는 것입니다.

_layout.njk 에서 바디 출력은 클래스 이름을 변수로 합니다:

 <body class="{{ body_class }}">

그런 다음 개별 페이지에서 해당 레이아웃을 호출하기 전에 해당 변수를 설정합니다.

 {% set body_class = "home" %} {% extends "_layout.njk" %}

탐색이 다음과 같이 구성되었다고 가정해 보겠습니다.

 <nav class="site-nav"> <ul> <li class="nav-home"> <a href="/"> Home </a> ...

이제 다음을 수행하여 해당 링크를 대상으로 지정하고 필요에 따라 특별한 스타일을 적용할 수 있습니다.

 body.home .nav-home a, body.services .nav-services a { /* continue matching classes for all pages... */ /* unique active state styling */ } 
탐색 시 활성 상태 스타일 지정
활성 클래스로 탐색 링크 스타일 지정.

아 그리고 저 아이콘들? 그것들은 내가 폴더에 넣고 다음과 같이 포함시킨 개별 .svg 파일입니다.

 {% include "../icons/cloud.svg" %}

그리고 다음과 같이 스타일을 지정할 수 있습니다.

 svg { fill: white; }

내부의 SVG 요소에 이미 fill 속성이 없다고 가정합니다.

Markdown에서 콘텐츠 작성

내 마이크로사이트의 홈페이지에는 많은 양의 콘텐츠가 있습니다. HTML 자체에서 확실히 작성하고 유지할 수 있지만 때로는 그런 유형을 Markdown에 맡기는 것이 좋습니다. Markdown은 쓰기가 더 깨끗하고 사본이 많을 때 보기에 조금 더 쉽습니다.

이것은 CodePen 프로젝트에서 매우 쉽습니다. 자동으로 HTML로 처리되는 .md 로 끝나는 파일을 만든 다음 index.njk 파일에 포함시켰습니다.

CodePen 프로젝트에서 HTML로 컴파일된 마크다운
마크다운의 파일은 CodePen 프로젝트에서 HTML로 컴파일됩니다.
 {% block content %} <main class="centered-text-column"> {% include "content/about.html" %} </main> {% endblock %}

실제 구성 요소 구축

구성 요소를 데이터로 전달되어 스스로 생성하는 반복 가능한 모듈로 간주해 보겠습니다. Vue와 같은 프레임워크에서는 템플릿 HTML, 범위가 지정된 CSS 및 구성 요소별 JavaScript의 격리된 비트인 단일 파일 구성 요소로 작업합니다. 정말 멋지긴 하지만 마이크로사이트에는 그렇게 멋진 것이 필요하지 않습니다.

간단한 템플릿을 기반으로 "카드"를 만들어야 하므로 다음과 같이 만들 수 있습니다.

카드 스타일 구성 요소
템플릿으로 반복 가능한 구성 요소 만들기

Nunjucks에서 이와 같은 반복 가능한 구성 요소를 빌드하려면 매크로라고 하는 것을 사용합니다. 매크로는 아주 간단합니다. HTML에 기능 이 있는 것과 같습니다!

 {% macro card(title, content) %} <div class="card"> <h2>{{ title }}</h2> <p>{{ content }}</p> </div> {% endmacro %}

그런 다음 필요에 따라 호출합니다.

 {{ card('My Module', 'Lorem ipsum whatever.') }}

여기서 전체 아이디어는 데이터와 마크업을 분리하는 것입니다. 이것은 우리에게 매우 명확하고 실질적인 이점을 제공합니다.

  1. HTML을 변경해야 하는 경우 매크로에서 변경할 수 있으며 해당 매크로를 사용하는 모든 곳에서 변경됩니다.
  2. 데이터가 마크업에 엉키지 않습니다.
  3. 데이터는 어디에서나 올 수 있습니다! 위에서 수행한 대로 매크로 호출에 데이터를 바로 코딩합니다. 또는 일부 JSON 데이터를 참조하고 이를 반복할 수 있습니다. JSON 데이터가 일종의 헤드리스 CMS, 빌드 프로세스, 서버리스 기능, 크론 작업 등으로부터 오는 설정을 상상할 수도 있다고 확신합니다.

이제 데이터와 마크업을 결합하는 반복 가능한 카드가 있습니다.

구성 요소에 대한 데이터 및 마크업은 별도로 유지됩니다.
HTML은 매크로에서 제어되지만 데이터는 어디에서나 가져올 수 있습니다.

원하는 만큼 구성 요소 만들기

이 아이디어를 가지고 실행할 수 있습니다. 예를 들어, Bootstrap이 기본적으로 HTML 패턴을 따르는 CSS의 집합체라는 것을 상상해 보십시오. 이러한 각 패턴을 매크로로 만들고 필요에 따라 호출하여 기본적으로 프레임워크를 구성 요소화할 수 있습니다.

원할 경우 일종의 원자적 디자인 철학을 수용하여 구성 요소를 중첩할 수 있습니다. Nunjucks는 논리도 제공합니다. 즉, 다른 데이터를 전달하는 것만으로 조건부 구성 요소와 변형을 만들 수 있습니다.

내가 만든 간단한 사이트에서 사이트의 아이디어 섹션에 대해 약간 다른 데이터와 약간 다른 카드 디자인을 포함하기 때문에 다른 매크로를 만들었습니다.

아이디어 섹션의 카드 구성 요소
원하는 만큼 구성 요소를 생성할 수 있습니다.

정적 사이트에 대한 빠른 사례

대부분의 사이트 는 구성 요소 기반 아키텍처의 이점이 있지만 일부 사이트만 정적 상태에 적합하다고 주장할 수 있습니다. 저는 백엔드 언어를 사용하는 것이 적절하고 유용한 많은 사이트에서 일합니다.

내 사이트 중 하나인 CSS-Tricks에는 포럼, 댓글, 전자상거래와 같이 다소 복잡한 권한 시스템을 사용하는 사용자 로그인과 같은 기능이 있습니다. 그 중 어떤 것도 정적으로 작업한다는 아이디어를 완전히 중단시키지는 못하지만 작업할 데이터베이스와 백엔드 언어가 있다는 사실에 종종 기쁩니다. 그것은 내가 필요한 것을 구축하고 한 지붕 아래에 물건을 보관하는 데 도움이됩니다.

앞으로 나아가 정적인 삶을 받아들이십시오!

이 기사에서 했던 방식으로 빌드할 때의 이점 중 하나는 최종 결과가 정적 파일 묶음이라는 점을 기억하십시오. 호스트하기 쉽고 빠르고 안전합니다. 하지만 개발자 친화적인 방식으로 작업하는 것을 포기할 필요는 없었습니다. 이 사이트는 쉽게 업데이트하고 추가할 수 있습니다.

  • 최종 프로젝트는 Power of Serverless for Front-End Developers(https://thepowerofserverless.info/)라는 마이크로사이트입니다.
  • 제게 묻는다면 정적 파일 호스팅은 서버리스 운동의 일부입니다.
  • CodePen에서 바로 모든 코드를 볼 수 있습니다. CodePen 프로젝트를 사용하여 CodePen에서 전적으로 빌드, 유지 관리 및 호스팅됩니다.
  • CodePen 프로젝트는 여기에서 이야기한 모든 Nunjucks 작업과 Sass 처리 및 이미지 호스팅과 같은 작업을 처리합니다. Gulp 또는 Grunt 기반 빌드 프로세스를 로컬로 사용하여 동일한 것을 복제할 수 있습니다. 여기 당신이 돌릴 수 있는 그런 상용구 프로젝트가 있습니다.