Project

티스토리 스킨 제작 #1 개발 환경 세팅

by somida 2022. 11. 6.

깃허브 블로그를 쓰다가 티스토리로 정착을 하게 되었는데 조금 불편함을 느끼게 되어서 진행해보는 티스토리 스킨 제작기

 

0. 티스토리 스킨 가이드

티스토리 스킨 가이드도 있는데, 이 가이드를 참고해서 만들어 볼 예정이다.

 

소개 · GitBook

티스토리 스킨 가이드 티스토리에서는 스킨을 통해서 사이트를 자유롭게 디자인할 수 있습니다. 스킨은 치환자를 사용하여 제작되고 사용된 치환자에는 티스토리의 데이터가 대입되어 티스토

tistory.github.io

 

 

티스토리 스킨 가이드에 보면, 파일 구조는 다음과 같이 나와있다.

이 중에서 index.xml, skin.html, style.css, script.js를 본인의 입맛에 맞게 수정하면 된다.

SKIN ─┬─ index.xml
      ├─ skin.html
      ├─ style.css
      ├─ preview.gif
      ├─ preview256.jpg
      ├─ preview560.jpg
      ├─ preview1600.jpg
      └─ images ─┬─ script.js
                 ├─ background.jpg
                 ├─ background.jpg
                 └─ background.jpg

 

 

일단 가이드에 나오는 구조를 보면, 이미지를 제외하고 기본적으로 다음과 같은 구조로 만들 수 있다.

SKIN ─┬─ index.xml
      ├─ skin.html
      ├─ style.css
      └─ images ── script.js

 

 

1. Typescript 적용

이제 스킨 제작을 위한 기본적인 세팅을 진행해야 하는데,

요즘 타입스크립트를 배우고 있어서 타입스크립트를 통해 개발을 진행해 보았다.

npm init -y 	# package.json 생성
npm install typescript
npx tsc --init	# tsconfig.json 생성

 

구성한 tsconfig.json은 다음과 같다.

{
  "compilerOptions": {          // 컴파일 옵션
    "allowJs": true,            // js 파일 컴파일 허용 여부
    "target": "es2016",         // 컴파일 버전 설정
    "module": "es6",            // 모듈 버전 설정 (require 문법, import 문법...)
    "removeComments": true,     // 컴파일 시 주석 제거,
    "outDir": "images",         // outDir 폴더에 변환된 js 파일 저장,

    "strict": true ,            // strict 관련 켜기
    "noImplicitAny": true,      // type 지정 필수
    "strictNullChecks": true,   // null, undefined가 참조 하는 것 방지

    "esModuleInterop": true,    // 모든 import에 대한 namespace 생성 여부
  },
  "include": [                  // 컴파일 할 파일 경로 설정 (src 하위의 모든 .ts 파일)
    "src/script.ts"
  ]
}

 

그래서 기본적인 폴더 구조는 이렇게 구성되었다.

SKIN ─┬─ node_modules/			// npm
      ├─ images		
      ⎪	  └─ script.js	
      ├─ src	
      ⎪	  └─ script.ts		
      ├─ package.json
      ├─ package-lock.json
      ├─ tsconfig.json
      ├─ index.xml
      ├─ skin.html
      └─ style.css

 

 

2. TailwindCSS 적용

CSS는 사용해봤던 styled-components를 사용해볼까 했는데 조금 더 편하게 스타일을 적용할 수 있는 방법이 없을까 찾아보다가,

TailwindCSS를 발견하게 되었다.

 

나랑 똑같은 생각을 하고서 TailwindCSS를 사용하신 분의 글을 발견했는데,

 

요약해보자면

styled-components방식이나 scss 등의 방식은 하나의 스타일만 추가할 때에도 새로운 컴포넌트명을 지어서 그 안에 원하는 스타일을 하나하나 작성해야 하는 방식이라 번거롭다는 특징을 가지고 있었는데, 

TailwindCSS는 Bootstrap과 비슷하게 Utility-First 콘셉트를 가지고 편하게 스타일링을 할 수 있다는 것이다.

 

근데, 그럼 Bootstrap을 사용하면 되지 않나...? 했는데,

Bootstrap과의 차이점은 기본적인 스타일을 가진 것이 아님에도 불구하고 일관적인 스타일링을 할 수 있다는 점이다. 

Bootstrap으로 개발된 사이트들을 보면 모두 동일한 스타일을 가진 것을 볼 수 있지만,

(Bootstrap에서 제일 좋으면서도 힘들었던 특징이었다. 너무 자기만의 스타일이 강력해..)

TailwindCSS는 제공되는 Utility를 활용하지만, Bootstrap보다 더 유연하게 커스텀하여 사용할 수 있다고 생각한다.

 

 

3. PostCSS, Autoprefixer 적용

TailwindCSS, tailwind.config.js을 설치하면서, postCSS, Autoprefixer 도 함께 설치해준다.

TailwindCSS v2 이후에는 IE를 지원하지 않기 때문에 크로스 브라우징을 대응해주는 PostCSS의 autoprefixer를 같이 사용해줘야 한다.

npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p		# tailwind.config.js, postcss.config.js 생성

그러고 postcss.config.js를 생성하여 다음과 같이 설정해주고,

module.exports = {
    plugins: {
        tailwindcss: {},
        autoprefixer: {},
    },
};

tailwind.config.js에도 다음과 같이 설정해준다.

/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ['./src/**/*.{ts, tsx, js, jsx}'],  // tailwindcss를 사용할 위치
  darkmode: 'class',    // 다크모드 ('media' : OS에 따라, 'class' : 스위칭 가능)
  theme: {
    extend: {},
  },
  plugins: [],
}

그러고 나서는 메인 css파일에 TailwindCSS를 추가해준다. 나는 style.css을 생성하여 추가해주었다.

/* src/style.css */
@tailwind base;
@tailwind components;
@tailwind utilities;

이후 TailwindCSS를 빌드해본다. 그러면 ./src/style.css의 파일이 ./dist/style.css에 빌드가 되는 걸 확인할 수 있다.

npm tailwindcss -i ./src/style.css -o ./dist/style.css

 

 

 

4. Webpack 적용

원래는 package.json에 해당 스크립트를 추가하여 쉽게 빌드를 진행하면 되는데,

여기선 typescript와 TailwindCSS를 같이 배포하기 위해 webpack을 함께 사용하기로 했다.

이때, Webpack은 typescript를 이해하지 못하기 때문에 ts-loader도 함께 설치해준다.

npm install -D webpack webpack-cli ts-loader

 

Webpack을 일단 설치하고, ts-loader를 참고하여 webpack.config.js파일을 다음과 같이 구성한다.

const path = require('path');

module.exports = {
    entry: './src/script.ts',     // webpack이 번들링을 시작하는 것
    mode: 'production',           // development(개발), production(운영), none
    module: {
        rules: [                  // 모듈에 대한 규칙 (로더 설정, 파서 옵션 등)
            {
                test: /\.tsx?$/,
                use: 'ts-loader', // 로더에 대한 옵션
                exclude: /node_modules/,
            }
        ]
    },
    resolve: {                    // 모듈 요청 해석 옵션
        extensions: ['.tsx', '.ts', '.js']  // 사용한 확장자
    },
    output: {                    // 번들(합친 파일) 저장하는 파일, 경로 설정
        filename: 'script.js',
        path: path.resolve(__dirname, 'dist/images'),
    },
};

 

 

package.json에 script를 추가하고, 실행을 해보면 잘 되는 걸 확인할 수 있다.

  "scripts": {
    "build": "webpack"
  },
npm run build

 

 

5. mini-css-extract-plugin 적용

하지만, webpack.config.json의 설정은 여기서 끝난 게 아니다...

이렇게 번들을 진행하게 되면 js 파일 하나로만 파일이 생성이 되는데, 티스토리에서 원하는 것은 css, js가 나눠진 파일이다.

그래서 mini-css-extract-plugin를 활용하면 css가 분리되어 build가 된다.

이것 외에도 postcss-loader를 설치하여 css 로더에 대한 옵션을 같이 추가한다.

 npm install -D mini-css-extract-plugin postcss-loader

 

설치를 진행하고, mini-css-extract-pluginpostcss설정을 참고하여 webpack.config.json파일을 수정해줘야 한다. 

const path = require('path');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module.exports = {
    entry: './src/script.ts',     // webpack이 번들링을 시작하는 것
    mode: 'production',           // development(개발), production(운영), none
    module: {
        rules: [                  // 모듈에 대한 규칙 (로더 설정, 파서 옵션 등)
            {
                test: /\.tsx?$/,
                use: 'ts-loader', // 로더에 대한 옵션
                exclude: /node_modules/,
            },
            {
                test: /\.css$/i,
                use: [MiniCssExtractPlugin.loader, "css-loader", "postcss-loader"],
                exclude: /node_modules/,
            },
        ]
    },
    resolve: {                    // 모듈 요청 해석 옵션
        extensions: ['.tsx', '.ts', '.js']  // 사용한 확장자
    },
    output: {                    // 번들(합친 파일) 저장하는 파일, 경로 설정
        filename: 'script.js',
        path: path.resolve(__dirname, 'dist/images'),
    },
    plugins: [new MiniCssExtractPlugin({filename: '../style.css'})],
};

* build를 할 때는 script.ts에 해당 css 주소를 import 한 후에 진행해야 확인이 가능하다.

 

 

 

6. webpack-dev-server 적용

로컬에서 먼저 개발을 진행한 후 적용할 예정이기 때문에,,,먼저 webpack-dev-server를 설치해준다.

npm install -D webpack-dev-server

 

 

그리고, webpack.config.js에 해당 내용을 설정하고,

    devServer: {
        static: {
            directory: path.resolve(__dirname, "dist"),
        },
        port: 3000,
    },

 

 

package.json의 script에 해당 내용 설정

	"start": "webpack serve --open --mode=development --hot"

 

그리고 나서는 터미널에 다음 명령어를 실행시키면 확인할 수 있다.

npm run start

여기서 나는 skin.html이라는 이름으로 작성을 해두었기 때문에...skin.html을 들어가면 개발한 화면을 확인할 수 있다.

 

 

반응형

댓글