Kraken Front-Trends

45
krakenjs Tim Messerschmidt @SeraAndroid Front-Trends Warsaw, 2014

description

This talk was given at Front-Trends 2014 in Warsaw. It covers PayPal's move to NodeJs (from Java) and which issues this step solved.

Transcript of Kraken Front-Trends

Page 1: Kraken Front-Trends

krakenjs! Tim Messerschmidt @SeraAndroid Front-Trends Warsaw, 2014

Page 2: Kraken Front-Trends

A story of!technical debt

Page 3: Kraken Front-Trends
Page 4: Kraken Front-Trends

Application stacks at PayPal

C++ Java

Page 5: Kraken Front-Trends

Environments & Lean UX

Prototyping Production

Page 6: Kraken Front-Trends
Page 7: Kraken Front-Trends
Page 8: Kraken Front-Trends

Moving away from good old Java

Page 9: Kraken Front-Trends

Rapid deployment and prototyping

Page 10: Kraken Front-Trends

Application stacks at PayPal

C++ XML

Java JSP

Node JS

Page 11: Kraken Front-Trends

Environments & Lean UX

Prototyping Production

node.js Java (Rhino)

Dust  Dust  

Page 12: Kraken Front-Trends

Node & JS at PayPal Moving away from Java architecture •  CSS, HTML and even JS in Java •  Later replaced by JSP for templating

Rapid development & deployment cycles •  Open Source Stack •  Bootstrap for frontend •  JavaScript templating via Dust •  Project Delorean: V8 in PayPal’s C++ stack •  Rhino: JS for PayPal’s Java stack

Page 13: Kraken Front-Trends

New stack at PayPal

C++ Java Node

Dust

Page 14: Kraken Front-Trends

Performance Java stack

paypal-engineering.com/2013/11/22/node-js-at-paypal

Page 15: Kraken Front-Trends

Performance Node stack

paypal-engineering.com/2013/11/22/node-js-at-paypal

Page 16: Kraken Front-Trends

Using npm at PayPal Enables standard services like •  Monitoring •  Logging •  Security •  Analytics •  Authentication •  Packaging

Page 17: Kraken Front-Trends

Release the!Kraken!

Page 18: Kraken Front-Trends
Page 19: Kraken Front-Trends

What is Kraken? A JS suite on top of Node.js and Express Preconfigured with different best practices and tools:

•  Dust for templates •  LESS as CSS preprocessor •  RequireJS as JS file and module loader •  Grunt for running tasks •  Runtime updates for UI code

Page 20: Kraken Front-Trends
Page 21: Kraken Front-Trends

But why?!

Page 22: Kraken Front-Trends

Project structure Opinionated about separation of logic and presentation

•  /config •  /controllers •  /models •  /public/templates •  /locales •  /tests

Page 23: Kraken Front-Trends

Lusca

Kappa Adaro

Makara

Page 24: Kraken Front-Trends

Makara Local content bundles Internationalization support for Node apps var i18n = require('makara');var provider = i18n.create(config);provider.getBundle('index', 'en_US', function (err, bundle) { var string = bundle.get('key');});

Page 25: Kraken Front-Trends

Property files for Makara index.title=KrakenJS at Front-Trendsindex.speaker=Tim Messerschmidtindex.greeting=Ahoi {attendeeName}!# A listindex.speakers[0]=Lea Verouindex.speakers[1]=Jed SchmidtIndex.speakers[2]=Gunnar Bittersmann# A mapindex.sponsors[PP]=PayPalindex.sponsors[GH]=Mozilla# And subkeysindex.conference.language=JS

Page 26: Kraken Front-Trends

Makara in use Defining multiple values /locales/US/en/index.properties•  index.greeting=Hello {name}!

/locales/ES/es/index.properties•  index.greeting=Hola {name}!

Accessing keys in templates <h1>{@pre type="content" key="index.greeting"/}</h1>

Page 27: Kraken Front-Trends

Lusca Sensible security settings to prevent common vulnerabilities

•  Cross-site request forgery support •  Clickjacking / X-Frame-Options •  Output escaping against XSS via Dust •  Content Security Policy

Page 28: Kraken Front-Trends

Lusca configuration Configuration in middleware.json

"appsec": {"csrf": true,"csp": false,"p3p": false,"xframe": "SAMEORIGIN”

}

… or using Lusca’s function calls

Page 29: Kraken Front-Trends

Lusca for CSRF protection A token is added to the session automatically

var express = require('express'),appsec = require('lusca'),server = express();

server.use(appsec.csrf());

The template needs to return the token:

<input type="hidden" name="_csrf" value="{_csrf}”>

Page 30: Kraken Front-Trends
Page 31: Kraken Front-Trends

Adaro Brings Dust as default templating engine Designed to work together with Makara

dustjs.onLoad = function (name, context, callback) {// Custom file read/processing piplinecallback(err, str);

}app.engine('dust', dustjs.dust({ cache: false }));app.set('view engine', 'dust');

Page 32: Kraken Front-Trends

Templating with Dust Layout

<html> <body> {>"{_main}"/} </body></html>

Content page as partial

<div>Hello!</div>dust.render(’partial', { layout: ’template' }, ...);

Page 33: Kraken Front-Trends

Templating with Dust Sections

{#modules} {name}, {description}{~n}{/modules}

View context

{ modules: [ { name: “Makara”, description: “i18n” }, { name: “Lusca”, description: “security settings” }]

}

Page 34: Kraken Front-Trends

Templating with Dust Conditionals

{#modules}{name}, {description}{~n}

{:else}No modules supported :(

{/modules}{?modules}

modules exists!{/modules}{^modules}

No modules!{/modules}

Page 35: Kraken Front-Trends

Kappa Serves as NPM Proxy Enables support for private npm repos Based on npm-delegate hapi support Global or local installation

npm install -g kappakappa -c config.json

Page 36: Kraken Front-Trends

Configuring Kraken Lives in /config/app.json

Development vs. Production environments •  2nd configuration allowed:

–  app-development.json

•  Usage of NODE_ENV for environment

nconf for credentials and other variables

Page 37: Kraken Front-Trends

The Generator

Page 38: Kraken Front-Trends

Getting started sudo npm install -g generator-krakenyo kraken ,'""`. / _ _ \ |(@)(@)| Release the Kraken! ) __ ( /,'))((`.\ (( (( )) )) `\ `)(' /'

Page 39: Kraken Front-Trends

Setting up your app app.configure = function configure(nconf, next) {

// Async method run on startup. next(null);

};app.requestStart = function requestStart(server) { // Run before most express middleware has been registered.};app.requestBeforeRoute = function requestBeforeRoute(server) { // Run before any routes have been added.};app.requestAfterRoute = function requestAfterRoute(server) { // Run after all routes have been added.};

Page 40: Kraken Front-Trends

Generation yo kraken:controller myControllerRespond to JSON requests? (Y/n)create controllers/myController.jscreate test/myController.js

Page 41: Kraken Front-Trends

Result without JSON var myModel = require('../models/model');module.exports = function (app) {var model = new myModel();

app.get(’/ahoi', function (req, res) { res.render(’ahoi', model);});

};

Page 42: Kraken Front-Trends

Result with JSON app.get('/ahoiXHR', function (req, res) {res.format({ json: function () { res.json(model); }, html: function () { res.render(’ahoiXHR', model); }});

});

Page 43: Kraken Front-Trends

Models yo kraken:model unicorncreate models/unicorn.jsmodule.exports = function UnicornModel() {return { name: ‘Charlie’};

};

Page 44: Kraken Front-Trends

Summary Results of using Node at PayPal •  Teams between 1/3 to 1/10 of Java teams •  Doubled requests per second •  35% decrease in average response time •  Lines of code shrunk by factor 3 to 5 •  Development twice as fast •  JS both on frontend and backend

Page 45: Kraken Front-Trends

Thanks! Tim Messerschmidt @SeraAndroid [email protected] slideshare.com/paypal