uglifyjs3.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /**
  2. * Uglifyjs3 Js压缩
  3. * @type {{compress}}
  4. */
  5. module.exports = (() => {
  6. "use strict";
  7. function get_options() {
  8. return {
  9. parse: {
  10. bare_returns: false,
  11. ecma: 8,
  12. expression: false,
  13. filename: null,
  14. html5_comments: true,
  15. shebang: true,
  16. strict: false,
  17. toplevel: null
  18. },
  19. compress: {
  20. arrows: true,
  21. booleans: true,
  22. collapse_lets: true,
  23. comparisons: true,
  24. computed_props: true,
  25. conditionals: true,
  26. dead_code: true,
  27. drop_console: false,
  28. drop_debugger: true,
  29. ecma: 5,
  30. evaluate: true,
  31. expression: false,
  32. global_defs: {},
  33. hoist_funs: false,
  34. hoist_props: true,
  35. hoist_lets: false,
  36. ie8: false,
  37. if_return: true,
  38. inline: true,
  39. join_lets: true,
  40. keep_classnames: false,
  41. keep_fargs: true,
  42. keep_fnames: false,
  43. keep_infinity: false,
  44. loops: true,
  45. negate_iife: true,
  46. passes: 1,
  47. properties: true,
  48. pure_getters: "strict",
  49. pure_funcs: null,
  50. reduce_funcs: true,
  51. reduce_lets: true,
  52. sequences: true,
  53. side_effects: true,
  54. switches: true,
  55. top_retain: null,
  56. toplevel: false,
  57. typeofs: true,
  58. unsafe: false,
  59. unsafe_arrows: false,
  60. unsafe_comps: false,
  61. unsafe_Function: false,
  62. unsafe_math: false,
  63. unsafe_methods: false,
  64. unsafe_proto: false,
  65. unsafe_regexp: false,
  66. unsafe_undefined: false,
  67. unused: true,
  68. warnings: false
  69. },
  70. mangle: {
  71. eval: false,
  72. ie8: false,
  73. keep_classnames: false,
  74. keep_fnames: false,
  75. properties: false,
  76. reserved: [],
  77. safari10: false,
  78. toplevel: false
  79. },
  80. output: {
  81. ascii_only: false,
  82. beautify: false,
  83. bracketize: false,
  84. comments: /@license|@preserve|^!/,
  85. ecma: 5,
  86. ie8: false,
  87. indent_level: 4,
  88. indent_start: 0,
  89. inline_script: true,
  90. keep_quoted_props: false,
  91. max_line_len: false,
  92. preamble: null,
  93. preserve_line: false,
  94. quote_keys: false,
  95. quote_style: 0,
  96. safari10: false,
  97. semicolons: true,
  98. shebang: true,
  99. source_map: null,
  100. webkit: false,
  101. width: 80,
  102. wrap_iife: false
  103. },
  104. wrap: false
  105. };
  106. }
  107. function encodeHTML(str) {
  108. return (str + '')
  109. .replace(/&/g, '&')
  110. .replace(/</g, '&lt;')
  111. .replace(/"/g, '&quot;');
  112. }
  113. function show_error(e, param) {
  114. let row = 0, column = 0;
  115. if (e instanceof JS_Parse_Error) {
  116. let lines = param.split('\n');
  117. let line = lines[e.line - 1];
  118. row = e.line;
  119. column = e.col + 1;
  120. e = '压缩出错了:\n\n' + e.message + '\n' +
  121. 'Line ' + e.line + ', column ' + (e.col + 1) + '\n\n' +
  122. (lines[e.line - 2] ? (e.line - 1) + ': ' + lines[e.line - 2] + '\n' : '') + e.line + ': ' +
  123. line.substr(0, e.col) + (line.substr(e.col, 1) || ' ') +
  124. line.substr(e.col + 1) + '\n' +
  125. (lines[e.line] ? (e.line + 1) + ': ' + lines[e.line] : '');
  126. } else if (e instanceof Error) {
  127. e = e.name + ': ' + e.message;
  128. }
  129. return {
  130. error: e,
  131. errPos: {
  132. row: row,
  133. col: column
  134. }
  135. };
  136. }
  137. function compress(input) {
  138. try {
  139. return main();
  140. } catch (e) {
  141. return show_error(e, input);
  142. }
  143. function main() {
  144. if (!input) {
  145. return;
  146. }
  147. let res = minify(input, get_options());
  148. if (res.error) {
  149. throw res.error;
  150. }
  151. return {
  152. out: res.code || '/* 无内容输出! */'
  153. };
  154. }
  155. }
  156. return {
  157. compress: compress
  158. }
  159. })();