压缩JS的类

简介:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
using  System;
using  System.IO;
 
/// <summary>
/// Represents a filter which removes comments and unnecessary whitespace from JavaScript files.
/// </summary>
public  class  JSMin
{
     const  int  EOF = -1;
 
     StringReader sr;
     StringWriter sw;
     int  theA;
     int  theB;
     int  theLookahead = EOF;
 
     /// <summary>
     /// Compresses the specified script source.
     /// </summary>
     /// <param name="source">The script source.</param>
     /// <returns>The compressed script content.</returns>
     public  string  Minify( string  source)
     {
         using  (sr = new  StringReader(source))
         {
             using  (sw = new  StringWriter())
             {
                 jsmin();
                 return  sw.ToString();
             }
         }
     }
 
     /* jsmin -- Copy the input to the output, deleting the characters which are
             insignificant to JavaScript. Comments will be removed. Tabs will be
             replaced with spaces. Carriage returns will be replaced with linefeeds.
             Most spaces and linefeeds will be removed.
     */
     void  jsmin()
     {
         theA = '\n' ;
         action( 3 );
         while ( theA != EOF )
         {
             switch ( theA )
             {
                 case  ' ' :
                 {
                     if ( isAlphanum( theB ) )
                     {
                         action( 1 );
                     }
                     else
                     {
                         action( 2 );
                     }
                     break ;
                 }
                 case  '\n' :
                 {
                     switch ( theB )
                     {
                         case  '{' :
                         case  '[' :
                         case  '(' :
                         case  '+' :
                         case  '-' :
                         {
                             action( 1 );
                             break ;
                         }
                         case  ' ' :
                         {
                             action( 3 );
                             break ;
                         }
                         default :
                         {
                             if ( isAlphanum( theB ) )
                             {
                                 action( 1 );
                             }
                             else
                             {
                                 action( 2 );
                             }
                             break ;
                         }
                     }
                     break ;
                 }
                 default :
                 {
                     switch ( theB )
                     {
                         case  ' ' :
                         {
                             if ( isAlphanum( theA ) )
                             {
                                 action( 1 );
                                 break ;
                             }
                             action( 3 );
                             break ;
                         }
                         case  '\n' :
                         {
                             switch ( theA )
                             {
                                 case  '}' :
                                 case  ']' :
                                 case  ')' :
                                 case  '+' :
                                 case  '-' :
                                 case  '"' :
                                 case  '\'' :
                                 {
                                     action( 1 );
                                     break ;
                                 }
                                 default :
                                 {
                                     if ( isAlphanum( theA ) )
                                     {
                                         action( 1 );
                                     }
                                     else
                                     {
                                         action( 3 );
                                     }
                                     break ;
                                 }
                             }
                             break ;
                         }
                         default :
                         {
                             action( 1 );
                             break ;
                         }
                     }
                     break ;
                 }
             }
         }
     }
     /* action -- do something! What you do is determined by the argument:
             1   Output A. Copy B to A. Get the next B.
             2   Copy B to A. Get the next B. (Delete A).
             3   Get the next B. (Delete B).
        action treats a string as a single character. Wow!
        action recognizes a regular expression if it is preceded by ( or , or =.
     */
     void  action( int  d )
     {
         if ( d <= 1 )
         {
             put( theA );
         }
         if ( d <= 2 )
         {
             theA = theB;
             if ( theA == '\''  || theA == '"'  )
             {
                 for ( ; ; )
                 {
                     put( theA );
                     theA = get ();
                     if ( theA == theB )
                     {
                         break ;
                     }
                     if ( theA <= '\n'  )
                     {
                         throw  new  Exception( string .Format( "Error: JSMIN unterminated string literal: {0}\n" , theA ) );
                     }
                     if ( theA == '\\'  )
                     {
                         put( theA );
                         theA = get ();
                     }
                 }
             }
         }
         if ( d <= 3 )
         {
             theB = next();
             if ( theB == '/'  && (theA == '('  || theA == ','  || theA == '='  ||
                                 theA == '['  || theA == '!'  || theA == ':'  ||
                                 theA == '&'  || theA == '|'  || theA == '?'  ||
                                 theA == '{'  || theA == '}'  || theA == ';'  ||
                                 theA == '\n' ) )
             {
                 put( theA );
                 put( theB );
                 for ( ; ; )
                 {
                     theA = get ();
                     if ( theA == '/'  )
                     {
                         break ;
                     }
                     else  if ( theA == '\\'  )
                     {
                         put( theA );
                         theA = get ();
                     }
                     else  if ( theA <= '\n'  )
                     {
                         throw  new  Exception( string .Format( "Error: JSMIN unterminated Regular Expression literal : {0}.\n" , theA ) );
                     }
                     put( theA );
                 }
                 theB = next();
             }
         }
     }
     /* next -- get the next character, excluding comments. peek() is used to see
             if a '/' is followed by a '/' or '*'.
     */
     int  next()
     {
         int  c = get ();
         if ( c == '/'  )
         {
             switch ( peek() )
             {
                 case  '/' :
                 {
                     for ( ; ; )
                     {
                         c = get ();
                         if ( c <= '\n'  )
                         {
                             return  c;
                         }
                     }
                 }
                 case  '*' :
                 {
                     get ();
                     for ( ; ; )
                     {
                         switch ( get () )
                         {
                             case  '*' :
                             {
                                 if ( peek() == '/'  )
                                 {
                                     get ();
                                     return  ' ' ;
                                 }
                                 break ;
                             }
                             case  EOF:
                             {
                                 throw  new  Exception( "Error: JSMIN Unterminated comment.\n"  );
                             }
                         }
                     }
                 }
                 default :
                 {
                     return  c;
                 }
             }
         }
         return  c;
     }
     /* peek -- get the next character without getting it.
     */
     int  peek()
     {
         theLookahead = get ();
         return  theLookahead;
     }
     /* get -- return the next character from stdin. Watch out for lookahead. If
             the character is a control character, translate it to a space or
             linefeed.
     */
     int  get ()
     {
         int  c = theLookahead;
         theLookahead = EOF;
         if ( c == EOF )
         {
             c = sr.Read();
         }
         if ( c >= ' '  || c == '\n'  || c == EOF )
         {
             return  c;
         }
         if ( c == '\r'  )
         {
             return  '\n' ;
         }
         return  ' ' ;
     }
     void  put( int  c )
     {
         sw.Write( ( char )c );
     }
     /* isAlphanum -- return true if the character is a letter, digit, underscore,
             dollar sign, or non-ASCII character.
     */
     bool  isAlphanum( int  c )
     {
         return  ((c >= 'a'  && c <= 'z' ) || (c >= '0'  && c <= '9' ) ||
             (c >= 'A'  && c <= 'Z' ) || c == '_'  || c == '$'  || c == '\\'  ||
             c > 126);
     }
}
本文转自敏捷的水博客园博客,原文链接http://www.cnblogs.com/cnblogsfans/archive/2009/09/27/1574880.html如需转载请自行联系原作者


王德水

相关文章
|
1月前
|
JavaScript
js开发:请解释什么是ES6的类(class),并说明它与传统构造函数的区别。
ES6的类提供了一种更简洁的面向对象编程方式,对比传统的构造函数,具有更好的可读性和可维护性。类使用`class`定义,`constructor`定义构造方法,`extends`实现继承,并可直接定义静态方法。示例展示了如何创建`Person`类、`Student`子类以及它们的方法调用。
22 2
|
1月前
|
JavaScript 前端开发
js开发:请解释原型继承和类继承的区别。
JavaScript中的原型继承和类继承用于共享对象属性和方法。原型继承利用原型链查找属性,节省内存但不支持私有成员。类继承通过ES6的class和extends实现,支持私有成员但占用更多内存。两者各有优势,适用于不同场景。
19 0
|
1月前
uni-app 65egg.js聊天类chat.js封装(二)
uni-app 65egg.js聊天类chat.js封装(二)
25 1
|
2月前
|
前端开发 JavaScript 安全
从前端性能优化角度谈JavaScript代码压缩与混淆
本文从前端性能优化的角度出发,探讨了JavaScript代码压缩与混淆的重要性及实现方式,通过分析不同压缩混淆工具的特点和效果,为开发者提供了实用的指导和建议。
|
5月前
|
JavaScript 前端开发 Java
javascript实现像java、c#之类的sleep暂停的函数功能
javascript实现像java、c#之类的sleep暂停的函数功能
41 0
|
4月前
|
JSON JavaScript 数据格式
NPM 发包 js 文件并支持 ts 使用(包含 gulp 打包压缩)
NPM 发包 js 文件并支持 ts 使用(包含 gulp 打包压缩)
58 0
|
7月前
|
JSON JavaScript 数据格式
NPM 发包 js 文件并支持 ts 使用(包含 gulp 打包压缩)
NPM 发包 js 文件并支持 ts 使用(包含 gulp 打包压缩)
82 0
|
1月前
uni-app 66聊天类chat.js封装(三)
uni-app 66聊天类chat.js封装(三)
27 6
|
1月前
uni-app 64聊天类chat.js封装(一)
uni-app 64聊天类chat.js封装(一)
22 2
|
2月前
|
JavaScript 索引
js之数组,对象,类数组对象
js之数组,对象,类数组对象