JQuery 有两个版本可供下载,一个是生产版(19KB,缩小和压缩),另一个是开发版(120KB,未压缩代码)。
现在这个紧凑的19kb版本,如果你下载它,你会看到它仍然是一个JavaScript可执行代码。他们如何压缩它?我也该如何像他们一样“压缩”我的代码呢?
JQuery 有两个版本可供下载,一个是生产版(19KB,缩小和压缩),另一个是开发版(120KB,未压缩代码)。
现在这个紧凑的19kb版本,如果你下载它,你会看到它仍然是一个JavaScript可执行代码。他们如何压缩它?我也该如何像他们一样“压缩”我的代码呢?
自己动手压缩代码
任何压缩工具都无法很好地压缩糟糕的代码。
这个例子只是想展示一下压缩工具的作用。
在压缩之前应该做什么
至于jQuery...我不使用jQuery。jQuery是为了兼容旧版本浏览器而创建的。可以查看caniuse.com,几乎所有浏览器都能正常工作(包括ie10现在已经标准化),我认为现在它只会减慢你的网络应用...如果你喜欢$()
,你可以创建自己的简单函数。如果你的客户端需要每次下载100kb的jquery脚本,那么为什么要费心压缩你的代码呢?你的未压缩代码有多大?5-6kb..?更别提你添加的许多插件以使其更易于使用。
原始代码
当你编写一个函数时,你有一个想法,开始写一些东西,有时你最终得到的代码如下。这段代码可以工作。现在大多数人停止思考并将其添加到压缩工具中发布。
function myFunction(myNumber){
var myArray = new Array(myNumber);
var myObject = new Object();
var myArray2 = new Array();
for(var myCounter = 0 ; myCounter < myArray.length ; myCounter++){
myArray2.push(myCounter);
var myString = myCounter.toString()
myObject[ myString ] = ( myCounter + 1 ).toString();
}
var myContainer = new Array();
myContainer[0] = myArray2;
myContainer[1] = myObject;
return myContainer;
}
以下是经过压缩的代码(我添加了新行):
使用 (http://javascript-minifier.com/) 进行压缩。
function myFunction(r){
for(var n=new Array(r),t=new Object,e=new Array,a=0;a<n.length;a++){
e.push(a);
var o=a.toString();
t[o]=(a+1).toString()
}
var i=new Array;
return i[0]=e,i[1]=t,i
}
但是所有这些变量、条件语句、循环和定义都是必要的吗?
大多数时候不需要!
可选项(可以提高性能和缩短代码)
Math
)while
、for
...而不是forEach
)"{}","()",";",spaces,newlines
现在如果一个压缩工具可以压缩你的代码,那么你做错了。
没有任何压缩工具可以适当地压缩糟糕的代码。
自己动手
function myFunction(a,b,c){
for(b=[],c={};a--;)b[a]=a,c[a]=a+1+'';
return[b,c]
}
它与上面的代码完全相同。
性能
你总是需要思考你所需:
在你说“没有人会写出下面这样的代码”之前,先看看这里的前10个问题...
以下是我每十分钟都会看到的一些常见例子。
想要一个可重复使用的条件
if(condition=='true'){
var isTrue=true;
}else{
var isTrue=false;
}
//same as
var isTrue=!!condition
仅在存在时警报
if(condition==true){
var isTrue=true;
}else{
var isTrue=false;
}
if(isTrue){
alert('yes');
}
//same as
!condition||alert('yes')
//if the condition is not true alert yes
警告是或否
if(condition==true){
var isTrue=true;
}else{
var isTrue=false;
}
if(isTrue){
alert('yes');
}else{
alert('no');
}
//same as
alert(condition?'yes':'no')
//if the condition is true alert yes else no
将数字转换为字符串或反之。
var a=10;
var b=a.toString();
var c=parseFloat(b)
//same as
var a=10,b,c;
b=a+'';
c=b*1
//shorter
var a=10;
a+='';//String
a*=1;//Number
四舍五入一个数字
var a=10.3899845
var b=Math.round(a);
//same as
var b=(a+.5)|0;//numbers up to 10 decimal digits (32bit)
var a=10.3899845
var b=Math.floor(a);
//same as
var b=a|0;//numbers up to 10 decimal digits (32bit)
switch case
switch(n)
{
case 1:
alert('1');
break;
case 2:
alert('2');
break;
default:
alert('3');
}
//same as
var a=[1,2];
alert(a[n-1]||3);
//same as
var a={'1':1,'2':2};
alert(a[n]||3);
//shorter
alert([1,2][n-1]||3);
//or
alert([1,2][--n]||3);
尝试捕获
if(a&&a[b]&&a[b][c]&&a[b][c][d]&&a[b][c][d][e]){
console.log(a[b][c][d][e]);
}
//this is probably the onle time you should use try catch
var x;
try{x=a.b.c.d.e}catch(e){}
!x||conole.log(x);
更多内容
如果if(a==1||a==3||a==5||a==8||a==9){
console.log('yes')
}else{
console.log('no');
}
console.log([1,3,5,8,9].indexOf(a)!=-1?'yes':'no');
但是 indexOf
的速度较慢,请参考此链接:https://dev59.com/E3VC5IYBdhLWcg3wnCj6#30335438
数字
1000000000000
//same as
1e12
var oneDayInMS=1000*60*60*24;
//same as
var oneDayInMS=864e5;
var a=10;
a=1+a;
a=a*2;
//same as
a=++a*2;
我发现了一些关于位运算和缩写的不错的文章/站点:
http://mudcu.be/journal/2011/11/bitwise-gems-and-other-optimizations/
http://www.jquery4u.com/javascript/shorthand-javascript-techniques/
如果您使用您喜欢的搜索引擎搜索,还有许多 jsperf 网站显示缩写和位运算的性能。
我可以继续讲个几小时...但是我认为现在足够了。
如果您有任何问题,请随时问。
记住:
没有压缩器可以正确压缩糟糕的代码。
(10.4899845 +.5)|0
的结果为10而不是11。 - DanMan你可以使用众多现有的JavaScript代码压缩工具之一。
MinifyAll
就是一个非常好的插件 - 兼容很多扩展。安装它并重新加载VSCode后,点击您的文件,打开命令面板(Ctrl+Shift+p
),输入minify this document (Ctrl+alt+m
),还有其他可用选项,如保留原始文档等!简单易用!除了最小化,您还可以进行Base64编码。这会使您的文件更加压缩。我相信您已经看到过js文件,它们被包装在带有参数(p,a,c,k,e,r)的eval()函数中。我在这篇文章中读到的 如何最小化Javascript文件?
最近我需要执行同样的任务。虽然 The JavaScript CompressorRater 列出的压缩器非常好,该工具也非常有用,但是这些压缩器无法处理我正在使用的一些 jQuery 代码($.getScript 和 jQuery.fn 检查)。即使 Google Closure Compressor 都在同一行上出现问题。虽然我最终可以解决问题,但这需要我不停地费眼睛。
最终没有任何问题的是 UglifyJS(感谢 @Aries51),而且压缩仅略低于其他所有压缩工具。与 Google 相似,它还有一个 HTTP API。 Packer 也很好,并且在 Perl、PHP 和 .NET 中都有语言实现。
我写了一个小脚本,调用API来压缩你的脚本,请看一下:
#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request;
use Fcntl;
my %api = ( css => 'https://cssminifier.com/raw', js => 'https://javascript-minifier.com/raw' );
my $DEBUG = 0;
my @files = @ARGV;
unless ( scalar(@files) ) {
die("Filename(s) not specified");
}
my $ua = LWP::UserAgent->new;
foreach my $file (@files) {
unless ( -f $file ) {
warn "Ooops!! $file not found...skipping";
next;
}
my ($extn) = $file =~ /\.([a-z]+)/;
unless ( defined($extn) && exists( $api{$extn} ) ) {
warn "type not supported...$file...skipping...";
next;
}
warn "Extn: $extn, API: " . $api{$extn};
my $data;
sysopen( my $fh, $file, O_RDONLY );
sysread( $fh, $data, -s $file );
close($fh);
my $output_filename;
if ( $file =~ /^([^\/]+)\.([a-z]+)$/ ) {
$output_filename = "$1.min.$2";
}
my $resp = $ua->post( $api{$extn}, { input => $data } );
if ( $resp->is_success ) {
my $resp_data = $resp->content;
print $resp_data if ($DEBUG);
print "\nOutput: $output_filename";
sysopen( my $fh, $output_filename, O_CREAT | O_WRONLY | O_TRUNC );
if ( my $sz_wr = syswrite( $fh, $resp_data ) ) {
print "\nOuput written $sz_wr bytes\n";
my $sz_org = -s $file;
printf( "Size reduction %.02f%%\n\n", ( ( $sz_org - $sz_wr ) / $sz_org ) * 100 );
}
close($fh);
}
else {
warn: "Error: $file : " . $resp->status_line;
}
}
使用方法:
./minifier.pl a.js c.css b.js cc.css t.js j.js [..]
目前有两种压缩代码的方法:
http://yui.github.io/yuicompressor/
对于Node和npm也有许多这样的工具可用 - 自动化使用Grunt压缩Javascript是一个好习惯。
试用一下来自fixcode.org的JavaScript压缩器。 这是一个非常有效的工具,可以压缩JavaScript代码