Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/syall/jsmin.js
A Clever CLI JavaScript Minifier written with Node.js inspired by Douglas Crockford's implementation.
https://github.com/syall/jsmin.js
Last synced: about 4 hours ago
JSON representation
A Clever CLI JavaScript Minifier written with Node.js inspired by Douglas Crockford's implementation.
- Host: GitHub
- URL: https://github.com/syall/jsmin.js
- Owner: syall
- Created: 2020-01-16T05:21:10.000Z (almost 5 years ago)
- Default Branch: master
- Last Pushed: 2020-01-16T23:13:01.000Z (almost 5 years ago)
- Last Synced: 2024-08-08T16:14:34.898Z (3 months ago)
- Language: JavaScript
- Homepage: https://www.npmjs.com/package/jsmin.js
- Size: 12.7 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# 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
```shell
./ (.)?
```## Motivation
In my exploration of language parsing, I found [Douglas Crockford's work](https://www.crockford.com) where there is a [JavaScript Minifier](https://www.crockford.com/jsmin.html) 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!
```shell
# 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](https://github.com/syall/jsmin.js/blob/master/jsmin.simp.js) comes out to 34 LOC which is much less than [Crockford's jsmin.c](https://github.com/douglascrockford/JSMin/blob/master/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](https://www.crockford.com/jsmin.html), these are the results using `jsmin.js`:
```shell
./jsmin.js example/is.js
example/is.js size: 990
example/is.min.js size: 435
```### Original
```javascript
// (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
```javascript
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;}
```