1.1.0 • Published 4 years ago

jsmin.js v1.1.0

Weekly downloads
1
License
MIT
Repository
github
Last release
4 years ago

jsmin.js

Overview

jsmin.js is a JavaScript Minifier given the target file uses "use strict"; style.

Features

The minifier applies these transformations:

  • Removal of Nonessentials
  • Removal of Comments
  • Preservation of Shebangs
  • Preservation of Strings

Usage

./<path/to/jsmin.js> <path/to/file>(.<ext>)?

Motivation

In my exploration of language parsing, I found Douglas Crockford's work where there is a JavaScript Minifier that he implemented in C.

However, some of the code was verbose for a simple utility, so I wanted to write some clever (not clean) code that would produce a similar result.

Through multiple tests, I had to battle the syntax of JavaScript as I stripped nonessential elements of existing programs to produce unreadable functionally equivalent code.

However, this is not an obfuscator, as I decided that I did not want to change the Object output, such as console.log({ a }), in which changing the name of the variables would change the output (however, that might be good for another project idea).

Side Note: As a personal challenge, there are no { or } characters in the source code!

# Running jsmin.js on jsmin.js
./jsmin.js jsmin.js
jsmin.js     size: 1898
jsmin.min.js size: 1117

Without any comments or blank lines, the source code comes out to 34 LOC which is much less than Crockford's jsmin.c with 319 LOC (although it includes a large comment block and blank lines, but is still significantly smaller overall).

Example

Using the same code snippet in Crockford's blog post, these are the results using jsmin.js:

./jsmin.js example/is.js
example/is.js     size: 990
example/is.min.js size: 435

Original

// (c) 2001 Douglas Crockford
// 2001 June 3


// is

// The 'is' object is used to identify the browser.  Every browser edition
// identifies itself, but there is no standard way of doing it, and some of
// the identification is deceptive. This is because the authors of web
// browsers are liars. For example, Microsoft's IE browsers claim to be
// Mozilla 4. Netscape 6 claims to be version 5. This code is seriously
// wrongheaded and obsolete.

var is = {
    ie: navigator.appName == 'Microsoft Internet Explorer',
    java: navigator.javaEnabled(),
    ns: navigator.appName == 'Netscape',
    ua: navigator.userAgent.toLowerCase(),
    version: parseFloat(navigator.appVersion.substr(21)) ||
        parseFloat(navigator.appVersion),
    win: navigator.platform == 'Win32'
};
is.mac = is.ua.indexOf('mac') >= 0;
if (is.ua.indexOf('opera') >= 0) {
    is.ie = is.ns = false;
    is.opera = true;
}
if (is.ua.indexOf('gecko') >= 0) {
    is.ie = is.ns = false;
    is.gecko = true;
}

Minified

var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'};is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;}if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}
1.1.0

4 years ago

1.0.5

4 years ago

1.0.4

4 years ago

1.0.3

4 years ago

1.0.2

4 years ago

1.0.1

4 years ago

1.0.0

4 years ago