Slide 1

Slide 1 text

Modules in node.js Modules in node.js

Slide 2

Slide 2 text

What do we mean by modules? What do we mean by modules? Files!

Slide 3

Slide 3 text

Disclamer Disclamer Opinionated Best Practices Opinionated Best Practices ahead ahead

Slide 4

Slide 4 text

The Module Layout The Module Layout

Slide 5

Slide 5 text

/** * @fileOverview Cors Middleware. */ var util = require('util'); var fs = require('fs'); var Promise = require('bluebird'); var _ = require('lodash'); var Middleware = require('./middleware'); var helpers = require('../util/helpers'); /** * The Cors Middleware. * */ var Cors = module.exports = {}; /** * CORS Middleware * * @param {Object} req The request Object. * @param {Object} res The response Object. * @param {Function(Error=)} next pass ctrl. */ Cors.use = function(req, res, next) { ... }; Module Description Dependencies System Deps NPM Deps Project Deps Export Statement Method Definition DocBlocks for Args Function Expression

Slide 6

Slide 6 text

The Dependencies The Dependencies @thanpolas 1. System Dependencies 2. NPM Dependencies 3. Project Dependencies /** * @fileOverview Cors Middleware. */ var util = require('util'); var fs = require('fs'); var Promise = require('bluebird'); var _ = require('lodash'); var Middleware = require('./middleware'); var helpers = require('../util/helpers'); 1. 2. 3.

Slide 7

Slide 7 text

The Module Types The Module Types

Slide 8

Slide 8 text

Constructors Constructors Objects Objects Only 2 types of Modules Only 2 types of Modules

Slide 9

Slide 9 text

Module Types Module Types Constructors Constructors var Cors = module.exports = function(){ Middleware.apply(this, arguments); }; util.inherits(Cors, Middleware); Objects Objects var Cors = module.exports = {};

Slide 10

Slide 10 text

Module Types Module Types Constructor Constructor /** * The Cors Middleware. * * @contructor * @extends {cc.Middleware} */ var Cors = module.exports = function(){ Middleware.apply(this, arguments); }; util.inherits(Cors, Middleware); /** * CORS Middleware * * @param {Object} req The request Object. * @param {Object} res The response Object. * @param {Function(Error=)} next pass ctrl. */ Cors.prototype.allowCrossDomain = function(req, res, next) {...};

Slide 11

Slide 11 text

Module Types Module Types Module Module /** * The Cors Middleware. * */ var Cors = module.exports = {}; /** * CORS Middleware * * @param {Object} req The request Object. * @param {Object} res The response Object. * @param {Function(Error=)} next pass ctrl. */ Cors.use = function(req, res, next) { ... };

Slide 12

Slide 12 text

If you want state --> Ctor If you want inheritance --> Ctor Helpers / Util --> Obj Enums / Dicts --> Obj Config Files --> Obj When to use which When to use which It's all about the state It's all about the state

Slide 13

Slide 13 text

Module Inheritance Module Inheritance The classical way The classical way

Slide 14

Slide 14 text

Module Inheritance Module Inheritance The Classical way The Classical way var util = require('util'); var EventEmitter = require('events').EventEmitter; var MiddlewareBase = module.exports = function() { EventEmitter.apply(this, arguments); this.foo = 1; }; util.inherits(MiddlewareBase, EventEmitter); middleware-base.midd.js var util = require('util'); var MiddleWareBase = require('./middleware-base.midd'); var Cors = module.exports = function() { MiddlewareBase.apply(this, arguments); console.log(this.foo); // 1 }; util.inherits(Cors, MiddlewareBase); cors.midd.js

Slide 15

Slide 15 text

Beware of context Beware of context Cors.prototype.use = function(req, res, next) { // good doSomeAsync(this._handleAsync.bind(this)); // bad doSomeAsync(this._handleAsync); };

Slide 16

Slide 16 text

Beware of performance Beware of performance Cors.prototype.use = function(req, res, next) { while(true) { // highly repetitive operation // good var self = this; doSomeAsync(function(result) { self._handleAsync(result); }); // bad doSomeAsync(this._handleAsync.bind(this)); } };

Slide 17

Slide 17 text

Shameless Plug Time Shameless Plug Time CIP! CIP!

Slide 18

Slide 18 text

CIP CIP Classical Inheritance Pattern at its Best Classical Inheritance Pattern at its Best var util = require('util'); var EventEmitter = require('events').EventEmitter; var MiddlewareBase = module.exports = function() { EventEmitter.apply(this, arguments); this.foo = 1; }; util.inherits(MiddlewareBase, EventEmitter); Base Constructors vanilla var EventEmitter = require('events').EventEmitter; var cip = require('cip'); var CeventEmitter = cip.cast(EventEmitter); module.exports = CeventEmitter.extend(); Base Constructors using CIP

Slide 19

Slide 19 text

CIP CIP Classical Inheritance Pattern at its Best Classical Inheritance Pattern at its Best var util = require('util'); var MiddleWareBase = require('./middleware-base.midd'); var Cors = module.exports = function() { MiddlewareBase.apply(this, arguments); console.log(this.foo); // 1 }; util.inherits(Cors, MiddlewareBase); Child Constructors vanilla var MiddlewareBase = require('./middleware-base.midd'); var Cors = module.exports = MiddlewareBase.extend(function () { /* Ctor */ }); Child Constructors using CIP

Slide 20

Slide 20 text

CIP CIP Classical Inheritance Pattern at its Best Classical Inheritance Pattern at its Best var MiddlewareBase = require('./middleware-base.midd'); var MiddlewareTraits = require('./middleware-traits.midd'); var Cors = module.exports = MiddlewareBase.extend(function () { /* Ctor */ }); Cors.mixin(MiddlewareTraits); Mixins! var Cors = require('./cors.midd'); var SuperCors = module.exports = Cors.extend(function () { /* Ctor */ }); Inheritance Goes on...

Slide 21

Slide 21 text

CIP CIP /thanpolas/cip /thanpolas/cip

Slide 22

Slide 22 text

Thank you (here is where you applaud) Thanasis Polychronakis @thanpolas

Slide 23

Slide 23 text

Questions? Thanasis Polychronakis @thanpolas