Bester JavaScript-Kompressor [geschlossen]

171

Was ist der beste verfügbare JavaScript-Kompressor? Ich suche ein Werkzeug, das:

  • ist einfach zu bedienen
  • hat eine hohe Kompressionsrate
  • Erzeugen Sie zuverlässige Endergebnisse (bringt den Code nicht durcheinander)
Ron Harlev
quelle
14
Kennt jemand die Situation im Jahr 2011?
Dan
4
Es ist jetzt 2012 und ich denke, UglifyJS und Closure sind die Gewinner. Ich benutze UglifyJS und es schlägt normalerweise die Hosen von allem anderen.
mkoistinen
Ich verwende htmlcompressor.com/compressor.html für meine mehrseitige jQuery Mobile-App. Es nimmt eine HTML-Datei mit <script> -Tags und komprimiert HTML, JavaScript und CSS. Klappt wunderbar.
Anders
Es ist 2017 - Was ist jetzt das Neueste?
Abhinav Singi
Es ist 2020. Mit einer standardmäßigen "sicheren" Konfiguration gewinnt UglifyJS geringfügig, weil es "sicherer" ist. Für fortgeschrittene Stromversorgungen übergibt Closure Compiler den Arsch von UglifyJS an sich. Der Closure Compiler mit ADVANCDED_OPTIMIZATIONS kann alle möglichen Tricks ausführen, mit denen Sie Ihren Workflow und Ihren Code gleichzeitig optimieren können. Unter stackoverflow.com/a/50355530/5601591 finden Sie Beispiele für die Attraktivität von Closure Compiler (HAFTUNGSAUSSCHLUSS: Ich konnte an keiner anderen Stelle einen geeigneten Blog-Beitrag finden, daher musste ich Sie auf einen von mir verfassten Beitrag verweisen).
Jack Giffin

Antworten:

149

Ich habe kürzlich UglifyJS veröffentlicht , einen JavaScript-Kompressor, der in JavaScript geschrieben ist (läuft auf der NodeJS Node.js- Plattform, kann aber leicht geändert werden, um auf jeder JavaScript-Engine ausgeführt zu werden, da keine Node.jsInterna benötigt werden ). Es ist viel schneller als YUI Compressor und Google Closure , es komprimiert besser als YUI in allen Skripten, mit denen ich es getestet habe, und es ist sicherer als Closure (weiß, wie man mit "eval" oder "with" umgeht).

Neben der Entfernung von Leerzeichen führt UglifyJS auch Folgendes aus:

  • ändert lokale Variablennamen (normalerweise in einzelne Zeichen)
  • verbindet aufeinanderfolgende var-Deklarationen
  • Vermeidet das Einfügen nicht benötigter Klammern, Parens und Semikolons
  • optimiert IFs (entfernt "else", wenn festgestellt wird, dass es nicht benötigt wird, wandelt IFs nach Möglichkeit in die Operatoren &&, || oder? /: um usw.).
  • verwandelt sich foo["bar"]in foo.barwo möglich
  • Entfernt nach Möglichkeit Anführungszeichen von Schlüsseln in Objektliteralen
  • löst einfache Ausdrücke auf, wenn dies zu kleinerem Code führt (1 + 3 * 4 ==> 13)

PS: Oh, es kann auch "verschönern". ;-);

Mischoo
quelle
17
Wir verwenden uglify in einer Anwendung der Enterprise-Klasse. Es macht einen guten Job.
Gyorgyabraham
Könnten Sie mit jsmin auf dem Knoten vergleichen?
Gringo Suave
Vor kurzem hat Uglify API-Aufrufe
gelöscht
@mishoo Hey, ich liebe dein Uglify JS2. Mein Netzwerk funktioniert heutzutage nicht richtig ... Ich würde es gerne unter Windows verwenden. Eine Lösung? : o)
Hydroper
@mishoo Ich zeige Git Link, aber nicht die Idee, wie man es benutzt
Sachin Sarola
124

Ein paar Jahre später erneut auf diese Frage einzugehen , scheint UglifyJS derzeit die beste Option zu sein.

Wie unten angegeben, läuft es auf der NodeJS-Plattform, kann jedoch leicht geändert werden, um auf jeder JavaScript-Engine ausgeführt zu werden.

--- Alte Antwort unten ---

Google hat den Closure Compiler veröffentlicht, der die kleinsten Dateien zu generieren scheint, soweit hier und hier zu sehen

Zuvor waren die verschiedenen Optionen wie folgt

Grundsätzlich macht Packer bei der anfänglichen Komprimierung einen besseren Job, aber wenn Sie die Dateien vor dem Senden über das Kabel gzipen (was Sie tun sollten), erhält YUI Compressor die kleinste endgültige Größe.

Die Tests wurden übrigens mit jQuery-Code durchgeführt.

  • Ursprüngliche jQuery-Bibliothek 62.885 Bytes, 19.758 Bytes nach gzip
  • jQuery minimiert mit JSMin 36.391 Bytes, 11.541 Bytes nach gzip
  • jQuery minimiert mit Packer 21.557 Bytes, 11.119 Bytes nach gzip
  • jQuery wurde mit dem YUI-Kompressor 31.822 Byte, 10.818 Byte nach gzip minimiert

@ Daniel James erwähnt im Kommentar Compressorrater, der zeigt, wie Packer das Diagramm in der besten Komprimierung anführt, also denke ich, ymmv

Klopfen
quelle
Packer hat die Option 'base62 encode' aus - und für jQuery komprimiert es nach gzip kleiner als yui. Dies liegt daran, dass jquery 'eval' und 'with' verwendet, wodurch verhindert wird, dass 'sichere' Kompressoren bestimmte Komprimierungen durchführen, der Packer sie jedoch ignoriert. Im Allgemeinen nicht sicher, aber jQuery wurde für Packer getestet.
Daniel James
Versuchen Sie auch compressorrater.thruhere.net, wenn Sie mir nicht glauben.
Daniel James
9
Vergessen Sie nicht den Nachteil der Packer - Dekompressionszeit.
Nosredna
1
Achtung, Google Closure kann manchmal der schlechteste Kompressor sein (Ausgabe sogar größer als das Original) - es konvertiert \uxxxxstandardmäßig Nicht-ASCII-Zeichen in Zeichenfolgen in Literale. Verwenden Sie zB --charset UTF-8(wenn Sie sicher sind, dass Sie den Browser irgendwie darüber informieren).
Mykhal
Die ClosureCompiler-Ausgabe funktioniert bei mir nicht. jscompress.com funktioniert
Codenamezero
43

YUI Compressor ist der richtige Weg. Es hat eine großartige Komprimierungsrate, ist gut getestet und wird von vielen Top-Sites verwendet und von mir persönlich empfohlen.

Ich habe es für meine Projekte ohne einen einzigen JavaScript-Fehler oder Schluckauf verwendet. Und es hat eine schöne Dokumentation.

Ich habe die CSS-Komprimierungsfunktionen noch nie verwendet, aber sie sind auch vorhanden. Die CSS-Komprimierung funktioniert genauso gut.

Hinweis: Obwohl Dean Edwards / packer / eine bessere Komprimierungsrate als YUI Compressor erzielt, sind bei der Verwendung einige JavaScript-Fehler aufgetreten.

Kamens
quelle
5
Packer sieht in Bezug auf die Dateigröße gut aus, aber es stellt sich heraus, dass die Zeit, die normalerweise für das Entpacken aufgewendet wird, den Zeitgewinn für das Übertragen einer kleineren Datei durch die Röhren überwiegt. Die meisten der tatsächlichen Browser-Benchmarks, die ich gesehen habe, sind langsamer als die unkomprimierten Rohdateien, die mit gzip bereitgestellt werden, was die Zeit bis zur Ausführung im Browser betrifft.
Oberst Sponsz
Hier ist ein Benchmark: ericmmartin.com/comparison-of-javascript-compression-methods
Colonel Sponsz
Hier ist eine Online-Version des Kompressors für den Fall, dass Sie Java nicht zum Laufen bringen möchten
Bryan Legend
Mit Packer komprimierte Skripte müssen nicht entpackt werden, es sei denn, Sie aktivieren die Option Base62-Codierung (was Sie nicht tun sollten, da es sich um ein Gzip eines Laien handelt - ich bin sicher, dass die meisten modernen Server Gzip unterstützen). Es macht keinen Sinn, eine Base62-codierte Datei zu komprimieren, da keine Redundanz mehr zum Ausnutzen übrig bleibt. Die neueste Version von Packer (die endgültige Version) führt keine Fehler ein, hat keinen Entpackungsaufwand (solange Sie nicht Base62-Codierung verwenden) und erzielt dennoch die höchste Komprimierung. Außerdem gibt es jetzt eine Befehlszeilenversion von Packer. Installieren Sie es einfach mit npm wie folgt : npm install packer. (= D
Aadit M Shah
8

Ich verwende ShrinkSafe aus dem Dojo-Projekt - es ist außergewöhnlich, weil es tatsächlich einen JavaScript-Interpreter ( Rhino ) verwendet, um Symbole im Code zu finden und deren Umfang zu verstehen usw., um sicherzustellen, dass der Code funktioniert, wenn er herauskommt anderes Ende, im Gegensatz zu vielen Komprimierungswerkzeugen, die Regex verwenden, um dasselbe zu tun (was nicht so zuverlässig ist).

Ich habe tatsächlich eine MSBuild-Aufgabe in einem Web Deployment-Projekt in meiner aktuellen Visual Studio-Lösung, die ein Skript ausführt, das wiederum alle JS-Dateien der Lösung über ShrinkSafe ausführt, bevor wir sie bereitstellen, und sie funktioniert recht gut.

EDIT: Übrigens ist "best" offen für Debatten, da die Kriterien für "best" je nach den Anforderungen des Projekts variieren. Persönlich denke ich, dass ShrinkSafe eine gute Balance ist; Für einige Leute, die die kleinste Größe für == am besten halten, wird dies nicht ausreichen.

EDIT: Es ist erwähnenswert, dass der YUI-Kompressor auch Rhino verwendet.

Jason Bunting
quelle
5

Probieren Sie JSMin aus , erhalten Sie C #, Java, C und andere Ports und diese sind ebenfalls verfügbar.

Chakrit
quelle
Wurde der C # -Port verschoben / entfernt?
Greg B
4

Wenn Sie Packer verwenden, gehen Sie einfach weit zur Option 'Variablen verkleinern' und gzip den resultierenden Code. Die Option base62 ist nur verfügbar, wenn Ihr Server keine komprimierten Dateien senden kann. Packer mit 'Shrink Vars' erzielen eine bessere Komprimierung der YUI, können jedoch Fehler verursachen, wenn Sie irgendwo ein Semikolon übersprungen haben.

base62 ist im Grunde das gzip eines armen Mannes, weshalb das gzippen von base62-ed-Code größere Dateien liefert als das gzippen von verkleinertem Code.

jcoglan
quelle
1

Hier ist ein YUI-Kompressorskript ( Byuic ), das alle js und css auf einem Pfad findet und sie komprimiert / (optional) verschleiert. Schön, sich in einen Build-Prozess zu integrieren.

Jimg
quelle
1

KJScompress

http://opensource.seznam.cz/KJScompress/index.html

Kjscompress / csskompress besteht aus zwei Anwendungen (kjscompress a csscompress), um nicht signifikante Leerzeichen und Kommentare aus Dateien zu entfernen, die JavaScript und CSS enthalten. Beide sind Befehlszeilenanwendungen für das Betriebssystem GNU / Linux.

MicTech
quelle
1

Js Crush ist ein guter Kompressor, den Sie nach dem Minimieren verwenden können.

Alex
quelle