More Related Content Similar to Jaap : node, npm & grunt (20) Jaap : node, npm & grunt2. About
{
"firstName" : "Bertrand",
"lastName" : "Chevrier",
"online" : {
"twitter" : "@kramp",
"github" : "github.com/krampstudio",
"blog" : "krampstudio.com"
},
"pro" : {
"employer" : "CGI",
"position" : "Technical expert"
},
"loves" : ["JavaScript", "Linux", "Java", "PHP"]
}
8. 1. Buzzword ?
2. JS.everywhere(2013);
3. JIFSNIF
4. Huge community
Platform Repo Total
packages
Platform
years old
Avg/year since
platform
Repo
years
old
Avg/year
since repo
Python PyPI 31 066 22 1 412 10 3 106
Java Maven
central
58 272 18 3 237 9 6 474
Ruby Gems.org 56 869 18 3 159 5 11 373
Node Npm 30471 4 7617 3 10 157
stats polled the 21st of May 2013
JavaScript is fun so node is funnier
21. Cost of I/O
I/O cycles
L1-cache 3
L2-cache 14
RAM 250
Disk 41 000 000
Network 240 000 000
http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop
26. - Event driven model
- Low levels I/O APIs rewritten
- Fat process
Node is designed to be non blocking from top to bottom.
29. The good parts for node
- Functionnal language : fits the event model
- Easily extensible : redesign of non blocking APIs,
DSLable
- Becomes popular : the language of the web
32. EcmaScript 5 + CommonJs + APIs:
- Cluster, Child_Process and Process
- Crypto
- Module, Domain, Events, Timers
- Assert, Utilities
- File System, Path, OS, VM
- HTTP, Net, URL, QueryString, etc.
- Net, DNS, UDP
- Buffer, Stream, STDIO, Readline, TTY
- REPL
nodejs.org/api
38. Required Hello Node.js world
var http = require("http");
http.createServer(function(request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(8888);
$ node hello_node_world.js
44. Async management
demo:lib/statpoller.js#124
var async = require('async');
var fs = require('fs');
async.filter(['file1','file2','file3'], fs.exists, function(results){
//results => [true, false, true]
});
function f1(cb){
fs.exists('dir1', function(result){
if(result === true){
cb(null, true);
} else {
cb(new Error('Oh crap!');
}
});
}
async.series([f1, f2], function(err, results){
// results => [true, true] or null
});
45. Futures and promises
var q = require('q'),
fs = require('fs');
var readFile = q.node(fs.readFile);
readFile('test.txt').then(function (data) {
console.log("finished");
}).then(function(){
console.log("do something else");
});
46. Events
demo:lib/statpoller.js#1
var events = require('events');
var Test = function(){
events.EventEmitter.call(this);
};
util.inherits(Test, events.EventEmitter);
Test.prototype.start = function(){
this.emit('started', { 'when' : new Date() });
};
var myTest = new Test();
myTest.on('started', function(data){
console.log("test started");
});
myTest.start();
47. Middleware
var app = {
stack : [],
use : function(middleware){
var fn = middleware;
if('function' === typeof middleware.handle){
fn = middleware.handle;
}
if('function' === typeof fn){
this.stack.push(fn);
}
},
handle : function(data){
var i = 0, layer;
for(i in this.stack){
layer = this.stack[i];
if(!layer(data)){
break;
}
}
}
};
49. Connect : HTTP middlewares
demo:app.js#20
var app = connect()
.use(connect.logger('dev'))
.use(connect.static('public'))
.use(function(req, res){
res.end('hello worldn');
})
.listen(3000);
50. Errors
try {
//something that crash
} catch(e) {
console.error(e);
};
function(cb){
if(error)
cb(new Error("Sorry..."));
} else {
cb(null, theData);
}
}
54. Cluster
demo:server.js
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
for (var i = 0; i > numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', function(worker, code, signal) {
//manage worker stop
});
} else {
//I'm in a fork
}
59. How ?
- Simple CLI tools
- Registry
- Web site
- Included in node.js since 0.6
- Git friendly
$ npm --help
registry.npmjs.org
npmjs.org
61. Usage
$ npm search bower
$ npm info bower
$ npm install -g bower
$ npm install --save socket.io
$ npm update
$ npm publish
63. Transitive dependencies
A-0.1 -> B-0.1, C-0.1
B-01 -> C-0.2
A-0.1
├── node_modules
│ ├── B-0.1
│ │ └── node_modules
│ │ └── C-0.2
│ └── C-0.1
└── package.json
64. npm is not capable of hatred. It loves everyone, especially you.
source
Why does npm hate me?
npm faq
74. Why Grunt?
- Wide numbers of plugins
- Simple to use
- Easy to customize
- 0.5 : will use the node-taskformat