aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2017-07-05 19:20:33 +0800
committerGitHub <noreply@github.com>2017-07-05 19:20:33 +0800
commit1ac25fc032096459f2966236c99c0f21da2787f3 (patch)
treeb6c9df9427997761a7b7bc148c552ddba3ee5059
parent5f046c724bf0910e6ee7c1c3feabaf62625fa1c6 (diff)
downloadtracifyjs-1ac25fc032096459f2966236c99c0f21da2787f3.tar.gz
tracifyjs-1ac25fc032096459f2966236c99c0f21da2787f3.zip
improve `compress` granularity through `typeofs` (#2201)
fixes #2198
-rw-r--r--README.md7
-rw-r--r--lib/compress.js4
-rw-r--r--test/compress/issue-1446.js10
-rw-r--r--test/compress/reduce_vars.js2
4 files changed, 17 insertions, 6 deletions
diff --git a/README.md b/README.md
index 671d7136..fd142f4b 100644
--- a/README.md
+++ b/README.md
@@ -644,6 +644,10 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
- `booleans` -- various optimizations for boolean context, for example `!!a
? b : c → a ? b : c`
+- `typeofs` -- default `true`. Transforms `typeof foo == "undefined"` into
+ `foo === void 0`. Note: recommend to set this value to `false` for IE10 and
+ earlier versions due to known issues.
+
- `loops` -- optimizations for `do`, `while` and `for` loops when we can
statically determine the condition
@@ -873,7 +877,6 @@ when this flag is on:
- `new Object()` → `{}`
- `String(exp)` or `exp.toString()` → `"" + exp`
- `new Object/RegExp/Function/Error/Array (...)` → we discard the `new`
-- `typeof foo == "undefined"` → `foo === void 0`
- `void 0` → `undefined` (if there is a variable named "undefined" in
scope; we do it because the variable name will be mangled, typically
reduced to a single character)
@@ -1050,5 +1053,5 @@ uglifyjs file.js -m
```
To enable fast minify mode with the API use:
```js
-UglifyJS.minify(code, { compress: false, mangle: true });
+UglifyJS.minify(code, { compress: false, mangle: true });
```
diff --git a/lib/compress.js b/lib/compress.js
index 733abf45..d9936d2c 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -80,6 +80,7 @@ function Compressor(options, false_by_default) {
switches : !false_by_default,
top_retain : null,
toplevel : !!(options && options["top_retain"]),
+ typeofs : !false_by_default,
unsafe : false,
unsafe_comps : false,
unsafe_Func : false,
@@ -3591,7 +3592,8 @@ merge(Compressor.prototype, {
case "==":
case "!=":
// "undefined" == typeof x => undefined === x
- if (self.left instanceof AST_String
+ if (compressor.option("typeofs")
+ && self.left instanceof AST_String
&& self.left.value == "undefined"
&& self.right instanceof AST_UnaryPrefix
&& self.right.operator == "typeof") {
diff --git a/test/compress/issue-1446.js b/test/compress/issue-1446.js
index cad1ae57..30062c7d 100644
--- a/test/compress/issue-1446.js
+++ b/test/compress/issue-1446.js
@@ -1,6 +1,7 @@
typeof_eq_undefined: {
options = {
- comparisons: true
+ comparisons: true,
+ typeofs: true,
}
input: {
var a = typeof b != "undefined";
@@ -24,6 +25,7 @@ typeof_eq_undefined_ie8: {
options = {
comparisons: true,
ie8: true,
+ typeofs: true,
}
input: {
var a = typeof b != "undefined";
@@ -45,7 +47,8 @@ typeof_eq_undefined_ie8: {
undefined_redefined: {
options = {
- comparisons: true
+ comparisons: true,
+ typeofs: true,
}
input: {
function f(undefined) {
@@ -58,7 +61,8 @@ undefined_redefined: {
undefined_redefined_mangle: {
options = {
- comparisons: true
+ comparisons: true,
+ typeofs: true,
}
mangle = {}
input: {
diff --git a/test/compress/reduce_vars.js b/test/compress/reduce_vars.js
index 5906a971..556bcad2 100644
--- a/test/compress/reduce_vars.js
+++ b/test/compress/reduce_vars.js
@@ -1469,6 +1469,7 @@ issue_1670_1: {
reduce_vars: true,
side_effects: true,
switches: true,
+ typeofs: true,
unused: true,
}
input: {
@@ -1532,6 +1533,7 @@ issue_1670_3: {
reduce_vars: true,
side_effects: true,
switches: true,
+ typeofs: true,
unused: true,
}
input: {