Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JavaScript As A Platform: node.js, npm & grunt

JavaScript As A Platform: node.js, npm & grunt

Avatar for Bertrand CHEVRIER

Bertrand CHEVRIER

August 26, 2013
Tweet

Other Decks in Programming

Transcript

  1. About { " f i r s t N a

    m e " : " B e r t r a n d " , " l a s t N a m e " : " C h e v r i e r " , " o n l i n e " : { " t w i t t e r " : " @ k r a m p " , " g i t h u b " : " g i t h u b . c o m / k r a m p s t u d i o " , " b l o g " : " k r a m p s t u d i o . c o m " } , " p r o " : { " e m p l o y e r " : " C G I " , " p o s i t i o n " : " T e c h n i c a l e x p e r t " } , " l o v e s " : [ " J a v a S c r i p t " , " L i n u x " , " J a v a " , " P H P " ] }
  2. 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
  3. 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
  4. - Event driven model - Low levels I/O APIs rewritten

    - Fat process Node is designed to be non blocking from top to bottom.
  5. 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
  6. 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
  7. Modules Require m o d u l e . e

    x p o r t s = { / / y o u r o b j e c t } ; v a r f s = r e q u i r e ( ' f s ' ) ;
  8. Required Hello Node.js world v a r h t t

    p = r e q u i r e ( " h t t p " ) ; h t t p . c r e a t e S e r v e r ( f u n c t i o n ( r e q u e s t , r e s p o n s e ) { r e s p o n s e . w r i t e H e a d ( 2 0 0 , { " C o n t e n t - T y p e " : " t e x t / p l a i n " } ) ; r e s p o n s e . w r i t e ( " H e l l o W o r l d " ) ; r e s p o n s e . e n d ( ) ; } ) . l i s t e n ( 8 8 8 8 ) ; $ n o d e h e l l o _ n o d e _ w o r l d . j s
  9. Callbacks, Errorbacks demo:lib/poller/mem.js#32 f u n c t i o

    n a s y n c ( d a t a , c a l l b a c k ) { i f ( ! d a t a ) { c a l l b a c k ( n e w E r r o r ( ' E m p t y d a t a ' ) ) ; } / / d o s o m e t h i n g a n d t h e n c a l l b a c k ( n u l l , t r u e ) ; } ; a s y n c ( { d a t a : ' t e s t ' } , f u n c t i o n ( e r r , v a l i d ) { c o n s o l e . l o g ( " f i n i s h e d " ) ; } ) ;
  10. Callback tree demo:lib/poller/mem.js#32 h t t p . c r

    e a t e S e r v e r ( f u n c t i o n p r o c e s s R e q u e s t ( r e q u e s t , r e s p o n s e ) { f s . e x i s t s ( " / t m p / t e s t " , f u n c t i o n ( e x i s t s ) { i f ( e x i s t s = = = t r u e ) { f s . s t a t ( f i l e , f u n c t i o n ( e r r , s t a t ) { f s . a p p e n d F i l e ( f i l e , l o g , ' u t f 8 ' , f u n c t i o n ( e r r ) { d b . q u e r y ( f u n c t i o n ( e r r , d a t a ) { / / e t c . . . } ) ; } ) ; } ) ; } } ) ; }
  11. Async management demo:lib/statpoller.js#124 v a r a s y n

    c = r e q u i r e ( ' a s y n c ' ) ; v a r f s = r e q u i r e ( ' f s ' ) ; a s y n c . f i l t e r ( [ ' f i l e 1 ' , ' f i l e 2 ' , ' f i l e 3 ' ] , f s . e x i s t s , f u n c t i o n ( r e s u l t s ) { / / r e s u l t s = > [ t r u e , f a l s e , t r u e ] } ) ; f u n c t i o n f 1 ( c b ) { f s . e x i s t s ( ' d i r 1 ' , f u n c t i o n ( r e s u l t ) { i f ( r e s u l t = = = t r u e ) { c b ( n u l l , t r u e ) ; } e l s e { c b ( n e w E r r o r ( ' O h c r a p ! ' ) ; } } ) ; } a s y n c . s e r i e s ( [ f 1 , f 2 ] , f u n c t i o n ( e r r , r e s u l t s ) { / / r e s u l t s = > [ t r u e , t r u e ] o r n u l l } ) ;
  12. Futures and promises v a r q = r e

    q u i r e ( ' q ' ) , f s = r e q u i r e ( ' f s ' ) ; v a r r e a d F i l e = q . n o d e ( f s . r e a d F i l e ) ; r e a d F i l e ( ' t e s t . t x t ' ) . t h e n ( f u n c t i o n ( d a t a ) { c o n s o l e . l o g ( " f i n i s h e d " ) ; } ) . t h e n ( f u n c t i o n ( ) { c o n s o l e . l o g ( " d o s o m e t h i n g e l s e " ) ; } ) ;
  13. Events demo:lib/statpoller.js#1 v a r e v e n t

    s = r e q u i r e ( ' e v e n t s ' ) ; v a r T e s t = f u n c t i o n ( ) { e v e n t s . E v e n t E m i t t e r . c a l l ( t h i s ) ; } ; u t i l . i n h e r i t s ( T e s t , e v e n t s . E v e n t E m i t t e r ) ; T e s t . p r o t o t y p e . s t a r t = f u n c t i o n ( ) { t h i s . e m i t ( ' s t a r t e d ' , { ' w h e n ' : n e w D a t e ( ) } ) ; } ; v a r m y T e s t = n e w T e s t ( ) ; m y T e s t . o n ( ' s t a r t e d ' , f u n c t i o n ( d a t a ) { c o n s o l e . l o g ( " t e s t s t a r t e d " ) ; } ) ; m y T e s t . s t a r t ( ) ;
  14. Middleware v a r a p p = { s

    t a c k : [ ] , u s e : f u n c t i o n ( m i d d l e w a r e ) { v a r f n = m i d d l e w a r e ; i f ( ' f u n c t i o n ' = = = t y p e o f m i d d l e w a r e . h a n d l e ) { f n = m i d d l e w a r e . h a n d l e ; } i f ( ' f u n c t i o n ' = = = t y p e o f f n ) { t h i s . s t a c k . p u s h ( f n ) ; } } , h a n d l e : f u n c t i o n ( d a t a ) { v a r i = 0 , l a y e r ; f o r ( i i n t h i s . s t a c k ) { l a y e r = t h i s . s t a c k [ i ] ; i f ( ! l a y e r ( d a t a ) ) { b r e a k ; } } } } ;
  15. a p p . u s e ( f u

    n c t i o n ( d a t a ) { c o n s o l e . l o g ( " H e l l o % s " , d a t a ) ; r e t u r n t r u e ; } ) ; a p p . u s e ( f u n c t i o n ( d a t a ) { c o n s o l e . e r r o r ( " G o o d b y e % s " , d a t a ) ; r e t u r n f a l s e ; } ) ; a p p . h a n d l e ( ' m i d d l e w a r e ' ) ;
  16. Connect : HTTP middlewares demo:app.js#20 v a r a p

    p = c o n n e c t ( ) . u s e ( c o n n e c t . l o g g e r ( ' d e v ' ) ) . u s e ( c o n n e c t . s t a t i c ( ' p u b l i c ' ) ) . u s e ( f u n c t i o n ( r e q , r e s ) { r e s . e n d ( ' h e l l o w o r l d \ n ' ) ; } ) . l i s t e n ( 3 0 0 0 ) ;
  17. Errors t r y { / / s o m

    e t h i n g t h a t c r a s h } c a t c h ( e ) { c o n s o l e . e r r o r ( e ) ; } ; f u n c t i o n ( c b ) { i f ( e r r o r ) c b ( n e w E r r o r ( " S o r r y . . . " ) ) ; } e l s e { c b ( n u l l , t h e D a t a ) ; } }
  18. demo:lib/statpoller.js#63 m y E m i t t e r

    . o n ( ' e r r o r ' , f u n c t i o n ( e ) { c o n s o l e . e r r o r ( e . s t a c k ) ; } ) ; v a r a D o m a i n = d o m a i n . c r e a t e ( ) ; a D o m a i n . o n ( ' e r r o r ' , f u n c t i o n ( e r r ) { / / d o w a f y w w i t h t h e e r r } ) ; a D o m a i n . r u n ( f u n c t i o n ( ) { / / d o s o m e e r r o r a b l e s t u f f s ( t h r o w s , e r r b a c k s , e t c . a r e c a t c h e d ) } ) ;
  19. Cluster demo:server.js v a r c l u s t

    e r = r e q u i r e ( ' c l u s t e r ' ) ; v a r h t t p = r e q u i r e ( ' h t t p ' ) ; v a r n u m C P U s = r e q u i r e ( ' o s ' ) . c p u s ( ) . l e n g t h ; i f ( c l u s t e r . i s M a s t e r ) { f o r ( v a r i = 0 ; i > n u m C P U s ; i + + ) { c l u s t e r . f o r k ( ) ; } c l u s t e r . o n ( ' e x i t ' , f u n c t i o n ( w o r k e r , c o d e , s i g n a l ) { / / m a n a g e w o r k e r s t o p } ) ; } e l s e { / / I ' m i n a f o r k }
  20. How ? - Simple CLI tools - Registry - Web

    site - Included in node.js since 0.6 - Git friendly $ n p m - - h e l p registry.npmjs.org npmjs.org
  21. Module Metas p a c k a g e .

    j s o n { " n a m e " : " n o d e - h t o p " , " v e r s i o n " : " 0 . 1 . 0 " , " d e s c r i p t i o n " : " W e b h t o p l i k e " , " m a i n " : " a p p . j s " , " s c r i p t s " : { " t e s t " : " g r u n t t e s t " } , " d e p e n d e n c i e s " : { " e x p r e s s " : " 3 . 2 . x " , " s o c k e t . i o " : " 0 . 9 . x " , " u n d e r s c o r e " : " ~ 1 . 4 . 0 " } } demo package.json
  22. Usage $ n p m s e a r c

    h b o w e r $ n p m i n f o b o w e r $ n p m i n s t a l l - g b o w e r $ n p m i n s t a l l - - s a v e s o c k e t . i o $ n p m u p d a t e $ n p m p u b l i s h
  23. Scopes g l o b a l - > u

    s e r - > p r o j e c t
  24. Transitive dependencies A - 0 . 1 - > B

    - 0 . 1 , C - 0 . 1 B - 0 1 - > C - 0 . 2 A - 0 . 1 ├ ─ ─ n o d e _ m o d u l e s │ ├ ─ ─ B - 0 . 1 │ │ └ ─ ─ n o d e _ m o d u l e s │ │ └ ─ ─ C - 0 . 2 │ └ ─ ─ C - 0 . 1 └ ─ ─ p a c k a g e . j s o n
  25. npm is not capable of hatred. It loves everyone, especially

    you. source Why does npm hate me? npm faq
  26. Defects - Young project - Libraries hell - Error management

    - Monoculture - Noob friendly - Devops required
  27. Automate your projects - Task based - By configuration G

    r u n t f i l e . j s - NPM friendly - Extensible by nature
  28. Why Grunt? - Wide numbers of plugins - Simple to

    use - Easy to customize - 0.5 : will use the n o d e - t a s k format