JavaScriptの空白除去 — 不要なスペースの削除

JavaScriptの空白除去が軽量な圧縮ステップとしてどのように機能するかを解説。安全に除去できるスペースと構文的に必要なスペースを理解します。

JavaScript

詳細な説明

JavaScriptの空白除去

空白除去はJavaScriptの圧縮の中で最もシンプルかつ一般的な形式です。言語構文で必要とされないスペース、タブ、改行を削除し、それだけでファイルサイズを**20-30%**削減できることがあります。

安全に除去できる空白

以下の空白は常に安全に削除できます:

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

// 空白除去後
function add(a,b){return a+b;}

具体的には以下を除去できます:

  • 各行の先頭と末尾の空白(インデント)
  • トークン間の連続する複数のスペース(1つまたは0に統合)
  • 空行(文の間の空白行)
  • 構文的に不要な場合の演算子周りのスペースa + ba+bに)
  • 行の最後のトークン後の末尾の空白

保持しなければならない空白

一部の空白は構文的に重要です:

  • キーワードと識別子の間return valuereturnvalueにできません。typeof xtypeofxにできません。
  • 文字列リテラル内"hello world"はスペースを保持する必要があります。
  • テンプレートリテラル内 — バッククォート文字列はすべての空白を保持します。
  • 正規表現内/ foo //foo/と同じではありません(まれですが)。
  • returnthrowyieldbreakcontinueの後 — 同一行に値が続く場合。

ASI(自動セミコロン挿入)の注意点

JavaScriptのASIルールにより、一部の改行は暗黙のセミコロンとして機能します。行を結合する単純な空白除去ツールは、2つの別々の文を誤って結合する可能性があります:

// 元のコード(ASIにより2つの文)
a = b
(function() {})()

// 不正な空白除去(1つの文になる)
a=b(function(){})()

これが、プロダクション圧縮ツールが単純な正規表現ではなくパーサーを使用して安全に空白を除去する理由です。

空白除去 vs. 完全な圧縮

空白除去だけでは変数のリネーム、デッドコードの排除、式の最適化は行われません。これは安全でリスクの低い最初のステップであり、Terserのような完全な圧縮ツールは多くのパスの1つとしてこれを適用します。

ユースケース

空白除去は、完全な圧縮を行えないスクリプトの簡易最適化として有用です。例えば、HTMLテンプレート内のインラインスクリプト、部分的に読みやすさを維持する必要がある設定ファイル、eval()を使用して変数名を保持しなければならないコードなどです。

試してみる — Code Minifier

フルツールを開く