module.exports client side

This has worked for me (CoffeeScript). Assume 'Namespace' is what you want to claim on the window scope for the client

(module ? {}).exports = @Namespace =
  my: 'cool'
  module: '!'

Then you can use require('namespace').my === 'cool' in Node.js or Namespace.my === 'cool' in the browser. This translates into JS as

(typeof module !== "undefined" && module !== null ? module : {}).exports = this.Namespace = {
  my: 'cool',
  module: '!'
};

This is what underscore.js does:

if (typeof exports !== 'undefined') {
  if (typeof module !== 'undefined' && module.exports) {
    exports = module.exports = _;
  }
  exports._ = _;
} else {
  root['_'] = _;
}

This answer relies on the fact that assignments are evaluated right to left. MyModule is assigned to exports first, then exports is assigned to module.exports.

If module is not declared, an exception is thrown.

Short, clean and easy to remember:

try {
   module.exports = exports = MyModule;
} catch (e) {}

This file can be included in both the browser and node.js.