Open
Description
Describe the bug
If the constants
object contains exactly one property, it gets inlined. However, as soon as there are two or more properties, references are preserved as property accesses, and the property accesses are assumed to have side effects, such that code that only reads the values has the reads left in.
Input code
var constants = {
first: 1,
second: 2
}
export function isConstant(x) {
return x === constants.first || x === constants.second;
}
var y = constants.second;
Config
{
"jsc": {
"parser": {
"syntax": "ecmascript",
"jsx": false
},
"target": "es2020",
"loose": false,
"minify": {
"compress": {
"arguments": true,
"arrows": true,
"booleans": true,
"booleans_as_integers": false,
"collapse_vars": true,
"comparisons": true,
"computed_props": true,
"conditionals": true,
"dead_code": true,
"directives": true,
"drop_console": false,
"drop_debugger": true,
"evaluate": true,
"expression": true,
"hoist_funs": false,
"hoist_props": true,
"hoist_vars": false,
"if_return": true,
"join_vars": true,
"keep_classnames": false,
"keep_fargs": true,
"keep_fnames": false,
"keep_infinity": false,
"loops": true,
"negate_iife": true,
"properties": true,
"reduce_funcs": true,
"reduce_vars": true,
"side_effects": true,
"switches": true,
"typeofs": true,
"unsafe": true,
"unsafe_arrows": true,
"unsafe_comps": true,
"unsafe_Function": true,
"unsafe_math": true,
"unsafe_symbols": true,
"unsafe_methods": true,
"unsafe_proto": true,
"unsafe_regexp": true,
"unsafe_undefined": true,
"unused": true,
"const_to_let": true,
"pristine_globals": true,
"passes": 0
},
"mangle": {
"toplevel": false,
"keep_classnames": false,
"keep_fnames": false,
"keep_private_props": false,
"ie8": false,
"safari10": false
}
}
},
"module": {
"type": "es6"
},
"minify": false,
"isModule": true
}
Link to the code that reproduces this issue
SWC Info output
No response
Expected behavior
export function isConstant(n) {
return n === 1 || n === 2;
}
constant values should be inlined, and the last line should be discarded entirely has having no side effects.
Actual behavior
var constants = {
first: 1,
second: 2
};
export function isConstant(n) {
return n === constants.first || n === constants.second;
}
constants.second;
The constants
object remained, and the last line is assuming that reading constants.second
has side effects.
Version
1.12.1
Additional context
Happened upon this while examining the compressed output of react-device-detect to figure out why SWC produced significantly larger output than Terser.