# In-depth Analysis The Web Tooling Benchmark contains interesting JavaScript workloads from a variety of commonly used web developer tools. It executes these core workloads a couple of times reports a single score at the end that balances them using geometric mean. Note that scores of different versions of the Web Tooling Benchmark are not comparable to each other. ## acorn [Acorn](https://github.com/ternjs/acorn) is a tiny, fast JavaScript parser, written completely in JavaScript. Acorn is the basis for many other JavaScript compiler and code analysis tools, i.e. [webpack](https://webpack.js.org) uses acorn and the [Babylon](https://github.com/babel/babylon) parser used by [Babel](http://babeljs.io) today is also based on acorn. This benchmarks runs the Acorn tokenizer, the parser and the full AST (Abstract Syntax Tree) walker on several popular inputs, including - the [Preact](https://github.com/developit/preact) 8.2.5 bundle, - the [lodash](https://lodash.com) 4.17.4 bundle, - the [underscore](http://underscorejs.org/) 1.8.3 bundle, - an ES2015 module containing the untranspiled [Vue](https://github.com/vuejs/vue) bundle, - the [jQuery](http://jquery.com) 3.2.1 distribution, - the minified [Redux](https://redux.js.org) 3.7.2 distribution, - the [Backbone.js](http://backbonejs.org) 1.1.0 bundle, - and the (concatenated) JavaScript source for the Vanilla ES2015 test in the [Speedometer](https://browserbench.org/Speedometer). ## babel [Babel](https://github.com/babel/babel) is a transpiler that compiles modern JavaScipt (i.e. ES2015 and later) to an older JavaScript dialect (i.e. ES3 or ES5) that is understood by a broad set of browsers. It's probably the most popular transpiler at this point in time and used in the vast majority of web projects nowadays. This benchmark runs the Babel transformation logic using the `es2015` preset on a 196KiB ES2015 module containing the untranspiled [Vue](https://github.com/vuejs/vue) bundle. Note that this explicitly excludes the [Babylon](https://github.com/babel/babylon) parser and only measures the throughput of the actual transformations. The parser is tested separately by the `babylon` benchmark below. ## babel-minify [Babel Minify](https://github.com/babel/minify) is an ES2015+ aware minifier based on the Babel toolchain. It is written as a set of Babel plugins. This benchmark stresses the babel minifier on the (concatenated) JavaScript source for the ES2015 test in the [Speedometer](https://browserbench.org/Speedometer) 2.0 benchmark. ## babylon [Babylon](https://github.com/babel/babylon) is the frontend for the Babel transpiler and deals with transforming the JavaScript input into a so-called AST (Abstract Syntax Tree) that can be consumed by the core transformation logic in Babel. It is built on top of [Acorn](https://github.com/ternjs/acorn) nowadays. This benchmark runs the Babylon parser on different popular inputs, including the [Preact](https://github.com/developit/preact) 8.2.5 bundle, the [lodash](https://lodash.com) 4.17.4 bundle, the JSX files from the React TodoMVC example app, the [underscore](http://underscorejs.org/) 1.8.3 bundle, an ES2015 module containing the untranspiled [Vue](https://github.com/vuejs/vue) bundle, the [jQuery](http://jquery.com) 3.2.1 distribution, the minified [Redux](https://redux.js.org) 3.7.2 distribution, and the (concatenated) JavaScript source for the Vanilla ES2015 test in the [Speedometer](https://browserbench.org/Speedometer). ## buble A test to stress the [Buble](https://github.com/Rich-Harris/buble) ES2015 compiler, both the parser and the actual transformation logic, on the same 196K ES2015 module containing the untranspiled [Vue](https://github.com/vuejs/vue) source code that is also used to stress by the `babel` and `babylon` tests. ## chai [Chai](http://chaijs.com) is a popular BDD / TDD assertion library for [Node](https://www.nodejs.org) and the browser that can be delightfully paired with any test driver framework for JavaScript. It is commonly used to write unit and integration tests. As such this test is not just a good benchmark for web tooling on the [Node](https://www.nodejs.org) side, but is also very relevant to the browser as tests often need to be run in the browser too. This benchmark is based on the test suite that comes with Chai and essentially uses the Chai BDD style interface to test the Chai library itself. ## coffeescript [CoffeeScript](http://coffeescript.org/) is a little language that attempts to expose the good parts of JavaScript in a simple way. At some point CoffeeScript was very popular. This benchmark runs the CoffeeScript compiler on the [`lexer.coffee`](https://github.com/v8/web-tooling-benchmark/blob/third_party/coffeescript-lexer-2.0.1.coffee) file from the CoffeeScript 2.0.1 distribution. ## espree [Espree](https://github.com/eslint/espree) started out as a fork of Esprima v1.2.2, the last stable published released of Esprima before work on ECMAScript 6 began. Espree is now built on top of Acorn, which has a modular architecture that allows extension of core functionality. The goal of Espree is to produce output that is similar to Esprima with a similar API so that it can be used in place of Esprima. The popular analysis framework [ESLint](https://eslint.org) is built on Espree today. This benchmark runs Espree on a several common scripts, including - the [Backbone.js](http://backbonejs.org) 1.1.0 bundle, - the [jQuery](http://jquery.com) 3.2.1 distribution, - the [MooTools](https://mootools.net) 1.6.0 bundle, - and the [underscore](http://underscorejs.org/) 1.8.3 bundle. ## esprima [Esprima](http://esprima.org) is a high performance, standard-compliant ECMAScript parser written in ECMAScript, which can be used to perform [lexical analysis](https://en.wikipedia.org/wiki/Lexical_analysis) (tokenization) or [syntactic analysis](https://en.wikipedia.org/wiki/Parsing) (parsing) of an ECMAScript program. Esprima was initially used as the basis for several tools like ESLint and Babel, and is still in use by a lot of analysis tools. This benchmark runs both the tokenizer and the parser on a variety of common scripts, including - the [Backbone.js](http://backbonejs.org) 1.1.0 bundle, - the [jQuery](http://jquery.com) 3.2.1 distribution, - the [MooTools](https://mootools.net) 1.6.0 bundle, - and the [underscore](http://underscorejs.org/) 1.8.3 bundle. ## jshint [JSHint](http://jshint.com) is a program that flags suspicious usage in programs written in JavaScript. At some point it was very popular, but nowadays it seems that many projects have switch or are switching to [ESLint](https://eslint.org). This benchmark runs JSHint on - the [lodash](https://lodash.com) 4.17.4 bundle, - the [Preact](http://preactjs.com) 8.2.5 bundle, - and the [underscore](http://underscorejs.org) 1.8.3 distribution. ## lebab [Lebab](https://github.com/lebab/lebab) transpiles your ES5 code to ES6/ES7, thus performing the opposite of what [Babel](https://github.com/babel/babel) does. This benchmark runs the Lebal ES5 to ES6/ES7 transpiler on the [Preact](http://preactjs.com) 8.2.5 bundle. ## postcss [PostCSS](https://github.com/postcss/postcss) is a tool for transforming styles with JS plugins. These plugins can lint your CSS, support variables and mixins, transpile future CSS syntax, inline images, and more. This benchmark runs the PostCSS processor with [Autoprefixer](https://github.com/postcss/autoprefixer) and [postcss-nested](https://github.com/postcss/postcss-nested) plugins on - the [Bootstrap](https://getbootstrap.com/) 4.0.0 bundle. - the [Foundation](https://foundation.zurb.com/) 6.4.2 bundle. - the [Angular Material](https://material.angularjs.org) 1.1.8 bundle. ## prepack [Prepack](https://prepack.io) is a tool that optimizes JavaScript source code: Computations that can be done at compile-time instead of run-time get eliminated. Prepack replaces the global code of a JavaScript bundle with equivalent code that is a simple sequence of assignments. This gets rid of most intermediate computations and object allocations. It currently focuses on React Native use cases. This benchmark runs prepack on both - the [Preact](https://github.com/developit/preact) 8.2.5 bundle (unminified) as well as - the [Redux](https://github.com/reactjs/redux) 3.7.2 bundle (minified). ## prettier [Prettier](https://github.com/prettier/prettier) is an opinionated code formatter which removes all the original styling and ensures that all outputted code conforms to a consistent style. It is often used in web projects today to automatically format JavaScript, HTML, CSS and other files. This benchmark runs prettier on different inputs, including - the [lodash](https://lodash.com) 4.17.4 bundle, - the [Preact](http://preactjs.com) 8.2.5 bundle, and - the JSX files from the React [todomvc](https://github.com/tastejs/todomvc) example app. ## source-map [Source Map](https://github.com/mozilla/source-map) is a library developed by Mozilla to generate and consume source maps, which in turn are used by browsers to display proper JavaScript when debugging a minified application. This benchmark stresses the source-map tool on both parsing and serializing a variety of different source maps, including the [Preact](http://preactjs.com) 8.2.5 source map. ## terser [terser](https://github.com/fabiosantoscode/terser) is a fork of `uglify-es` that retains API and CLI compatibility with `uglify-es` and `uglify-js@3`. This benchmark stresses the new ES2015-and-beyond minifier on the (concatenated) JavaScript source for the ES2015 test in the [Speedometer](https://browserbench.org/Speedometer) 2.0 benchmark. ## typescript [TypeScript](https://github.com/Microsoft/TypeScript) is a language for application-scale JavaScript. It adds optional types, classes, and modules to JavaScript, and compiles to readable, standards-based JavaScript. This benchmark stresses the TypeScript compiler by running it on the [`typescript-angular`](https://github.com/tastejs/todomvc/tree/master/examples/typescript-angular) example from [todomvc](https://github.com/tastejs/todomvc). ## uglify-js [UglifyJS](https://github.com/mishoo/UglifyJS2) is a JavaScript parser, minifier, compressor and beautifier toolkit, which is commonly used to minimize JavaScript bundles. This benchmark runs the UglifyJS minifier on the (concatenated) JavaScript source for the ES2015 test in the [Lodash](https://lodash.com) module.