# CommonJS

CommonJS fue un proyecto con el objetivo de establecer convenciones sobre el ecosistema de módulos para JavaScript fuera del navegador web. La razón principal de su creación fue la gran falta de unidades modulares de scripts de JavaScript de forma comúnmente aceptada, que pudieran ser reutilizadas en entornos diferentes a los proporcionados por un navegador web convencional, por ejemplo, un servidor web o aplicaciones de escritorio nativas que ejecuten scripts de JavaScript.
CommonJS mantiene especificaciones (incluyendo borradores) y una lista de implementaciones en un sitio MediaWiki. Todas las actividades de edición han cesado desde noviembre de 2014, marcando el final efectivo de su vida.

## Historia

El proyecto fue iniciado por el ingeniero de Mozilla Kevin Dangoor en enero de 2009 y se llamó inicialmente ServerJS.
En agosto de 2009, el proyecto pasó a denominarse CommonJS para mostrar la mayor aplicabilidad de las API's. Las especificaciones se crean y aprueban en un proceso abierto. Una especificación sólo se considera definitiva cuando ha sido terminada por múltiples implementaciones. CommonJS no está afiliado al grupo Ecma International TC39 que trabaja en ECMAScript, pero algunos miembros del TC39 participan en el proyecto.
En mayo de 2013, Isaac Z. Schlueter, el autor de npm, el administrador de paquetes para Node.js, dijo que CommonJS se está volviendo obsoleto por el ahora dominante Node.js, y es evitado por los desarrolladores del núcleo de Node.js.

## Especificaciones

La lista de especificaciones incluye:
* Modules/1.0 (Superseded by Modules/1.1)
* Modules/1.1
* Modules/1.1.1
* Packages/1.0
* System/1.0

### Propuestas

Las propuestas abarcan mucho más que módulos. Pretenden definir un conjunto de APIs que sean útiles tanto para implementaciones de JavaScript no web, con nombres de paquetes estandarizados para proporcionar interoperabilidad dentro del ecosistema. Este objetivo a veces se superpone con el del TC39, y partes como Promesas se han convertido en el propio ECMAScript.
La parte después de la barra es la versión. Cuando una propuesta está en disputa, a cada propuesta individual (incluyendo revisiones secuenciales del mismo autor) se le asigna una nueva letra. Cuando se conoce la dirección principal se le empiezan a asignar versiones numéricas.
* Binary/B,F
* Console (ported from Web)
* Encodings/A,C
* Encodings/A
* HTTP Client/B
* IO/A
* Filesystem/A,A/0
* Modules/Async/A
* Modules/AsynchronousDefinition
* Modules/LoaderPlugin
* Modules/Resources
* Modules/SimpleAsynchronous
* Modules/Transport/B,C,D,E
* Modules/Wrappings
* Modules/Wrappings-Explicit-Dependencies
* Packages/1.1
* Packages/AsynchronousDefinition
* Packages/Mappings/A,B,C,D
* Promises/B,D
* Unit Testing/B,1.0,1.0.1

## Implementaciones

* Akshell
* Common Node
* CommonJS Compiler - a command-line tool that makes Common JS modules suitable for in-browser use
* CommonJS for PHP - a light-weight CommonJS implementation for PHP 5.3+
* CouchDB
* Flusspferd
* GPSEE
* Jetpack
* Joyent Smart Platform
* JSBuild
* MongoDB
* Narwhal (JavaScript platform)
* Node.js (partial; synchronous)
* Persevere
* PINF JavaScript Loader
* RingoJS
* SilkJS
* SproutCore
* TeaJS
* Wakanda
* XULJet