requirejs javascript modules for the browser by ben keith
play

RequireJS Javascript Modules for the Browser By Ben Keith Quoin, - PowerPoint PPT Presentation

RequireJS Javascript Modules for the Browser By Ben Keith Quoin, Inc. Traditional Browser JS One global namespace Often inline JS code embedded directly in HTML Many <script> tags with hidden ordering dependencies Very


  1. RequireJS – Javascript Modules for the Browser By Ben Keith Quoin, Inc.

  2. Traditional Browser JS ● One global namespace ● Often inline JS code embedded directly in HTML ● Many <script> tags with hidden ordering dependencies ● Very often sphagetti code ● OK only for very simple pages

  3. Improvements ● Script loaders/bundlers (e.g. head.js, LABjs, Rails assets) – Eliminate a lot of manual <script> tags – Make dependencies explicit – But still require external determination of dependencies ● Single app object in global namespace – Split up related code into JS classes – Separated script files (not modules) ● Better but doesn't scale well to large apps

  4. CommonJS Modules ● Otherwise plain JS files that have an e object x p o r t s ● Use r to load other modules e q u i r e ( ' m o d u l e _ n a m e ' ) Synchronous function (proposal exists to add async) – is a path (.js extension optional) to search for in any of the – m o d u l e _ n a m e configured path dirs # c o n f i g . j s v a r f s = r e q u i r e ( ' f s ' ) ; e x p o r t s . r e a d C o n f i g = f u n c t i o n ( c a l l b a c k ) { r e t u r n f s . r e a d F i l e ( ' m y - c o n f i g . j s o n ' , ' u t f 8 ' , c a l l b a c k ) ; } ; # a p p . j s v a r c o n f i g = r e q u i r e ( ' . / c o n f i g ' ) ; c o n f i g . r e a d C o n f i g ( f u n c t i o n ( e r r , d a t a ) { … } ) ;

  5. AMD ● Asynchronous Module Definitions (AMD) wrapper – d e f i n e – potentially asynchronously loaded dependencies # c o n f i g . j s d e f i n e ( [ ' f s ' ] , f u n c t i o n ( f s ) { r e t u r n { r e a d C o n f i g : f u n c t i o n ( c a l l b a c k ) { r e t u r n f s . r e a d F i l e ( ' m y - c o n f i g . j s o n ' , ' u t f 8 ' , c a l l b a c k ) ; } ; } ; } ) ; # a p p . j s d e f i n e ( [ ' c o n f i g ' ] , f u n c t i o n ( c o n f i g ) { c o n f i g . r e a d C o n f i g ( f u n c t i o n ( e r r , d a t a ) { … } ) ; } ) ;

  6. CommonJS Style with AMD ● RequireJS allows the use of CommonJS requires – Optimizer parses source and recognizes deps # c o n f i g . j s d e f i n e ( f u n c t i o n ( r e q u i r e ) { v a r f s = r e q u i r e ( ' f s ' ) ; r e t u r n { r e a d C o n f i g : f u n c t i o n ( c a l l b a c k ) { r e t u r n f s . r e a d F i l e ( ' m y - c o n f i g . j s o n ' , ' u t f 8 ' , c a l l b a c k ) ; } ; } ; } ) ; # a p p . j s d e f i n e ( [ ' c o n f i g ' ] , f u n c t i o n ( c o n f i g ) { c o n f i g . r e a d C o n f i g ( f u n c t i o n ( e r r , d a t a ) { … } ) ; } ) ;

  7. RequireJS ● Most widely-used AMD implementation ● Script that runs in browser to load, link and execute modules ● Can load modules async in the browser – Useful for dev – Or incremental loading of large applications

  8. Optimizer (r.js) ● Bundles multiple modules into one file – multiple bundles (ex. one file for slowly changing dependencies and one for application code) ● Recommended approach – Much greater performance for large projects ● Reduces requests on page load – Error handling for anonymous async script loading is flaky on IE ● Very powerful and flexible – Configuration can get confusing at times

  9. Examples

  10. Advanced Features ● Pragmas (similar to # s in C preprocessor) i f d e f ● Bundle text files (e.g. templates) ● Load CommonJS modules ● Multiversion support

  11. Almond ● Minimalistic AMD implementation for the browser ● Very small (1k minified+gzip) – vs. fully RequireJS script (6.2k minified+gzip) ● Cannot load remote scripts – Everything must be pre-built and loaded in script tags

  12. Bower ● Downloads JS dependencies ● Uses a declaritive config file (bower.json) – Tell it what scripts you want by name – Tell it where to download them to ● Similar to NPM but targeted towards browser scripts ● NPM is increasingly used as a manager for front- end scripts – but Bower is still very widely used

  13. Alternatives: Browserify ● First popular implementation of CommonJS in the browser – Fairly new, but gaining momentum ● Useful for sharing code between NodeJS and browser – Potentially useful if your backend is in Node ● e.g. sharing validation code between front and back end ● Always requires a backend build to generate a usable script ● Uses NPM to download scripts – But still has same issue as RequireJS with non-AMD/CommonJS scripts ● Plugin available to do lazy loading (not very pretty)

  14. Alternatives: Webpack ● r.js optimizer replacement ● Supports both AMD and CommonJS ● Bundle everything – CSS – (small) images – templates

  15. The Future of JS Modules ● ECMAScript 6 (ES6) features native module support ● Details still tentative # c o n f i g . j s i m p o r t r e a d F i l e f r o m ' f s ' ; e x p o r t f u n c t i o n r e a d C o n f i g ( c a l l b a c k ) { r e t u r n r e a d F i l e ( ' m y - c o n f i g . j s o n ' , ' u t f 8 ' , c a l l b a c k ) ; } # a p p . j s i m p o r t r e a d C o n f i g f r o m ' c o n f i g ' ; r e a d C o n f i g ( f u n c t i o n ( e r r , d a t a ) { … } ) ;

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend