APIリファレンス
NPMによるインストールを前提とすると、Terserはアプリケーション内で次のようにロードできます。
const { minify } = require("terser");
または、
import { minify } from "terser";
ブラウザでのロードもサポートされています。`Terser`というグローバル変数が公開され、その中に`.minify`プロパティが含まれています。
<script src="https://cdn.jsdelivr.net/npm/source-map@0.7.3/dist/source-map.js"></script>
<script src="https://cdn.jsdelivr.net/npm/terser/dist/bundle.min.js"></script>
非同期の高レベル関数**`async minify(code, options)`**があり、すべての縮小フェーズを構成可能な方法で実行します。デフォルトでは、`minify()`は`compress`と`mangle`を有効にします。例:
var code = "function add(first, second) { return first + second; }";
var result = await minify(code, { sourceMap: true });
console.log(result.code); // minified output: function add(n,d){return n+d}
console.log(result.map); // source map
すぐに結果を返す`minify_sync()`という代替バージョンもあります。
最初の引数にオブジェクトを使用することで、複数のJavaScriptファイルを一度にminifyできます。キーはファイル名、値はソースコードとなります。
var code = {
"file1.js": "function add(first, second) { return first + second; }",
"file2.js": "console.log(add(1 + 2, 3 + 4));"
};
var result = await minify(code);
console.log(result.code);
// function add(d,n){return d+n}console.log(add(3,7));
`toplevel`オプション
var code = {
"file1.js": "function add(first, second) { return first + second; }",
"file2.js": "console.log(add(1 + 2, 3 + 4));"
};
var options = { toplevel: true };
var result = await minify(code, options);
console.log(result.code);
// console.log(3+7);
`nameCache`オプション
var options = {
mangle: {
toplevel: true,
},
nameCache: {}
};
var result1 = await minify({
"file1.js": "function add(first, second) { return first + second; }"
}, options);
var result2 = await minify({
"file2.js": "console.log(add(1 + 2, 3 + 4));"
}, options);
console.log(result1.code);
// function n(n,r){return n+r}
console.log(result2.code);
// console.log(n(3,7));
名前キャッシュを次のようにファイルシステムに保存できます。
var cacheFileName = "/tmp/cache.json";
var options = {
mangle: {
properties: true,
},
nameCache: JSON.parse(fs.readFileSync(cacheFileName, "utf8"))
};
fs.writeFileSync("part1.js", await minify({
"file1.js": fs.readFileSync("file1.js", "utf8"),
"file2.js": fs.readFileSync("file2.js", "utf8")
}, options).code, "utf8");
fs.writeFileSync("part2.js", await minify({
"file3.js": fs.readFileSync("file3.js", "utf8"),
"file4.js": fs.readFileSync("file4.js", "utf8")
}, options).code, "utf8");
fs.writeFileSync(cacheFileName, JSON.stringify(options.nameCache), "utf8");
`minify()`オプションの組み合わせの例
var code = {
"file1.js": "function add(first, second) { return first + second; }",
"file2.js": "console.log(add(1 + 2, 3 + 4));"
};
var options = {
toplevel: true,
compress: {
global_defs: {
"@console.log": "alert"
},
passes: 2
},
format: {
preamble: "/* minified */"
}
};
var result = await minify(code, options);
console.log(result.code);
// /* minified */
// alert(10);"
エラーの例
try {
const result = await minify({"foo.js" : "if (0) else console.log(1);"});
// Do something with result
} catch (error) {
const { message, filename, line, col, pos } = error;
// Do something with error
}
Minifyオプション
-
ecma
(デフォルト `undefined`) - `compress`と`format`の`ecma`オプションを上書きするには、`5`、`2015`、`2016`などを渡します。 -
enclose
(デフォルト `false`) - `true`、または`"args[:values]"`形式の文字列(`args`と`values`はそれぞれコンマ区切りの引数名と値)を渡して、構成可能な引数と値を持つ大きな関数に結果を埋め込みます。 -
parse
(デフォルト `{}`) - 追加のparseオプションを指定する場合は、オブジェクトを渡します。 -
compress
(デフォルト `{}`) - 圧縮を完全にスキップするには`false`を渡します。カスタムcompressオプションを指定するには、オブジェクトを渡します。 -
mangle
(デフォルト `true`) - 名前の変更をスキップするには`false`を渡します。または、mangleオプションを指定するにはオブジェクトを渡します(下記参照)。mangle.properties
(デフォルト `false`) - mangleオプションのサブカテゴリです。カスタムmangleプロパティオプションを指定するには、オブジェクトを渡します。
-
module
(デフォルト `false`) - ES6モジュールを縮小する際に使用します。"use strict"が暗黙的に適用され、トップレベルスコープで名前の変更が行われます。`compress`または`mangle`が有効な場合、`toplevel`オプションも有効になります。 -
format
またはoutput
(デフォルト `null`) - 追加のformatオプションを指定する場合は、オブジェクトを渡します。デフォルトは最適な圧縮のために最適化されています。 -
sourceMap
(デフォルト `false`) - ソースマップオプションを指定する場合は、オブジェクトを渡します。 -
toplevel
(デフォルト `false`) - トップレベルの変数と関数の名前の変更を有効にし、使用されていない変数と関数を削除する場合は`true`に設定します。 -
nameCache
(デフォルト `null`) - 変更された変数とプロパティ名を`minify()`の複数回呼び出し間でキャッシュする場合は、空のオブジェクト`{}`または以前に使用した`nameCache`オブジェクトを渡します。注:これは読み書き可能なプロパティです。`minify()`はこのオブジェクトの名前キャッシュの状態を読み取り、縮小中に更新して、ユーザーが再利用または外部で永続化できるようにします。 -
ie8
(デフォルト `false`) - IE8をサポートするには`true`に設定します。 -
keep_classnames
(デフォルト: `undefined`) - クラス名の破棄または変更を防ぐには`true`を渡します。その正規表現に一致するクラス名のみを保持するには、正規表現を渡します。 -
keep_fnames
(デフォルト: `false`) - 関数名の破棄または変更を防ぐには`true`を渡します。その正規表現に一致する関数名のみを保持するには、正規表現を渡します。`Function.prototype.name`に依存するコードに役立ちます。トップレベルのminifyオプション`keep_classnames`が`undefined`の場合、トップレベルのminifyオプション`keep_fnames`の値で上書きされます。 -
safari10
(デフォルト: `false`) - ループスコープと`await`のSafari 10/11のバグに対処するには`true`を渡します。`mangle`と`format`の`safari10`オプションの詳細については、を参照してください。
Minifyオプションの構造
{
parse: {
// parse options
},
compress: {
// compress options
},
mangle: {
// mangle options
properties: {
// mangle property options
}
},
format: {
// format options (can also use `output` for backwards compatibility)
},
sourceMap: {
// source map options
},
ecma: 5, // specify one of: 5, 2015, 2016, etc.
enclose: false, // or specify true, or "args:values"
keep_classnames: false,
keep_fnames: false,
ie8: false,
module: false,
nameCache: null, // or specify a name cache object
safari10: false,
toplevel: false
}
ソースマップオプション
ソースマップを生成するには
var result = await minify({"file1.js": "var a = function() {};"}, {
sourceMap: {
filename: "out.js",
url: "out.js.map"
}
});
console.log(result.code); // minified output
console.log(result.map); // source map
ソースマップはファイルに保存されず、`result.map`で返されることに注意してください。`sourceMap.url`に渡された値は、`result.code`に`//# sourceMappingURL=out.js.map`を設定するためにのみ使用されます。`filename`の値は、ソースマップファイルの`file`属性([仕様][sm-spec]参照)を設定するためにのみ使用されます。
`sourceMap.url`オプションを`"inline"`に設定すると、ソースマップがコードに追加されます。
sourceRootプロパティをソースマップに含めることも指定できます。
var result = await minify({"file1.js": "var a = function() {};"}, {
sourceMap: {
root: "http://example.com/src",
url: "out.js.map"
}
});
コンパイル済みJavaScriptを圧縮していて、そのソースマップがある場合は、`sourceMap.content`を使用できます。
var result = await minify({"compiled.js": "compiled code"}, {
sourceMap: {
content: "content from compiled.js.map",
url: "minified.js.map"
}
});
// same as before, it returns `code` and `map`
`X-SourceMap`ヘッダーを使用している場合は、`sourceMap.url`を省略できます。
生のオブジェクトとしてソースマップが必要な場合は、`sourceMap.asObject`を`true`に設定します。