modern server side development with node.js - benjamin gruenbaum

55
Modern Server Side Development with NodeJS What changed since the 0.10 days Benjamin Gruenbaum

Upload: geektimecoil

Post on 14-Apr-2017

83 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Modern server side development with node.js - Benjamin gruenbaum

Modern Server Side Development with

NodeJSWhat changed since the 0.10 days

Benjamin Gruenbaum

Page 2: Modern server side development with node.js - Benjamin gruenbaum

Benjamin Gruenbaum• I work @ TipRanks• NodeJS core collaborator.• Promises guy, bluebird fan and core contributor.• I argue with people online.• StackOverflow guy.

Page 3: Modern server side development with node.js - Benjamin gruenbaum

This talk is in 3 partsThe Past

The PresentThe Future

Page 4: Modern server side development with node.js - Benjamin gruenbaum

Let’s go back to 2009

Page 5: Modern server side development with node.js - Benjamin gruenbaum

JavaScript on the Server

Page 6: Modern server side development with node.js - Benjamin gruenbaum

JavaScript on the server is an old idea

Netscape Enterprise Server – 1995Steve Yegge’s Server – 2008

Page 7: Modern server side development with node.js - Benjamin gruenbaum

JavaScript on the server is a good idea?

Remember, 2008- JavaScript engines are painfully slow.APIs were nonexistent.Language was hated.

Page 8: Modern server side development with node.js - Benjamin gruenbaum

Suddenly – V8Google needed fast JavaScript in Chrome –

so JavaScript engines became fast.

Page 9: Modern server side development with node.js - Benjamin gruenbaum

This Ryan guy thought… let’s make a non-blocking server.

As in – no thread “block”s in the user server code.

Page 10: Modern server side development with node.js - Benjamin gruenbaum

What can we write this in?

We need a language that doesn’t have file/net APIs yet to get a sane ecosystem.

Page 11: Modern server side development with node.js - Benjamin gruenbaum

JavaScript has no blocking APIs

Page 12: Modern server side development with node.js - Benjamin gruenbaum

The Result – solving “The 10K

Problem”

Page 13: Modern server side development with node.js - Benjamin gruenbaum

How: The Event LoopThreads and OS non-blocking APIs push things into queues

User code runs on a single thread and executes handlers on the queues

Page 14: Modern server side development with node.js - Benjamin gruenbaum

Why even write node?It’s fast enough.

Page 15: Modern server side development with node.js - Benjamin gruenbaum

Why even write node?Server and client in one language

Page 16: Modern server side development with node.js - Benjamin gruenbaum

Why even write node?It was cool

Remember: in 2009 JS is all the hotness

Page 17: Modern server side development with node.js - Benjamin gruenbaum

Code Sample: Chat Servernet.createServer(function(socket) { var user = users.add(socket) socket.on('data', function(data) { <- Callback user.sendOthers("> " + data) });  socket.on('close', function(hadError) { <- Callback user.leave(); });}).listen(8000);

Page 18: Modern server side development with node.js - Benjamin gruenbaum

Ryan joined Joyent, which looked over

Node

Page 19: Modern server side development with node.js - Benjamin gruenbaum

Initially, things worked well – Node got traction

Page 20: Modern server side development with node.js - Benjamin gruenbaum

But… Stagnation started.

No new ES features, even when available in Chrome.

Page 21: Modern server side development with node.js - Benjamin gruenbaum

Fast Forward to last year

Page 22: Modern server side development with node.js - Benjamin gruenbaum

NodeJS was forked into Io.js

Page 23: Modern server side development with node.js - Benjamin gruenbaum

Goal: Modern V8

Page 24: Modern server side development with node.js - Benjamin gruenbaum

Goal: Modern APIs

Page 25: Modern server side development with node.js - Benjamin gruenbaum

Goal: Inclusivity

Page 26: Modern server side development with node.js - Benjamin gruenbaum

Goal: Adopt modern JS

Page 27: Modern server side development with node.js - Benjamin gruenbaum

Eventually, io.js won. The projects merged.

Page 28: Modern server side development with node.js - Benjamin gruenbaum

The result of the io.js fork:Modern V8 version.

NodeJS on top of the io.js fork rather than the Joyent repo.

Handing over of the Joyent repo to the NodeJS foundation.

Community governance. Lots of new features for the community.

Page 29: Modern server side development with node.js - Benjamin gruenbaum

Just how different is Node today?

Page 30: Modern server side development with node.js - Benjamin gruenbaum

Current version: Node 7+Node 0.12 – last yearfunction persistCriticalFile(cb) { fs.readFile("criticalFile", function(err, data) { if(err) return cb(err); db.persist("collection", process(data), function(err, result) { if(err) return cb(err); cb(null, result); }); });}

Page 31: Modern server side development with node.js - Benjamin gruenbaum

Current version: Node 7+Node 7 – this year

async function persistCriticalFile(cb) { const data = await fs.readFileAsync("criticalFile"); return await db.persistAsync("collection", process(data));}

Page 32: Modern server side development with node.js - Benjamin gruenbaum

So – how do we develop with Node 7?Let’s look at a simple scenario. You want to get the comments to a post on your site.

- First, from the cache if they’re there. - If they’re not, from the database.

Page 33: Modern server side development with node.js - Benjamin gruenbaum

So – how do we develop with Node 7?

Node 0.x:app.get('/getComments/:userId', function(req, res){ var userId = req.params.userId; commentCache.get(userId, function(err, data) { if(err) {  instrumentation.log(err);  return res.json(err); } if(data) return res.json(data); db.getCommentsByUserId(userId, function(err, data) {  if(err) {    instrumentation.log(err);    return res.status(500).end(err);  }  cache.store(data, function() {});  return res.json(data);   }); });

});

Page 34: Modern server side development with node.js - Benjamin gruenbaum

So – how do we develop with Node 7?

Node 0.x:app.get('/getComments/:userId', function(req, res){

var userId = req.params.userId;  commentCache.get(userId, function(err, data) { if(err) {  instrumentation.log(err);  return res.json(err); } if(data) return res.json(data); db.getCommentsByUserId(userId, function(err, data) {  if(err) {     instrumentation.log(err);     return res.status(500).end(err);  }  cache.store(data, function() {});  return res.json(data);    });

  });});

Page 35: Modern server side development with node.js - Benjamin gruenbaum

So – how do we develop with Node 7?

Node 0.x:app.get('/getComments/:userId', function(req, res){ var userId = req.params.userId;  commentCache.get(userId, function(err, data) {

if(err) {  instrumentation.log(err);  return res.json(err); } if(data) return res.json(data); db.getCommentsByUserId(userId, function(err, data) {  if(err) {     instrumentation.log(err);     return res.status(500).end(err);  }  cache.store(data, function() {});  return res.json(data);    });  });});

Page 36: Modern server side development with node.js - Benjamin gruenbaum

So – how do we develop with Node 7?

Node 0.x:app.get('/getComments/:userId', function(req, res){ var userId = req.params.userId;  commentCache.get(userId, function(err, data) { if(err) {  instrumentation.log(err);  return res.json(err); }

if(data) return res.json(data); db.getCommentsByUserId(userId, function(err, data) {  if(err) {     instrumentation.log(err);     return res.status(500).end(err);  }  cache.store(data, function() {});  return res.json(data);    });  });});

Page 37: Modern server side development with node.js - Benjamin gruenbaum

So – how do we develop with Node 7?

Node 0.x:

db.getCommentsByUserId(userId, function(err, data) {  if(err) {     instrumentation.log(err);     return res.status(500).end(err);  }  cache.store(data, function() {});  return res.json(data);    });  });

Page 38: Modern server side development with node.js - Benjamin gruenbaum

So – how do we develop with Node 7?

app.get('/getComments/:userId', ({params: {userId}}, res) => { const fromCache = await commentCache.get(userId); if(fromCache) return res.json(fromCache); const fromDb = await db.getCommentsByUserId(userId); res.json(fromDb); commentCache.store(userId, fromDb);}); 

Page 39: Modern server side development with node.js - Benjamin gruenbaum

How our flow has changed: tests

Old

it("does something", function(done) { myApi("someData", function(err, result) { assert.equal(err, null); assert.equal(result === 3); done(); });});

New

it("does something", async () => { assert.equal(await myApi("someData", 3)); });

Page 40: Modern server side development with node.js - Benjamin gruenbaum

How our flow has changed: classes

Old

function User(id) { this.id = id; } User.prototype.foo = function(id){ doBar(id); }

New

class User { constructor(id) { this.id = id } foo() { doBar(id); } }

Page 41: Modern server side development with node.js - Benjamin gruenbaum

How our development flow changed.• Hot reload servers in JS• Node first approaches in client side flows• The rise of universal JS

Page 42: Modern server side development with node.js - Benjamin gruenbaum

How our web flow changed.• Rest vs. GraphQL/Falcor.• Native debugger.• Handling request/response cycles.• How express changed.• How clustering changed.

Page 43: Modern server side development with node.js - Benjamin gruenbaum

How production changed.• The rise of containers.• More people into node.• Community got a lot bigger, a lot more mature.• Node backed by major companies.• Node for IoT, node on Chakra.

Page 44: Modern server side development with node.js - Benjamin gruenbaum

What’s coming next?

Page 45: Modern server side development with node.js - Benjamin gruenbaum

Async Iteratorsasync function* map(fn) { // async + generator, great stream processing for await(const value of this) yield fn(value); };

Page 46: Modern server side development with node.js - Benjamin gruenbaum

Observables

Page 47: Modern server side development with node.js - Benjamin gruenbaum

Core API Promises

Page 48: Modern server side development with node.js - Benjamin gruenbaum

node –expose-wasm

Page 49: Modern server side development with node.js - Benjamin gruenbaum

ES Modulesimport {some, other} from "module name"

Page 50: Modern server side development with node.js - Benjamin gruenbaum

libuv.jsLower level NodeJS

Page 51: Modern server side development with node.js - Benjamin gruenbaum

Code?

Page 52: Modern server side development with node.js - Benjamin gruenbaum

Just a few words about open source

You don’t have to be an expertWe’ll onboard you

Page 53: Modern server side development with node.js - Benjamin gruenbaum

Node is actively looking…

[email protected]

Page 54: Modern server side development with node.js - Benjamin gruenbaum

Questions?The Past

The PresentThe Future

Page 55: Modern server side development with node.js - Benjamin gruenbaum

Thank You