29
Writing Modular JavaScript by Volodymyr Pavlyuk October 2013

Writing modular java script

Embed Size (px)

DESCRIPTION

by Volodymyr Pavlyuk Why do we need this? Code reuse Better maintainability Better flexibility Easier to test Even big application doesn’t look very complex

Citation preview

Page 1: Writing modular java script

Writing Modular JavaScript

by Volodymyr Pavlyuk

October 2013

Page 2: Writing modular java script

Why do we need this?

• Code reuse• Better maintainability• Better flexibility• Easier to test• Even big application doesn’t look very

complex

Page 3: Writing modular java script

What is a Module?

Page 4: Writing modular java script
Page 5: Writing modular java script
Page 6: Writing modular java script
Page 7: Writing modular java script
Page 8: Writing modular java script
Page 9: Writing modular java script
Page 10: Writing modular java script

Module is…

..an independent unit of functionality that is part of the total structure of a web application. Module consists of HTML + CSS + JavaScript.

Page 11: Writing modular java script

Module vs. Widget

• Widget doesn’t have business value, it’s dumb.

• Module does.

Page 12: Writing modular java script

{demo}

Page 13: Writing modular java script

Modularity is not about single-page applications or AMD…

Page 14: Writing modular java script

… it’s all about loose coupling

Page 15: Writing modular java script

Loose coupling

• Reduce interfaces• Use mediator

Page 16: Writing modular java script

Interface → Tight coupling

Page 17: Writing modular java script

MessageBus

Mediator

Module Module Module Module

Page 18: Writing modular java script

define('Mediator', function() { var eventsMap = [];   var Mediator = function() {};  

Mediator.prototype.on = function(ev, fn){ /* Add event listener to the map */ };   Mediator.prototype.fire = function(ev, payload){ /* Call listener */ };

return Mediator; });

Page 19: Writing modular java script

define('foo', function() {   function stopDropAndRoll() { /* Aaaa!! We all gonna die! */ }   return { init: function (mediator) { mediator.on('Earthquake', stopDropAndRoll); } } });

Page 20: Writing modular java script
Page 21: Writing modular java script

define('bar', function() { return { init: function (mediator) { setTimeout(function() { mediator.fire('Earthquake'); }, 1000) } } });

Page 22: Writing modular java script

require([‘Mediator', 'foo', 'bar'], function(Mediator, foo, bar) {

  foo.init(new Mediator()); bar.init(new Mediator());  

});

Page 23: Writing modular java script

Mediator

• It provides consistency• It provides security• It provides communication

Page 24: Writing modular java script

Module

• Only call your own methods or those on the mediator

• Don’t access DOM elements outside of your box• Don’t access non-native global objects• Anything else you need, ask the mediator• Don’t create global objects• Don’t directly reference other modules

Page 25: Writing modular java script

What about JavaScript libraries?

You are free to use any library or framework you want if loose coupling is preserved.

Page 26: Writing modular java script

Does this work for really large applications?

Yes.

Page 27: Writing modular java script

Such pattern is very useful for embedding legacy code

Page 28: Writing modular java script

define(‘uglyJQueryCode', function() {  

/* Legacy code */ return { init: function (mediator) { /* Facade */ } } });

Page 29: Writing modular java script

Questions?