codecompress.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. /**
  2. * 代码压缩
  3. * @author 赵先烈
  4. */
  5. /**
  6. * Uglifyjs3压缩
  7. */
  8. var UglifyJs3 = (function () {
  9. "use strict";
  10. function get_options() {
  11. return {
  12. parse: {
  13. bare_returns: false,
  14. ecma: 8,
  15. expression: false,
  16. filename: null,
  17. html5_comments: true,
  18. shebang: true,
  19. strict: false,
  20. toplevel: null
  21. },
  22. compress: {
  23. arrows: true,
  24. booleans: true,
  25. collapse_vars: true,
  26. comparisons: true,
  27. computed_props: true,
  28. conditionals: true,
  29. dead_code: true,
  30. drop_console: false,
  31. drop_debugger: true,
  32. ecma: 5,
  33. evaluate: true,
  34. expression: false,
  35. global_defs: {},
  36. hoist_funs: false,
  37. hoist_props: true,
  38. hoist_vars: false,
  39. ie8: false,
  40. if_return: true,
  41. inline: true,
  42. join_vars: true,
  43. keep_classnames: false,
  44. keep_fargs: true,
  45. keep_fnames: false,
  46. keep_infinity: false,
  47. loops: true,
  48. negate_iife: true,
  49. passes: 1,
  50. properties: true,
  51. pure_getters: "strict",
  52. pure_funcs: null,
  53. reduce_funcs: true,
  54. reduce_vars: true,
  55. sequences: true,
  56. side_effects: true,
  57. switches: true,
  58. top_retain: null,
  59. toplevel: false,
  60. typeofs: true,
  61. unsafe: false,
  62. unsafe_arrows: false,
  63. unsafe_comps: false,
  64. unsafe_Function: false,
  65. unsafe_math: false,
  66. unsafe_methods: false,
  67. unsafe_proto: false,
  68. unsafe_regexp: false,
  69. unsafe_undefined: false,
  70. unused: true,
  71. warnings: false
  72. },
  73. mangle: {
  74. eval: false,
  75. ie8: false,
  76. keep_classnames: false,
  77. keep_fnames: false,
  78. properties: false,
  79. reserved: [],
  80. safari10: false,
  81. toplevel: false
  82. },
  83. output: {
  84. ascii_only: false,
  85. beautify: false,
  86. bracketize: false,
  87. comments: /@license|@preserve|^!/,
  88. ecma: 5,
  89. ie8: false,
  90. indent_level: 4,
  91. indent_start: 0,
  92. inline_script: true,
  93. keep_quoted_props: false,
  94. max_line_len: false,
  95. preamble: null,
  96. preserve_line: false,
  97. quote_keys: false,
  98. quote_style: 0,
  99. safari10: false,
  100. semicolons: true,
  101. shebang: true,
  102. source_map: null,
  103. webkit: false,
  104. width: 80,
  105. wrap_iife: false
  106. },
  107. wrap: false
  108. };
  109. }
  110. function encodeHTML(str) {
  111. return (str + '')
  112. .replace(/&/g, '&')
  113. .replace(/</g, '&lt;')
  114. .replace(/"/g, '&quot;');
  115. }
  116. function show_error(e, param) {
  117. var row = 0, column = 0;
  118. if (e instanceof JS_Parse_Error) {
  119. var lines = param.split('\n');
  120. var line = lines[e.line - 1];
  121. row = e.line;
  122. column = e.col + 1;
  123. e = '压缩出错了:\n\n' + e.message + '\n' +
  124. 'Line ' + e.line + ', column ' + (e.col + 1) + '\n\n' +
  125. (lines[e.line - 2] ? (e.line - 1) + ': ' + lines[e.line - 2] + '\n' : '') + e.line + ': ' +
  126. line.substr(0, e.col) + (line.substr(e.col, 1) || ' ') +
  127. line.substr(e.col + 1) + '\n' +
  128. (lines[e.line] ? (e.line + 1) + ': ' + lines[e.line] : '');
  129. } else if (e instanceof Error) {
  130. e = e.name + ': ' + e.message;
  131. }
  132. return {
  133. error: e,
  134. errPos: {
  135. row: row,
  136. col: column
  137. }
  138. };
  139. }
  140. function compress(input) {
  141. try {
  142. return main();
  143. } catch (e) {
  144. return show_error(e, input);
  145. }
  146. function main() {
  147. if (!input) {
  148. return;
  149. }
  150. var res = minify(input, get_options());
  151. if (res.error) {
  152. throw res.error;
  153. }
  154. return {
  155. out: res.code || '/* 无内容输出! */'
  156. };
  157. }
  158. }
  159. return {
  160. compress: compress
  161. }
  162. })();
  163. /**
  164. * 代码压缩
  165. */
  166. var CodeCompress = (function () {
  167. var editor;
  168. var bindEvent = function () {
  169. $('#jfContent').click(function (e) {
  170. $(this).select();
  171. });
  172. $('#btnFormat').click(function (e) {
  173. var source = $.trim(editor.getValue());
  174. var jfContent = $('#jfContent');
  175. if (!source) {
  176. alert('请先粘贴您需要压缩的代码');
  177. } else {
  178. // 用uglifyjs3进行在线压缩
  179. var result = UglifyJs3.compress(source);
  180. jfContent.val(result.out || result.error);
  181. jfContent.css('color', result.error ? 'red' : 'black');
  182. }
  183. });
  184. };
  185. var init = function () {
  186. $(function () {
  187. editor = CodeMirror.fromTextArea($('#codeSource')[0], {
  188. mode: "text/javascript",
  189. lineNumbers: true,
  190. matchBrackets: true,
  191. styleActiveLine: true,
  192. lineWrapping: true
  193. });
  194. //输入框聚焦
  195. editor.focus();
  196. bindEvent();
  197. })
  198. };
  199. return {
  200. init: init
  201. };
  202. })();
  203. CodeCompress.init();