Slide 1

Slide 1 text

Developing MEAN applications KIEVJS MEETUP 2013

Slide 2

Slide 2 text

Dmitri Voronianski javascript developer [at] e-conomic HERE YOU CAN FIND ME.. ..TWEETING: @voronianski ..BLOGGING: http://pixelhunter.me ..OR CODING: http://github.com/voronianski

Slide 3

Slide 3 text

HMM.. SO WHAT IS MEAN?!

Slide 4

Slide 4 text

express MEAN stack

Slide 5

Slide 5 text

OPEN-SOURCED, LEADING NOSQL DATABASE MONGODB EXPRESS.JS WEB APPLICATION FRAMEWORK FOR NODE.JS (10,884 GITHUB STARS) ANGULAR.JS CLIENT-SIDE WEB APPLICATION FRAMEWORK BY GOOGLE (15,263 GITHUB STARS) http://mongodb.org http://angularjs.org http://expressjs.com NODE.JS SOFTWARE PLATFORM BUILT ON V8 JAVASCRIPT ENGINE (25,119 GITHUB STARS) http://nodejs.org

Slide 6

Slide 6 text

IT’S ALL ABOUT POPULAR FRAMEWORKS AND TECHNOLOGIES SPEAKING ONE LANGUAGE: JAVASCRIPT

Slide 7

Slide 7 text

«EASY WAY TO STORE YOUR LIKES IN A SAFE PLACE..» likeastore.com

Slide 8

Slide 8 text

REST API

Slide 9

Slide 9 text

● WRAPS NATIVE MONGODB NODE.JS DRIVER ● EMULATES MONGO SHELL SYNTAX ● SMALL AND FAST http://npmjs.org/package/mongojs MONGOJS: var mongo = require('mongojs'); var db = mongo.connect(connection, collections); db.collection.find({}, function (err, docs) { // do smth with docs ... });

Slide 10

Slide 10 text

● DEFINING DOCUMENT LOOK ● EASY AND FLEXIBLE DATA VALIDATION ● JSON SCHEMA SPEC - http://json-schema.org/ https://npmjs.org/package/json-schema JSON-SCHEMA: var schema = require('json-schema'); var result = schema.validate(jsonInput, modelSchema); if (!result.valid) { return callback(result.errors); }

Slide 11

Slide 11 text

ROUTES && MIDDLEWARES: express ● SERVE MASTER HTML ONCE ● BASIC AUTH MIDDLEWARE ON `/api` ROUTES ● LET CLIENT DO COOL STUFF BY SERVING JSON TO IT app.get('/api/items/:type', getItemsByType); ... function getItemsByType (req, res, next) { item.getItemsByType(req.params.type, function (err, items) { if (err) { return next(err); } res.json(items); }); }

Slide 12

Slide 12 text

WEB CLIENT

Slide 13

Slide 13 text

ANGULAR.JS IS AWESOME

Slide 14

Slide 14 text

NO BOILERPLATE CODE TWO-WAY DATA BINDING DIRECTIVES NO DEPENDENCIES SIMPLE TEMPLATES ...

Slide 15

Slide 15 text

START WITH master.html ..OR .ejs ..OR .jade ..OR WHATEVER <%= title %>

Slide 16

Slide 16 text

PROCEED WITH ROUTES.. THROUGH SIMPLE CLIENT-SIDE HTML5 PUSHSTATE ROUTING app.config(['$routeProvider', '$locationProvider', function ($routeProvider, $locationProvider) { $routeProvider .when('/', { templateUrl: 'partials/dashboard', controller: 'dashboardCtrl' }) .when('/settings', { templateUrl: 'partials/settings', controller: 'settingsCtrl' }) .otherwise({ redirectTo: '/' }); $locationProvider.html5Mode(true); } ]);

Slide 17

Slide 17 text

USE API SERVICE WITH ngResource TO GET DATA FROM SERVER ..AND RESOURCES // api service Services.factory('api', ['$resource', function ($resource) { return $resource('/api/:resource/:target', {}); }]); ... // in controller Controllers.controller('dashboardCtrl', ['$scope', 'api', function ($scope, api) { $scope.items = api.query({ resource: 'items', target: 'all' }); ... }]);

Slide 18

Slide 18 text

HAVE FUN WITH MORE FEATURES..

Slide 19

Slide 19 text

2-WAY DATA BINDING AND TEMPLATES: ● PERMANENTLY BINDS VIEW AND MODEL ● NO REFRESH CYCLES AND HARD TO MAINTAIN RENDER CODE ● REAL HTML TEMPLATES
Name:

Hello {{name}}

Slide 20

Slide 20 text

SCOPES, MODELS AND WATCHERS: ● MODEL AS A PLAIN JAVASCRIPT OBJECT (NO Model.extend(), ETC.) ● SCOPE IS AN OBJECT THAT REFERS TO THE MODEL ● SCOPE ALLOWS TO SET WATCHERS ON A MODEL ● SCOPE PROPAGATES EVENTS ALLOWING TO BROADCAST AND LISTEN $scope.$watch('myModel', function (newVal, oldVal) { console.log('the model myModel has changed!'); console.log('Its new value is ', newVal); console.log('Its old value was ', oldVal); });

Slide 21

Slide 21 text

● NATURAL DECLARATIVE APPROACH ● REUSABLE COMPONENTS ● MAKE BROWSER SMARTER WITH ● MANIPULATE DOM ONLY(!) HERE WITH NO NEED OF JQUERY http://docs.angularjs.org/guide/directive DIRECTIVES:

Slide 22

Slide 22 text

Directives.directive('linkify', function () { return { restrict: 'A', // like attribute scope: { text: '=linkify' // isolated scope }, link: function (scope, elem, attrs) { // where the magic happens var result = scope.text.replace(urlRegex, function () { return '' + url + ''; }); elem.html(result); } }; }); DIRECTIVE: TEMPLATE:

Slide 23

Slide 23 text

ANGULAR.JS + REQUIRE.JS SPECIFICS

Slide 24

Slide 24 text

NO NEED FOR “ng-app” DIRECTIVE MANUAL APPLICATION BOOTSTRAP REQUIRE DEPENDENCIES

Slide 25

Slide 25 text

define(function (require) { 'use strict'; var angular = require('angular'); var services = require('./services/services'); var controllers = require('./controllers/controllers'); var directives = require('./directives/directives'); var app = angular.module('yourApp', ['services', 'controllers', 'directives']); app.init = function () { angular.bootstrap(document, ['yourApp']); }; ... return app; }); MAIN MODULE APP.JS: REQUIRE’S MAIN.JS: require.config({ ... }); require(['app'], function (app) { app.init(); });

Slide 26

Slide 26 text

FEW WORDS ABOUT INFRASTRUCTURE

Slide 27

Slide 27 text

BOWER CLIENT-SIDE PACKAGES MANAGEMENT GRUNT HINTING, MINIFYING AND BUILDING DOKKU GIT PUSH PRODUCTION MASTER

Slide 28

Slide 28 text

FULL TEXT SEARCH DEMO

Slide 29

Slide 29 text

https://github.com/linnovate/mean http://www.mean.io/ https://github.com/mgechev/angularjs-style-guide https://github.com/marcorinck/ngStart https://github.com/tnajdek/angular-requirejs-seed http://beletsky.net/2013/10/securing-express-dot-js-http-endpoints.html RESOURCES

Slide 30

Slide 30 text

QUESTIONS?

Slide 31

Slide 31 text

THANKS, @voronianski