上线前用 JSMin 压缩你的 JavaScript 档案

上线前用 JSMin 压缩你的 JavaScript 档案

 

< type="text/javascript">


在网页中动态载入的 JavaScript 对于页面显示的速度影响甚多,不得不注意!

尤其是很多人习惯把 JavaScript include 写在 <head> 区块中,这样一来最大的问题就是 Browser 必须要等到 JavaScript 全部读完后才会开始显示网页,如果你像信义房屋这样,读一个首页要下载 18 个 JavaScript 外部档且「没有大频宽」的话,首页就要等这 18 个 JavaScript 下载完才会开始显示网页,在这之前使用者就只会看到白白的一片画面!

所以我有两个建议:

1. 建议尽量将 JavaScript 摆在 </body> 之前

2. 建议将所有外部的 JavaScript 档案都先「瘦身」过!

    至于瘦身的话,我是习惯用 JSMin 这个工具,在上线前跑一个自己写的批次档将所有 *.js 档压缩过再传到网站上,这样至少可以减少一些档案下载的时间。

    你可到这个网站 ( http://www.crockford.com/javascript/jsmin.html ) 下载 jsmin.exe 档,使用方法是:

     C:/> jsmin.exe < fulljslint.js > jslint.js

    这样就可以将 fulljslint.js 压缩后储存到 jslint.js 档案了,但要切记不要输入与输出用相同的档名,这会把你的档案内容给清空!!

    而我自己是写了一组 Batch 档 (*.bat) 做批次压缩的动作。

    第一支:RunJSMin.bat  ( 下列的档案请换成你们自己的 js 档 )

        @echo off

        SET JSDir=Website/js

        CALL JsMinfy.bat %JSDir% common.js
        CALL JsMinfy.bat %JSDir% debug.js
        CALL JsMinfy.bat %JSDir% flashfix.js
        CALL JsMinfy.bat %JSDir% jquery.cookie.js
        CALL JsMinfy.bat %JSDir% png_transparent.js
        CALL JsMinfy.bat %JSDir% swfobject.js

    第二支: JsMinfy.bat

        @REM 此档是给 RunJSMin.bat 呼叫用的
        @REM 第一个参数是要压缩的 JavaScript 所在目录
        @REM 第二个参数是要压缩的 JavaScript 档名

        set DirName=%1
        set FileName=%2

        jsmin.exe < %DirName%/%FileName% > %DirName%/compressed.%FileName%
        del /F %DirName%/%FileName%
        ren %DirName%/compressed.%FileName% %FileName%

< type="text/javascript">


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ChaoYang0502/archive/2009/12/21/5048473.aspx

由Douglas Crockford创建的JSMin是一个筛选程序,用于JavaScript文件中删除注释和不必要的空格。这个程序通常能够使文件大小减半,从而节省下载时间。 压缩包里包含了用C写的源码,及可执行程序 由于看到三条评论说没有用,在里我必须说明一下,下面那三个白痴肯定没学过c语言,更没用过c编译好的.exe文件。 以下是c里的源码大家可以先看觉得可用再下 #include <stdlib.h> #include <stdio.h> static int theA; static int theB; static int theLookahead = EOF; /* isAlphanum -- return true if the character is a letter, digit, underscore, dollar sign, or non-ASCII character. */ static int isAlphanum(int c) { return ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || c == '_' || c == '$' || c == '\\' || c > 126); } /* 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. */ static int get() { int c = theLookahead; theLookahead = EOF; if (c == EOF) { c = getc(stdin); } if (c >= ' ' || c == '\n' || c == EOF) { return c; } if (c == '\r') { return '\n'; } return ' '; } /* peek -- get the next character without getting it. */ static int peek() { theLookahead = get(); return theLookahead; } /* next -- get the next character, excluding comments. peek() is used to see if a '/' is followed by a '/' or '*'. */ static 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: fprintf(stderr, "Error: JSMIN Unterminated comment.\n"); exit(1); } } default: return c; } } return c; } /* 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 =. */ static void action(int d) { switch (d) { case 1: putc(theA, stdout); case 2: theA = theB; if (theA == '\'' || theA == '"') { for (;;) { putc(theA, stdout); theA = get(); if (theA == theB) { break; } if (theA == '\\') { putc(theA, stdout); theA = get(); } if (theA == EOF) { fprintf(stderr, "Error: JSMIN unterminated string literal."); exit(1); } } } case 3: theB = next(); if (theB == '/' && (theA == '(' || theA == ',' || theA == '=' || theA == ':' || theA == '[' || theA == '!' || theA == '&' || theA == '|' || theA == '?' || theA == '{' || theA == '}' || theA == ';' || theA == '\n')) { putc(theA, stdout); putc(theB, stdout); for (;;) { theA = get(); if (theA == '[') { for (;;) { putc(theA, stdout); theA = get(); if (theA == ']') { break; } if (theA == '\\') { putc(theA, stdout); theA = get(); } if (theA == EOF) { fprintf(stderr, "Error: JSMIN unterminated set in Regular Expression literal.\n"); exit(1); } } } else if (theA == '/') { break; } else if (theA =='\\') { putc(theA, stdout); theA = get(); } if (theA == EOF) { fprintf(stderr, "Error: JSMIN unterminated Regular Expression literal.\n"); exit(1); } putc(theA, stdout); } theB = next(); } } } /* 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. */ static 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; 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; default: action(1); break; } } } } /* main -- Output any command line arguments as comments and then minify the input. */ extern int main(int argc, char* argv[]) { int i; for (i = 1; i < argc; i += 1) { fprintf(stdout, "// %s\n", argv[i]); } jsmin(); return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值