如何'缩小'Javascript代码

Kal*_*lEl 95 javascript gzip

JQuery有两个版本供下载,一个是Production(19KB,Minified和Gzipped),另一个是Development(120KB,Uncompressed Code).

现在是紧凑的19kb版本,如果你下载它,你会看到仍然是一个javascript可执行代码.他们是如何紧凑的呢?我怎么能像这样'缩小'我的代码呢?

coc*_*cco 46

DIY缩小

没有minifier可以正确压缩坏代码.

在这个例子中,我只是想表明一个缩小器做了多少.

你缩小之前应该做些什么

关于jQuery ...我不使用jQuery.jQuery是针对旧版浏览器,它是出于兼容性原因而制作的.检查caniuse.com,几乎所有浏览器都能正常工作(现在也就是ie10标准化了),我想现在是只是这里放慢你的web应用程序...如果你喜欢$()你应该创建自己的简单功能.如果你的客户需要每天下载100kb jquery脚本,为什么还要压缩你的代码?你的未压缩代码有多大?5-6kb ..?不要谈论你添加的大量插件,以使其更容易.

原始代码

当你写一个函数你有一个想法,开始写东西,有时你最终得到类似下面的代码.代码工作.现在大多数人停止思考并将其添加到minifier并发布它.

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;
}
Run Code Online (Sandbox Code Playgroud)

这里是缩小代码(我添加了新行)

缩小使用(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
}
Run Code Online (Sandbox Code Playgroud)

但是所有这些变量,ifs,循环和定义是否必要?

大部分时间都没有!

  1. 删除不必要的if,loop,var
  2. 保留原始代码的副本
  3. 使用缩小器

可选(提高性能和缩短代码)

  1. 使用速记运算符
  2. 使用按位运算符(不要使用Math)
  3. 使用a,b,c ...为你的临时变量
  4. 使用旧语法(while,for...不forEach)
  5. 使用函数参数作为占位符(在某些情况下)
  6. 删除不必要的 "{}","()",";",spaces,newlines
  7. 使用缩小器

现在,如果一个minifier可以压缩代码你做错了.

没有minifier可以正确压缩坏代码.

DIY

function myFunction(a,b,c){
 for(b=[],c={};a--;)b[a]=a,c[a]=a+1+'';
 return[b,c]
}
Run Code Online (Sandbox Code Playgroud)

它与上面的代码完全相同.

性能

http://jsperf.com/diyminify

你总是需要思考你需要的东西:

在您说"没有人会像下面的代码一样编写代码"之前,请查看此处的前10个问题...

以下是我每十分钟看一些常见的例子.

想要一个可重复使用的条件

if(condition=='true'){
 var isTrue=true;
}else{
 var isTrue=false;
}
//same as
var isTrue=!!condition
Run Code Online (Sandbox Code Playgroud)

仅在存在时发出警报

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
Run Code Online (Sandbox Code Playgroud)

警告是或否

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
Run Code Online (Sandbox Code Playgroud)

将数字转换为字符串或反之亦然

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
Run Code Online (Sandbox Code Playgroud)

围绕一个数字

var a=10.3899845
var b=Math.round(a);
//same as
var b=(a+.5)|0;//numbers up to 10 decimal digits (32bit)
Run Code Online (Sandbox Code Playgroud)

放一个号码

var a=10.3899845
var b=Math.floor(a);
//same as
var b=a|0;//numbers up to 10 decimal digits (32bit)
Run Code Online (Sandbox Code Playgroud)

开关盒

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);
Run Code Online (Sandbox Code Playgroud)

试着抓

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);
Run Code Online (Sandbox Code Playgroud)

更多如果

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');
Run Code Online (Sandbox Code Playgroud)

但是indexOf慢读这个/sf/answers/2123480691/

数字

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;
Run Code Online (Sandbox Code Playgroud)

我发现一些关于按位/速记的好文章/网站:

http://mudcu.be/journal/2011/11/bitwise-gems-and-other-optimizations/

http://www.140byt.es/

http://www.jquery4u.com/javascript/shorthand-javascript-techniques/

如果您使用自己喜欢的搜索引擎搜索,还有许多jsperf网站显示速记和bitwsie的性能.

我可以花一个小时......但我觉得现在已经足够了.

如果你有一些问题,请问.

记住

没有minifier可以正确压缩坏代码.

  • 几乎没有理由手工缩小代码.编写其他开发人员(或您,10个月后)易于理解的代码.是的,更简单更好.在自动构建过程中使用缩小的方法来保留原始文件.几乎在所有情况下,手工优化带来的任何速度提升远远超过开发人员破译缩小代码的成本. (28认同)
  • 取决于你在做什么.例如,如果您使用动画/画布,大型数据集和文件操作,快速代码非常重要,特别是在移动设备上...重点是,对于一些开发人员来说,它很难阅读.我...我编写代码奔腾2 ..所以可能1998年,我可以阅读代码,根据我的经验,我有更少的代码来检查错误.关于速度..嗯,你错了.在复杂函数中使用按位/缩写的性能提升是疯狂的.特别是在各种设备/浏览器上进行测试.使用google shorthandbitwise javascript并找到很多示例 (4认同)
  • 从可支持性的角度来看,这听起来是一个糟糕的建议 (2认同)

Dar*_*rov 35

您可以使用众多可用的javascript minifiers中的一个.


Khb*_*Khb 9

谷歌刚刚提供了一个javascript编译器,可以缩小你的代码,消除死代码分支和更多优化.

谷歌JavaScript编译器

问候
K.


DAV*_*AYI 8

如果您使用 VSCode 编辑器,则有很多可用的插件/扩展。

例如,它MinifyAll是一个非常好的例子 - 与许多扩展兼容。

安装它并重新加载 VSCode。然后单击您的文件,打开命令面板(Ctrl+Shift+p),键入 ant 缩小此文档(Ctrl+alt+m),还有其他可用选项,例如保留原始文档等!简单的!