Distintos formatos para módulos en JavaScript

Existen distintos formatos ya que JavaScript originalmente no incluía el concepto de modulos.

Asynchronous Module Definition (AMD)

Es usado por los navegadores.
Utiliza define como palabra reservada.

// suma.js
define(function() {
  return suma = function(r) {
    return r + r;
  }
});


// index.js
define(function(require) {
  require('./suma');
  suma(4); // = 8
}

CommonJS (CJS)

Se usa en npm y Node.js.
Utiliza require y module.exports para definir las dependencias de los modulos.

// utils.js
function suma(r){
  return r + r;
}
exports.suma = suma;


// index.js
var utils = require('./utils.js');
utils.suma(4); // = 8

ES Module (ESM).

Es parte del lenguaje nativo a partir de ECMAScript 6.
Utiliza import y export para definir las dependencias de los modulos.
La keyword System.register se diseño para dar soporte a los modulos en ECMAScript 5.

// suma.js
 export function suma(r) {
   return r + r;
 }


 // index.js
 import suma from "./suma";
 suma(4); // = 8

Universal Module Definition (UMD)

Se puede usar en el navegador y en Node.js.
https://github.com/umdjs/umd/tree/master/templates