VSCodeでコードをminifyする方法

採用はこちら

VSCodeでJavaScriptやCSS、HTMLなどのコードをminifyしたい場合は、外部のminifyツールやビルドツールを利用するのが一般的です。

VSCodeそのものに、JavaScript・CSS・HTMLをまとめてminifyする汎用的な標準機能が用意されているわけではありません。

そのため、Terserやesbuild、html-minifier-terserなどをVSCodeのターミナルから実行したり、npm scriptsやVSCode Tasksと組み合わせたりしてminifyします。

単発でコードを圧縮するだけであればコマンドを直接実行する方法でも問題ありません。

一方、WebサイトやWebアプリを継続的に開発する場合は、npm scriptsやビルドツールを利用して自動化しておくと管理しやすくなります。

目次

minifyとは

minifyとは、プログラムの動作に不要な空白や改行、コメントなどを削除し、コードのファイルサイズを小さくする処理です。

日本語では「圧縮」や「最小化」と表現されることもあります。

JavaScriptをminifyした例

たとえば、次のJavaScriptがあるとします。

function add(a, b) {
  return a + b;
}

console.log(add(10, 20));

minifyすると、次のような形になります。

function add(d,n){return d+n}console.log(add(10,20));

実際の出力結果は使用するminifierや設定によって異なります。

ツールによっては、単純に空白や改行を削除するだけではなく、変数名の短縮や不要な処理の削除、構文の短縮なども行われます。

minifyするメリット

minifyする主なメリットは、ファイルサイズを小さくできることです。

JavaScriptやCSS、HTMLのデータ量が減ることで、Webサーバーからブラウザへ転送するデータ量を減らせます。

ただし、Webサイトの表示速度はminifyだけで決まるわけではありません。

実際のWebサイトでは、Brotliやgzipによる通信圧縮、キャッシュ、画像最適化、不要なJavaScriptの削減、コード分割なども重要になります。

VSCodeでminifyする主な方法

VSCodeでminifyする方法はいくつかあります。

代表的なのは次の方法です。

ターミナルからminifierを実行する

もっとも基本的な方法です。

VSCodeに搭載されている統合ターミナルから、Terserやesbuildなどのコマンドを実行します。

環境をVSCodeに依存させにくく、ほかのエディタやCI環境でも同じコマンドを利用できるのがメリットです。

npm scriptsから実行する

毎回長いコマンドを入力するのではなく、package.jsonのscriptsへminify処理を登録する方法です。

たとえば、次のようなコマンドにまとめられます。

npm run build

複数人で開発する場合やGitでプロジェクトを管理する場合には、特に便利な方法です。

VSCode Tasksから実行する

VSCodeには、コマンドやnpm scriptsをエディタから呼び出せるTasks機能があります。

npm scriptsとして登録したminify処理をVSCode Tasksから実行することも可能です。

VSCode拡張機能を利用する

VSCode Marketplaceには、JavaScriptやCSS、HTMLをminifyできる拡張機能もあります。

簡単なファイルを手動で圧縮したい場合には便利です。

ただし、本番用のビルド処理をVSCode拡張機能だけに依存すると、開発者ごとの環境差が発生しやすくなります。

継続的な開発では、npm scriptsやビルドツールを利用したほうが再現性を高めやすいでしょう。

JavaScriptをTerserでminifyする方法

JavaScriptをminifyする代表的なツールのひとつがTerserです。

Terserでは、JavaScriptの圧縮や変数名などの短縮を行えます。

Node.jsが利用できるか確認する

Terserをnpmから利用する場合は、Node.js環境が必要です。

VSCodeのメニューから「ターミナル」→「新しいターミナル」を開き、次のコマンドを実行します。

node -v

続いて、npmも確認します。

npm -v

バージョン番号が表示されれば、Node.jsとnpmを利用できます。

Terserをインストールする

プロジェクト単位でTerserを利用する場合は、プロジェクトフォルダで次のコマンドを実行します。

npm install --save-dev terser

--save-devを指定すると、開発時に使用する依存パッケージとしてdevDependenciesへ登録されます。

JavaScriptをminifyする

たとえば、次のファイルを圧縮するとします。

src/app.js

出力先を次のファイルにします。

dist/app.min.js

次のコマンドを実行します。

npx terser src/app.js -c -m -o dist/app.min.js

-cは圧縮処理を有効にするオプションです。

-mは識別子を短くするmangle処理を有効にします。

-oは出力ファイルを指定するためのオプションです。

Terserのトップレベルmangleには注意する

通常の-mでは、トップレベルにある変数名や関数名が必ず短縮されるわけではありません。

トップレベルまで対象にする場合は、次のように--toplevelを指定できます。

npx terser src/app.js -c -m --toplevel -o dist/app.min.js

ただし、トップレベルの変数や関数を外部のコードから参照している場合は、名前が変わることで問題が発生する可能性があります。

必要性を理解したうえで利用することが重要です。

mangle-propsは慎重に利用する

Terserには、オブジェクトのプロパティ名まで短縮する--mangle-propsという機能もあります。

ただし、通常の-mよりもコードへ与える影響が大きく、設定によっては正常に動作しなくなる可能性があります。

特別な理由がなければ、最初は次のような一般的な設定から利用するのが安全です。

npx terser src/app.js -c -m -o dist/app.min.js

esbuildでJavaScriptをminifyする方法

JavaScriptを高速に処理したい場合は、esbuildも便利です。

esbuildはJavaScriptだけでなく、TypeScriptやCSSなども扱えるビルドツールです。

bundleとminifyをまとめて行いたい場合にも適しています。

esbuildをインストールする

次のコマンドを実行します。

npm install --save-dev esbuild

JavaScriptをminifyする

単純にJavaScriptをminifyする場合は、次のように実行できます。

npx esbuild src/app.js --minify --outfile=dist/app.min.js

--minifyを指定すると、空白の削減や構文の短縮、識別子の短縮などが行われます。

ただし、トップレベルの識別子は、状況によってはそのまま残ることがあります。

外部コードとの互換性を保つためです。

bundleとminifyを同時に行う

複数のJavaScriptモジュールを利用している場合は、次のように--bundleを付けると便利です。

npx esbuild src/app.js --bundle --minify --outfile=dist/app.min.js

--bundleを指定すると、importなどで読み込まれている依存モジュールをまとめて出力できます。

イメージとしては次の流れです。

複数のJavaScriptファイル
↓
bundle
↓
minify
↓
dist/app.min.js

WebサイトやWebアプリの本番用JavaScriptを生成する場合には、よく利用される構成です。

esbuildでCSSをminifyする方法

esbuildはCSSのminifyにも対応しています。

たとえば、次のCSSを圧縮するとします。

src/style.css

次のコマンドを実行します。

npx esbuild src/style.css --minify --outfile=dist/style.min.css

これによって、不要な空白や改行などが削減されたCSSが生成されます。

JavaScriptとCSSの両方に同じツールを利用したい場合には、esbuildは扱いやすい選択肢です。

esbuildでtargetを指定する方法

JavaScriptをminifyするときは、どのブラウザやJavaScript環境を対象にするかも重要です。

esbuildでは、--targetを指定できます。

たとえば、ES2020相当をターゲットとする場合は次のようにします。

npx esbuild src/app.js --bundle --minify --target=es2020 --outfile=dist/app.min.js

targetを指定しない場合、コードサイズを小さくするために比較的新しいJavaScript構文が利用されることがあります。

古いブラウザまで対応する必要がある場合は、対象環境に応じてtargetを検討します。

targetとpolyfillは別物

ここは特に注意したいポイントです。

esbuildのtargetは、主にJavaScriptの構文を対象環境に合わせて変換するための機能です。

一方、次のようなJavaScript APIそのものを自動的に追加する機能ではありません。

Promise
fetch
Array.prototype.flat

古いブラウザでも新しいAPIを利用したい場合は、必要に応じてpolyfillを別途検討します。

つまり、次のように役割が異なります。

target
→ JavaScript構文の互換性

polyfill
→ JavaScript APIの互換性

HTMLをminifyする方法

HTMLをminifyしたい場合は、html-minifier-terserなどのツールを利用できます。

html-minifier-terserをインストールする

次のコマンドを実行します。

npm install --save-dev html-minifier-terser

HTMLをminifyする

たとえば、次のHTMLを圧縮するとします。

src/index.html

出力先を次のようにします。

dist/index.html

Windows環境でも扱いやすいように1行で書くと、次のようになります。

npx html-minifier-terser src/index.html --collapse-whitespace --remove-comments -o dist/index.html

--collapse-whitespaceは余分な空白を削減するオプションです。

--remove-commentsはHTMLコメントを削除します。

HTMLのminifyは表示崩れに注意する

HTMLはJavaScriptやCSS以上に、minifyの設定へ注意が必要です。

HTMLでは空白が画面表示に影響するケースがあるためです。

たとえば、次のHTMLがあります。

<span>Hello</span> <span>World</span>

2つのspanタグの間にある空白は、ブラウザ上の表示にも影響します。

そのため、collapseWhitespaceなどの設定によっては意図しない表示になる可能性があります。

最初は比較的安全な設定から始め、必ず実際のブラウザで動作確認することが重要です。

npm scriptsでminifyを自動化する方法

毎回長いコマンドを入力するのは効率的ではありません。

そこで、package.jsonのscriptsへminify処理を登録すると便利です。

JavaScript・CSS・HTMLを登録する

たとえば、次のように設定できます。

{
  "scripts": {
    "minify:js": "terser src/app.js -c -m -o dist/app.min.js",
    "minify:css": "esbuild src/style.css --minify --outfile=dist/style.min.css",
    "minify:html": "html-minifier-terser src/index.html --collapse-whitespace --remove-comments -o dist/index.html"
  }
}

JavaScriptだけminifyする場合は、次のコマンドです。

npm run minify:js

CSSの場合は次のようにします。

npm run minify:css

HTMLの場合は次のとおりです。

npm run minify:html

すべてまとめてminifyする

複数の処理をまとめたい場合は、さらにminifyスクリプトを追加します。

{
  "scripts": {
    "minify:js": "terser src/app.js -c -m -o dist/app.min.js",
    "minify:css": "esbuild src/style.css --minify --outfile=dist/style.min.css",
    "minify:html": "html-minifier-terser src/index.html --collapse-whitespace --remove-comments -o dist/index.html",
    "minify": "npm run minify:js && npm run minify:css && npm run minify:html"
  }
}

これで、次のコマンドだけでまとめて実行できます。

npm run minify

処理のイメージは次のとおりです。

JavaScript
↓
CSS
↓
HTML
↓
minify完了

静的なWebサイトなどであれば、比較的シンプルで扱いやすい構成です。

VSCode Tasksからminifyする方法

npm scriptsへ登録したminify処理は、VSCodeのTasks機能から呼び出すこともできます。

tasks.jsonを作成する

プロジェクト内に次のファイルを作成します。

.vscode/tasks.json

たとえば、次のように設定します。

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Minify",
      "type": "npm",
      "script": "minify",
      "problemMatcher": []
    }
  ]
}

この設定では、package.jsonに登録した次のスクリプトが呼び出されます。

"minify": "npm run minify:js && npm run minify:css && npm run minify:html"

Tasks: Run Taskから実行する

WindowsやLinuxの場合は、次のショートカットでコマンドパレットを開きます。

Ctrl + Shift + P

次に、次のコマンドを選択します。

Tasks: Run Task

その後、登録したMinifyを選択すると実行できます。

Ctrl + Shift + Bから実行できるようにする

WindowsやLinuxでは、Ctrl + Shift + Bが「Run Build Task」に割り当てられています。

minify処理をBuild Taskとして扱う場合は、groupを設定しておくとわかりやすくなります。

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Minify",
      "type": "npm",
      "script": "minify",
      "problemMatcher": [],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}

このようにデフォルトのBuild Taskとして登録しておけば、Ctrl + Shift + Bから実行しやすくなります。

VSCode拡張機能でminifyする方法

VSCode Marketplaceには、minifyを行うための拡張機能もあります。

拡張機能画面で「minify」などのキーワードを検索すれば、JavaScript・CSS・HTMLに対応した拡張機能を見つけられます。

拡張機能が向いているケース

次のような用途であれば、拡張機能は手軽です。

単発でファイルをminifyしたい

簡単なHTMLやCSSだけ圧縮したい

コマンドを入力せずに処理したい

本番ビルドではnpm scriptsのほうが管理しやすい

Webサイトを継続的に運用する場合は、VSCode拡張機能だけに依存するよりも、npm scriptsやビルドツールへ設定を残す方法が適しています。

たとえば、次のファイルをGitで管理できます。

package.json
package-lock.json
.vscode/tasks.json

これにより、ほかの開発者やCI環境でも同じminify処理を実行しやすくなります。

Viteやwebpackを使用している場合

ReactやVueなどのWebアプリでは、Viteやwebpackなどのビルドツールを利用しているケースも多いでしょう。

その場合、手作業でJavaScriptやCSSを個別にminifyする必要がないことがあります。

ビルド時にminifyされる場合がある

一般的な本番ビルドでは、次のような処理が行われます。

src
↓
bundle
↓
最適化
↓
minify
↓
dist

そのため、プロジェクトによっては次のコマンドだけで本番用ファイルを生成できます。

npm run build

Viteやwebpackなどを利用しているプロジェクトでは、まず既存のビルド設定を確認したほうがよいでしょう。

すでにminifyされているにもかかわらず、さらに別のminifierを実行すると、管理が複雑になる可能性があります。

元ファイルを直接minifyしないほうがよい

minify後のコードは、人間にとって非常に読みにくくなります。

そのため、開発中の元ファイルへ直接上書きする運用は避けたほうがよいでしょう。

srcとdistを分ける

たとえば、次のような構成にします。

project/
├─ src/
│ ├─ app.js
│ └─ style.css
│
└─ dist/
   ├─ app.min.js
   └─ style.min.css

srcには編集する元コードを保存します。

distには、本番公開用として生成されたファイルを保存します。

イメージとしては次のとおりです。

src
→ 開発用

dist
→ 配布・公開用

ただし、srcやdistというフォルダ名は必須ではありません。

プロジェクトによってbuildやpublicなど異なる名前が使われることもあります。

minifyとフォーマットの違い

VSCodeでは、minifyとコードフォーマットを混同しないようにすることも重要です。

フォーマットとは

たとえば、次のコードがあるとします。

function hello(){console.log("Hello");}

フォーマッターを利用すると、次のように読みやすくできます。

function hello() {
  console.log("Hello");
}

Prettierなどは、こうしたコードの整形を目的としたツールです。

minifyとは

一方、minifyは逆方向の処理です。

function hello() {
  console.log("Hello");
}

を、次のように小さくします。

function hello(){console.log("Hello")}

そのため、役割は次のように整理できます。

Format
→ 人間が読みやすいコードにする

Minify
→ 配信するコードを小さくする

PrettierとTerserは競合するツールではなく、目的が異なります。

開発中はPrettierなどで読みやすく整形し、本番ビルド時にTerserやesbuildでminifyするという使い方ができます。

minifyするならSource Mapも検討する

JavaScriptをminifyすると、元コードとの対応関係がわかりにくくなります。

そのため、本番環境でエラーが発生したときに原因を特定するのが難しくなることがあります。

そこで利用されるのがSource Mapです。

esbuildでSource Mapを生成する

たとえば、次のように指定できます。

npx esbuild src/app.js --bundle --minify --sourcemap --outfile=dist/app.min.js

このようにすると、一般的にはJavaScript本体とSource Mapファイルが生成されます。

app.min.js
app.min.js.map

ブラウザの開発者ツールなどでは、Source Mapを利用して元ソースとの対応関係を確認できます。

Source Mapの公開範囲にも注意する

Source Mapには元コードに関する情報が含まれます。

そのため、公開サイトでSource Mapをそのまま配信するかどうかは、プロジェクトのセキュリティ方針や運用方針に合わせて判断する必要があります。

Terserとesbuildの違い

JavaScriptをminifyする場合、Terserとesbuildのどちらを選べばよいか迷うことがあります。

両者は似ていますが、得意分野が少し異なります。

Terserが向いているケース

TerserはJavaScriptのminify専用ツールとして細かな設定を行いたい場合に向いています。

次のような用途で利用しやすいでしょう。

JavaScriptを細かく圧縮したい

compress設定を調整したい

mangle設定を細かく制御したい

esbuildが向いているケース

esbuildはビルド全体を高速に処理したい場合に便利です。

次のような用途があります。

JavaScriptを高速にminifyしたい

複数モジュールをbundleしたい

TypeScriptも扱いたい

CSSも同じツールで処理したい

単純化すると、次のように考えられます。

細かなJavaScript圧縮設定
→ Terser

高速なビルド・bundle・minify
→ esbuild

ただし、どちらを使えば必ずファイルサイズが小さくなるというものではありません。

コードの内容や設定によって結果は変わります。

minify後は必ず動作確認する

minifyツールは安全性を考慮して設計されていますが、コードの書き方によってはminify後に問題が発生する可能性があります。

たとえば、変数名そのものを文字列として利用しているコードや、特殊なevalの利用、関数を文字列化した結果に依存する処理などでは注意が必要です。

そのため、次の流れで運用することが重要です。

開発
↓
minify
↓
テスト
↓
本番公開

minifyできたことだけを確認するのではなく、実際にWebサイトやWebアプリが正常に動作するか確認しましょう。

初心者ならesbuildから試すとわかりやすい

VSCodeで一般的なHTML・CSS・JavaScriptのWebサイトを作っている場合は、まずesbuildを使ってみる方法が比較的わかりやすいでしょう。

esbuildをインストールする

npm install --save-dev esbuild

JavaScriptをminifyする

npx esbuild src/app.js --minify --outfile=dist/app.min.js

CSSをminifyする

npx esbuild src/style.css --minify --outfile=dist/style.min.css

JavaScriptをbundleしてminifyする

npx esbuild src/app.js --bundle --minify --outfile=dist/app.min.js

npm scriptsへ登録する

package.jsonへ次のように登録できます。

{
  "scripts": {
    "build:js": "esbuild src/app.js --bundle --minify --outfile=dist/app.min.js",
    "build:css": "esbuild src/style.css --minify --outfile=dist/style.min.css",
    "build": "npm run build:js && npm run build:css"
  }
}

あとは次のコマンドを実行するだけです。

npm run build

毎回長いコマンドを入力する必要がなくなり、minify処理を簡単に再実行できます。

VSCodeでminifyするなら自動化しておくと便利

VSCodeでコードをminifyする方法はいくつかありますが、継続的にWeb制作やWeb開発を行うのであれば、外部ツールとnpm scriptsを組み合わせる方法が扱いやすいでしょう。

JavaScriptを細かくminifyしたい場合はTerserが候補になります。

JavaScriptのbundleやCSSのminifyまでまとめて高速に処理したい場合は、esbuildが便利です。

HTMLについては、html-minifier-terserなどを利用できます。

また、Viteやwebpackなどをすでに利用しているプロジェクトでは、本番ビルドにminify処理が組み込まれている可能性があるため、既存の設定を確認することも重要です。

基本的には、元コードを直接minifyして上書きするのではなく、開発用のsrcと公開用のdistなどを分けて管理します。

さらに、npm scriptsやVSCode Tasksへ処理を登録しておけば、毎回同じ手順でminifyできるため、個人開発だけでなくチーム開発やCI/CDでも再現性を高めやすくなります。

以上、VSCodeでコードをminifyする方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次