본문 바로가기

JavaScript 코드 압축

빌드 도구가 쓰는 것과 같은 종류의 압축기가 이 페이지 안에서 실행됩니다. 최신 문법과 모듈을 이해하며, 소스는 저장되지 않습니다.

  • 저장되지 않음
  • 대기열 없음, 기다림 없음
  • 회원가입 없음, 워터마크 없음
압축 결과

압축된 JavaScript 코드가 여기에 표시돼요.

사용 방법

1

JavaScript 붙여넣기

파일을 끌어다 놓아도 됩니다. 모듈, 클래스, 최신 문법을 모두 이해합니다.

2

옵션 선택

지역 변수 이름 바꾸기, console 호출 제거, 라이선스 주석 유지를 각각 켜고 끌 수 있습니다.

3

복사 또는 다운로드

압축 전후 용량도 함께 보여 줍니다.

이름 바꾸기, 제거하기, 그리고 절대 건드리면 안 되는 것

세 가지 작업이 이루어지며, 뒤로 갈수록 절약되는 용량도 크고 치러야 할 대가도 큽니다. 공백과 주석 제거는 대가가 없습니다. 죽은 코드, 즉 절대 실행될 수 없는 분기나 값을 넣고 한 번도 읽지 않는 변수도 제거합니다. 그리고 지역 이름을 짧게 줄여, 공들여 지은 calculateMonthlyTotal이 글자 하나가 됩니다. 절약의 대부분이 이 마지막 단계에서 나오고, 결과물을 읽을 수 없게 만드는 것도 이 단계입니다. 배포용으로는 괜찮지만 디버깅에는 쓸모가 없습니다.

외부에서 이름으로 참조하는 것은 바꿀 수 없으며, 이를 잘못 처리하는 것이 압축기가 코드를 망가뜨리는 원인입니다. export한 함수, 문자열로 접근하는 객체 속성, window를 통해 접근하는 모든 것, eval 안에서 쓰는 이름은 모두 그대로 남아야 합니다. 다른 어딘가에서 여러분이 쓴 그 이름으로 찾고 있기 때문입니다. 특히 속성은 기본적으로 건드리지 않습니다. user.emailAddress의 이름을 바꾸면 그 객체를 JSON으로 직렬화하거나 따로 압축된 코드가 읽는 순간 깨집니다.

소스 맵이나 원본을 보관하세요. 이름이 사라지면 실제 사용자에게서 온 스택 트레이스는 함수 t의 48,213번째 글자에서 오류가 났다는 식이 되어 아무것도 알려 주지 않습니다. 소스 맵은 디버거와 오류 보고에서 원래 이름과 줄 번호를 되살려 주며, 개발자 도구를 열 때만 불러오는 별도 파일로 배포되므로 만드는 데 드는 비용도 없습니다.

라이선스 주석은 기본적으로 유지하며, 이는 취향이 아니라 법적인 문제입니다. 많은 오픈 소스 코드가 저작권 고지를 함께 배포한다는 단 하나의 조건으로 자유롭게 사용을 허락하며, MIT와 BSD는 이를 명시하고 있습니다. 서드파티 코드가 들어간 번들에서 이 주석을 지우면, 그 코드를 쓸 수 있게 해 준 라이선스를 위반하게 됩니다. 고작 몇백 바이트입니다.

다른 작업이 필요할 때

이 작업은 브라우저 탭이 아니라 빌드 과정에 속하며, 최신 번들러는 당연하게 이를 처리합니다. esbuild --minify, Rollup, Vite는 빌드할 때 최소화하고 소스 맵을 자동으로 만들며, 무엇보다 트리 셰이킹으로 의존성에서 가져오지 않는 export를 버립니다. 실제 애플리케이션에서는 이쪽이 완성된 파일을 최소화하는 것보다 훨씬 많은 용량을 줄여 줍니다.

최적화하기 전에 먼저 측정하세요. 번들 분석기를 돌려 보면 대개 큰 의존성 하나가 파일 대부분을 차지하고 있습니다. 날짜 라이브러리, 아이콘 세트, 차트 하나 때문에 통째로 들여온 차트 패키지 같은 것입니다. 이를 교체하거나 지연 로딩하는 것이 어떤 최소화보다 효과적이고, 페이지가 필요한 것만 불러오도록 하는 코드 분할은 그 둘보다 더 효과적입니다.

자주 묻는 질문

제 코드가 어딘가에 저장되나요?

아니요. 소스 코드라면 바로 그 점이 핵심입니다. 아무것도 저장하지 않으며 어떤 서버도 코드를 보지 않습니다. 사내 소스 코드를 어딘가로 전송하는 온라인 압축 도구에 붙여 넣는 것은, 그 사이트가 보관 정책에 대해 뭐라고 하든 유출입니다. 그리고 이런 일은 급할 때 아무 생각 없이 저지르기 쉽습니다.

제 빌드 도구에 있는 압축기와 같은 건가요?

거의 확실히 그렇습니다. webpack, Rollup, Vite를 비롯한 대부분의 번들러가 쓰는 것과 같은 종류의 압축기입니다. 차이는 설치해서 쓰는 대신 여기서 실행된다는 점뿐입니다.

코드의 동작이 바뀌나요?

바뀌지 않아야 하며, 이는 가정이 아니라 검증된 사실입니다. 저희 테스트는 모듈을 압축한 뒤 원본과 압축본을 모두 import해 실행하고 결과를 비교합니다. 실제로 바뀌는 것은 지역 변수 이름(끄지 않은 경우), 미리 계산할 수 있는 상수 표현식, 그리고 죽은 코드입니다. 실행 중에 함수 이름이나 Function.prototype.toString에 의존하는 코드는 이름 줄이기로 깨질 수 있으니, 둘 중 하나에 의존한다면 이름 줄이기를 끄세요.

“모듈로 분석”은 무슨 뜻인가요?

코드를 ES 모듈로 해석할지, 일반 스크립트로 해석할지를 정하는 옵션입니다. 모듈은 import와 export를 쓸 수 있고 항상 strict 모드입니다. 요즘 코드는 대부분 모듈이라 기본값은 켜져 있습니다. 파일이 "with"를 쓰거나 non-strict 동작에 의존하는 옛날 방식의 스크립트라면 끄세요.

console 호출을 제거해야 하나요?

운영 환경이라면 대개 그렇습니다. 쓸데없는 출력이고, 개발자 도구를 여는 누구에게나 내부 정보를 노출할 수 있습니다. 기본값이 꺼져 있는 이유는, 요청받지 않고 코드를 몰래 지우는 것은 도구가 할 일이 아니기 때문입니다.

라이선스 주석은 유지되나요?

네, 기본적으로 유지됩니다. /*!로 시작하는 주석과 @license 또는 @preserve가 들어간 주석은 남겨 둡니다. 다른 사람의 MIT 라이선스 라이브러리에서 이를 지우면 라이선스 위반이기 때문입니다. 일반 주석은 제거합니다.

소스 맵을 만들 수 있나요?

이 페이지에서는 안 됩니다. 소스 맵은 알려진 URL에 있는 원본 파일과 함께 있을 때만 쓸모가 있어, 붙여 넣고 복사하는 도구와는 맞지 않습니다. 이 작업은 빌드 도구에서 하는 것이 맞습니다.

용량 제한이 있나요?

정해진 제한은 없습니다. 수천 줄 정도는 1초도 안 걸려 압축되며, 아주 큰 번들 파일은 이름을 바꾸기 전에 전체를 파싱하므로 더 오래 걸립니다. 운영용 번들 전체를 압축한다면 빌드 도구가 더 적합합니다. 이 페이지는 파일 하나나 간단한 확인용입니다.

참고: 지역 변수 이름을 바꾸면 파일은 작아지지만 결과물은 읽을 수 없게 됩니다. 배포용으로는 괜찮지만 디버깅에는 쓸모가 없으니 소스 맵이나 원본을 보관하세요. 라이선스 주석은 기본적으로 유지합니다. 사용이 허락된 코드에서 이를 지우면 라이선스를 위반할 수 있기 때문입니다.

내 웹사이트에 이 도구 넣기

블로그, 수업 페이지, 도움말 글 어디에나 무료로 넣을 수 있습니다. 코드 한 줄만 붙여 넣으면 방문자가 페이지에서 바로 사용할 수 있습니다.