API 參考
假設透過 NPM 安裝,您可以像這樣在您的應用程式中載入 Terser
const { minify } = require("terser");
或者,
import { minify } from "terser";
瀏覽器載入也受支援。它公開一個包含 .minify
屬性的全域變數 Terser
<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()
替代版本,它會立即傳回。
您可以一次 minify
多個 JavaScript 檔案,方法是將第一個引數用於物件,其中金鑰是檔案名稱,而值是原始碼
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
}
壓縮選項
-
ecma
(預設undefined
) - 傳入5
、2015
、2016
等,以覆寫compress
和format
的ecma
選項。 -
enclose
(預設false
) - 傳入true
,或"args[:values]"
格式的字串,其中args
和values
分別為以逗號分隔的引數名稱和值,以將輸出嵌入一個具有可設定引數和值的大函式中。 -
parse
(預設{}
) — 如果您想指定一些額外的 解析選項,請傳入一個物件。 -
compress
(預設{}
) — 傳入false
以完全略過壓縮。傳入一個物件以指定自訂 壓縮選項。 -
mangle
(預設true
) — 傳入false
以略過變數名稱混淆,或傳入一個物件以指定 混淆選項 (見下文)。mangle.properties
(預設false
) — 混淆選項的子類別。傳入一個物件以指定自訂 混淆屬性選項。
-
module
(預設false
) — 在壓縮 ES6 模組時使用。暗示「使用嚴格模式」,而且可以在頂層範圍混淆名稱。如果啟用compress
或mangle
,則會啟用toplevel
選項。 -
format
或output
(預設null
) — 如果您想指定額外的 格式選項,請傳入一個物件。預設值經過最佳化,以獲得最佳壓縮效果。 -
sourceMap
(預設false
) - 如果您想指定 原始碼對應選項,請傳入一個物件。 -
toplevel
(預設false
) - 如果您想啟用頂層變數和函式名稱混淆,以及捨棄未使用的變數和函式,請設定為true
。 -
nameCache
(預設null
) - 如果您想在多次呼叫minify()
時快取混淆的變數和屬性名稱,請傳入一個空的物件{}
或先前使用的nameCache
物件。注意:這是一個讀寫屬性。minify()
會讀取此物件的名稱快取狀態,並在壓縮期間更新它,以便使用者可以重複使用或外部持續保存它。 -
ie8
(預設為false
) - 設為true
以支援 IE8。 -
keep_classnames
(預設:undefined
) - 傳遞true
以防止捨棄或混淆類別名稱。傳遞正規表示法以僅保留與該正規表示法相符的類別名稱。 -
keep_fnames
(預設:false
) - 傳遞true
以防止捨棄或混淆函式名稱。傳遞正規表示法以僅保留與該正規表示法相符的函式名稱。對於依賴Function.prototype.name
的程式碼很有用。如果頂層壓縮選項keep_classnames
為undefined
,它將被頂層壓縮選項keep_fnames
的值覆寫。 -
safari10
(預設:false
) - 傳遞true
以解決 Safari 10/11 在迴圈範圍和await
中的錯誤。請參閱mangle
和format
中的safari10
選項,以取得詳細資訊。
壓縮選項結構
{
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
。