CSS·JS 압축기

CSS와 JS의 주석·불필요한 공백을 제거해 용량을 줄이고, CSS는 보기 좋게 정렬도 합니다. 문자열·정규식 안은 건드리지 않습니다.

📁 .css / .js 파일을 끌어다 놓거나 클릭해서 선택
파일은 브라우저에서만 읽습니다 · 최대 8MB
결과

공백·주석 제거 수준의 안전한 압축입니다. 변수명 난독화(mangling), 죽은 코드 제거 같은 고급 압축은 하지 않습니다. 자체 파서로 이름을 바꾸면 코드가 조용히 깨지기 때문입니다. 최대한 줄이려면 빌드 단계에서 terser·esbuild·cssnano 를 쓰세요.
🛡 문자열·템플릿 리터럴·정규식 리터럴 안의 내용은 한 글자도 건드리지 않습니다. JS는 줄바꿈이 세미콜론 역할을 하는 경우(ASI)가 있어, 문장이 이어질 수밖에 없는 자리의 줄바꿈만 없앱니다. / 가 나눗셈인지 정규식인지 판단이 서지 않으면 압축을 중단하고 원본을 그대로 둡니다. 압축 후에는 결과를 브라우저 파서로 다시 검사합니다.
🔍 다만 문법 검사가 동작 동일성 보장은 아닙니다. 함수 소스를 문자열로 읽는 코드(Function.prototype.toString)나 주석에 의미를 두는 코드(@license, webpackChunkName)는 영향을 받을 수 있으니 배포 전 실제 동작을 확인하세요.

CSS·JS 압축기란?

CSS와 JS에서 주석과 들여쓰기는 사람을 위한 것이라, 배포본에서는 그대로 전송 용량이 됩니다. 이 도구는 붙여넣은 코드에서 주석과 불필요한 공백을 걷어내고 원본 대비 몇 퍼센트가 줄었는지 보여 줍니다. 중요한 것은 무엇을 하지 않는가입니다. 문자열·템플릿 리터럴·정규식 리터럴 안의 내용은 한 글자도 건드리지 않고, CSS 색상 축약(#ffffff→#fff)은 선택자의 ID(#abcdef)와 헷갈리지 않도록 속성값 자리에서만 적용합니다. JS는 변수명 난독화를 하지 않습니다. 자체 파서로 변수 이름을 바꾸는 순간 동적 참조가 있는 코드가 조용히 깨지기 때문입니다. 압축한 뒤에는 결과를 브라우저 파서로 다시 검사해, 문법이 깨졌으면 결과를 내보내지 않고 경고합니다. CSS 정렬(beautify) 모드로 압축된 CSS를 사람이 읽을 수 있게 되돌릴 수도 있습니다.

사용 방법

  1. CSS 또는 JS 코드를 붙여넣거나 .css/.js 파일을 끌어다 놓습니다(언어는 자동 감지).
  2. "압축"을 누르면 주석과 공백이 제거된 결과와 절감률이 표시됩니다.
  3. CSS는 "정렬"로 들여쓰기를 복원해 읽기 좋게 되돌릴 수 있습니다.
  4. 경고가 뜨면 어떤 부분이 보수적으로 유지됐는지 확인합니다.
  5. 결과를 복사하거나 .min.css / .min.js 파일로 저장합니다.

CSS·JS 압축기 사용 가이드

실제 작업에서 이 도구를 어떻게 쓰는지, 무엇을 조심해야 하는지 정리했습니다.

gzip 을 이미 켰다면 minify 효과는 줄어듭니다

정직하게 말하면 이렇습니다. minify 가 지우는 것은 대부분 반복되는 공백과 줄바꿈인데, 그건 gzip·brotli 가 가장 잘 압축하는 패턴입니다. 이미 반복 패턴을 몇 바이트로 줄여 놓는 압축기 입장에서, 그 반복을 미리 지워 준다고 크게 달라지지 않습니다.

경향은 대략 이렇습니다 — 원본 대비 raw 절감이 30%라 해도, gzip 을 통과한 뒤의 절감폭은 그보다 훨씬 작아지는 것이 보통입니다. 그래서 "minify 했더니 30% 줄었다"를 실제 전송량 개선으로 착각하면 안 됩니다.

이 도구의 통계에 "결과 gzip 후" 크기를 넣어 둔 이유가 그것입니다. 그 숫자가 실제로 네트워크를 타는 크기에 가깝습니다. 원본을 그대로 한 번 넣어 gzip 크기를 재 보고, 압축한 결과의 gzip 크기와 비교해 보세요. 차이가 몇 KB 안 된다면 minify 는 전송량보다는 소스를 덜 노출하는 정도의 의미입니다.

순서를 정리하면 — 1) 서버에 gzip·brotli 를 켰는지 먼저 확인하세요(이게 효과가 가장 큽니다). 2) 그다음이 minify. 3) 그리고 캐시 헤더. 압축이 꺼진 서버에서 minify 만 하는 것은 순서가 거꾸로입니다.

이 도구로 충분한 경우 · 빌드 도구로 가야 하는 경우

이 도구는 공백·주석 제거 수준의 안전한 압축만 합니다. 변수명 축약(mangling), 죽은 코드 제거, 속성 병합 같은 고급 최적화는 하지 않습니다. 절감률이 전용 도구보다 낮은 것은 기능이 부족해서가 아니라, 자체 파서로 이름을 바꾸는 순간 동적 참조가 있는 코드가 조용히 깨지기 때문에 안 하는 쪽을 택한 것입니다.

상황권장
빌드 단계가 없는 사이트(그누보드 스킨, 티스토리 스킨, 정적 HTML)이 도구로 충분
한 장짜리 스크립트·인라인 스타일을 잠깐 줄이기이 도구
CMS 관리자 화면에 직접 붙여넣는 커스텀 CSS이 도구
압축된 CSS 를 받아서 읽어야 할 때이 도구의 "정렬(CSS)"
npm·번들러가 이미 있는 프로젝트esbuild · terser · cssnano — 훨씬 많이 줄고 자동화됨
수십 개 파일을 매 배포마다빌드 파이프라인 — 손으로 붙여넣을 일이 아닙니다
최대한 줄여야 하는 상황(모바일 초기 로딩)번들러 + 트리셰이킹 + 코드 스플리팅

CSS 압축에서 조심할 것

색상·0 축약 옵션을 켜면 여섯 자리 색상값이 세 자리로, 0.5em 이 .5em 으로 줄어듭니다. 여기에 함정이 몇 개 있습니다.

  • #abcdef 가 색상값인지 ID 선택자인지 구분해야 합니다. 이 도구는 속성값 자리에서만 축약하므로 같은 문자열이 선택자로 쓰인 곳은 건드리지 않습니다.
  • calc() 안의 공백은 의미가 있습니다. calc(100% - 20px) 에서 마이너스 양옆 공백을 지우면 계산이 아예 안 됩니다. 이 도구는 calc() 안을 건드리지 않습니다.
  • 느낌표로 시작하는 주석과 @license 주석은 "보존" 옵션이 켜져 있으면 남습니다. 오픈소스 라이브러리를 압축할 때는 반드시 켜 두세요. 라이선스 고지를 지우면 라이선스 위반입니다.
  • 축약 결과를 못 알아보게 됐다면 "정렬(CSS)"로 되돌릴 수 있습니다. 다만 주석은 이미 지워졌으므로 돌아오지 않습니다. 원본은 따로 보관하세요.

JS 압축 — 왜 줄바꿈이 다 안 지워지나

자바스크립트에는 세미콜론 자동 삽입(ASI)이 있습니다. 줄바꿈이 세미콜론 역할을 하는 경우가 있다는 뜻입니다. 그래서 줄을 무작정 다 붙이면 코드의 동작이 바뀝니다.

  • 이 도구는 쉼표·연산자·여는 괄호처럼 문장이 이어질 수밖에 없는 자리의 줄바꿈만 없애고, 나머지는 남깁니다. 그래서 결과가 완전한 한 줄이 되지는 않습니다.
  • 슬래시가 나눗셈인지 정규식인지 판단이 서지 않는 드문 경우에는 압축을 중단하고 원본을 그대로 둔 뒤 이유를 알려 줍니다. 결과가 안 줄었다면 그 이유일 수 있습니다.
  • 압축 후에는 결과를 브라우저 파서로 다시 검사합니다. 문법이 깨졌으면 결과를 내보내지 않습니다.
javascript
// return 뒤의 줄바꿈이 세미콜론으로 해석되어 undefined 를 반환한다
function f() {
  return
  { ok: true }
}

// 반대로 이 줄바꿈을 지우면 동작이 바뀐다
var a = b
(function(){})()   // 붙이면 b(function…) 호출이 된다
문법 검사를 통과했다고 동작이 같다는 보장은 아닙니다. 함수 소스를 문자열로 읽는 코드(Function.prototype.toString), 주석에 의미를 두는 코드(@license, webpackChunkName), 스택 트레이스의 줄 번호에 의존하는 에러 리포팅은 영향을 받습니다. 배포 전에 실제 동작을 확인하세요.

압축했더니 깨졌을 때

  1. 먼저 원본이 원래 깨져 있었는지 확인합니다. 이 도구는 결과를 브라우저 파서로 검사하므로, 오류가 났다면 원본에 이미 문법 문제가 있었을 가능성이 높습니다.
  2. 언어 자동 감지가 틀렸는지 봅니다. CSS-in-JS 나 HTML 조각이 섞인 파일은 감지가 어긋날 수 있습니다. CSS·JS 탭을 직접 골라 다시 해 보세요.
  3. 여러 파일을 이어붙여 넣었다면 하나씩 나눠서 넣어 보세요. 어느 파일이 문제인지 바로 좁혀집니다.
  4. @license 나 webpackChunkName 같은 지시어가 지워졌는지 봅니다. 주석 보존 옵션을 켜세요.
  5. 그래도 안 되면 이 도구로 압축하지 마세요. 빌드 도구를 붙일 때입니다. 덜 압축된 채로 돌아가는 코드가, 압축돼서 깨진 코드보다 낫습니다.
문자열·템플릿 리터럴·정규식 리터럴 안의 내용은 한 글자도 건드리지 않습니다. 한글 문구나 정규식 패턴 안의 공백이 사라졌다면 이 도구 때문이 아닙니다.

자주 묻는 질문

terser나 cssnano만큼 줄어드나요?

아니요. 이 도구는 공백·주석 제거 수준의 안전한 압축만 합니다. 변수명 축약, 죽은 코드 제거, 속성 병합 같은 고급 최적화는 하지 않으므로 절감률은 대개 10~30% 수준입니다. 빌드 파이프라인이 있다면 terser·esbuild·cssnano 같은 전용 도구가 훨씬 많이 줄입니다. 이 도구는 빌드 도구를 붙이기 애매한 한 장짜리 스크립트나 인라인 스타일을 빠르게 줄일 때 쓰기 좋습니다.

변수명 난독화(mangling)는 왜 안 하나요?

안전하게 하려면 스코프를 완전히 해석하는 파서가 필요합니다. 정규식 수준의 이름 치환은 문자열 안의 같은 단어, 전역으로 노출한 함수 이름까지 함께 바꿔 코드를 조용히 망가뜨립니다. 덜 압축될지언정 깨진 코드를 내보내지 않는 쪽을 택했습니다.

JS의 줄바꿈은 왜 다 지우지 않나요?

자바스크립트는 줄바꿈이 세미콜론 역할을 하는 경우(ASI)가 있어서, 줄을 무작정 붙이면 동작이 달라질 수 있습니다. 이 도구는 쉼표·연산자·여는 괄호처럼 문장이 이어질 수밖에 없는 자리의 줄바꿈만 없애고, 나머지 줄바꿈은 남겨 둡니다.

정규식과 나눗셈은 어떻게 구분하나요?

앞에 나온 토큰을 보고 판단합니다. 예를 들어 if(...) 뒤의 /는 정규식, 변수나 ) 뒤의 /는 나눗셈으로 봅니다. 괄호가 if·while·for의 조건인지까지 거슬러 확인합니다. 그래도 판단이 서지 않는 드문 경우에는 압축을 중단하고 원본을 그대로 두며 이유를 알려 줍니다.

압축 결과가 원본과 똑같이 동작하나요?

문자열·정규식·템플릿 안을 보존하고 결과를 다시 파싱해 검사하지만, 문법 검사가 동작 동일성 보장은 아닙니다. 특히 함수 코드를 문자열로 읽어 파싱하거나(Function.prototype.toString), 주석에 의미를 두는 코드(@license, webpackChunkName, "use asm")는 영향을 받을 수 있습니다. 배포 전에는 반드시 실제 동작을 확인하세요.

CSS에서 무엇이 제거되나요?

주석(/*! 로 시작하는 라이선스 주석은 보존), 불필요한 공백과 줄바꿈, 블록 마지막의 세미콜론이 제거되고, 속성값의 #aabbcc는 #abc로, 0.5는 .5로 축약됩니다. calc() 안의 공백은 의미가 있으므로 건드리지 않습니다.

코드가 서버로 전송되나요?

아니요. 압축·정렬·검증 모두 브라우저 안에서 실행되며, 코드가 서버로 전송되거나 저장되지 않습니다. 사내 소스도 안심하고 넣을 수 있습니다.