로딩 성능 최적화 - 텍스트 압축, 불필요한 CSS 제거

2023. 4. 28. 18:15·프론트엔드/성능 최적화

텍스트 압축

개요

서버에서 보내는 리소스들(CSS, JS, HTML)의 텍스트를 압축해서 보내고 받고 압축을 해제한다.

크기가 작기 때문에 더 빨리 다운로드할 수 있다. -> 로딩 속도를 개선할 수 있다.

lighthouse의 opportunities에서 확인할 수 있다.

종류

텍스트 압축에는 크게 2가지가 있다.

  • GZIP
  • Deflate

GZIP이 Defalte보다 더 좋은 압축율을 제공한다.

적용

번들은 기본적으로 압축이 안된 상태로 전달이 된다.

이를 compression-webpack-plugin을 활용해 빌드 시 압축하거나, 서버 코드에서 텍스트 압축을 적용한 후 전달하도록 하면 된다.

압축 시 모든 파일을 압축하는 것이 아닌 크기가 특정 크기 이상(ex: 10KB)인 파일들만 압축을 해서 전달한다.

압축하는 시간, 압축을 푸는 시간을 고려해서 크기가 특정 크기 이상인 파일들이 압축을 할 때 속도상의 이점을 가져갈 수 있기 때문이다.

compression-webpack-plugin을 적용하는 방법은 다음과 같다.

// webpack.config.prod.js
plugins: [
	/// 생략
    new CompressionPlugin({
      deleteOriginalAssets: true,
      algorithm: 'gzip',
      test: /\.(js|css|html)$/,
      threshold: 10240, // 압축을 적용할 파일 크기의 최소값 (10KB)
      minRatio: 0.8, // 압축률이 80% 이상일 경우에만 압축을 적용
    }),
]

네트워크 탭에서 Response Headers의 Content-Encoding 속성을 확인하여 압축 여부, 종류를 확인할 수 있다.

불필요한 CSS 제거

크롬 Coverage 탭 활용해서 CSS파일에서 사용하지 않는 부분들을 확인할 수 있다. (빨간 부분: 사용X)

사용하지 않는 CSS 코드들은 어떻게 제거할 수 있을까?

PurgeCSS를 사용한다. - className 전부 추출해서 CSS 코드와 비교해 사용하지 않는 CSS 코드를 제거한다.

tailwindcss를 사용할 때 특히 유용하다.

webpack에 purgecss-webpack-plugin을 활용해서 mini-css-extract-plugin과 같이 활용해서 사용할 수 있다.

const path = require("path");
const glob = require("glob");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const { PurgeCSSPlugin } = require("purgecss-webpack-plugin");

const PATHS = {
  src: path.join(__dirname, "src"),
};

module.exports = {
  entry: "./src/index.js",
  output: {
    filename: "bundle.js",
    path: path.join(__dirname, "dist"),
  },
  optimization: {
    splitChunks: {
      cacheGroups: {
        styles: {
          name: "styles",
          test: /\.css$/,
          chunks: "all",
          enforce: true,
        },
      },
    },
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, "css-loader"],
      },
    ],
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: "[name].css",
    }),
    new PurgeCSSPlugin({
      paths: glob.sync(`${PATHS.src}/**/*`, { nodir: true }),
    }),
  ],
};

tailwindcss 와 같이 사용 시 가끔 클래스이름 들을 제대로 추출하지 못해서 사용하는 CSS 코드가 날아가는 경우가 있다.

config 설정을 따로 해줄 수 있다.

/// purgecss.config.js
module.exports = {
    defaultExtractor: (content) => content.match(/[\w\:\-]+/g) || []
}
저작자표시 (새창열림)

'프론트엔드 > 성능 최적화' 카테고리의 다른 글

렌더링 성능 최적화 - 애니메이션  (0) 2023.05.01
렌더링 성능 최적화 - Bottleneck code  (0) 2023.05.01
로딩 성능 최적화 - 캐시  (0) 2023.04.28
로딩 성능 최적화 - 폰트  (0) 2023.04.28
로딩 성능 최적화 - 프리 로딩  (0) 2023.04.28
'프론트엔드/성능 최적화' 카테고리의 다른 글
  • 렌더링 성능 최적화 - 애니메이션
  • 렌더링 성능 최적화 - Bottleneck code
  • 로딩 성능 최적화 - 캐시
  • 로딩 성능 최적화 - 폰트
정현우12
정현우12
  • 정현우12
    정현우의 개발 블로그
    정현우12
  • 전체
    오늘
    어제
    • 분류 전체보기 (79)
      • 프론트엔드 (56)
        • JavaScript, TypeScript (12)
        • 스타일링 (1)
        • React (13)
        • Next.js (4)
        • 개발 환경 (9)
        • 테스트 (3)
        • 성능 최적화 (11)
        • 함수형 프로그래밍 (2)
        • 구조 (1)
      • 프로젝트 회고 (23)
        • 이미지편집기 개발 (7)
        • 엑셀 다운로드, 업로드 공통 모듈 개발 (4)
        • 사용자 매뉴얼 사이트 개발 (3)
        • 통계자동화 솔루션 개발 (1)
        • 엑셀 편집기 개발 (5)
        • API 플랫폼 (1)
        • 콜센터 솔루션 OB 캠페인 (1)
        • AI 스튜디오 (1)
      • 백엔드 (0)
  • 블로그 메뉴

    • 홈
    • 포트폴리오
    • 태그
  • 인기 글

  • 태그

    useReducer
    엑셀 에디터
    JavaScript
    TypeScript
    사용자 매뉴얼 사이트
    Github Actions
    엑셀
    웹 성능 최적화
    webpack
    frontend
    로딩 성능 최적화
    이미지 편집기
    memoization
    Next.js
    React
    React-boilerplate
    커스텀 훅
    라이브러리 선정
    회고
    렌더링 성능 최적화
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
정현우12
로딩 성능 최적화 - 텍스트 압축, 불필요한 CSS 제거
상단으로

티스토리툴바