All Projects โ†’ rstacruz โ†’ Pre.js

rstacruz / Pre.js

Efficient, resilient resource preloader for JS/CSS

Programming Languages

javascript
184084 projects - #8 most used programming language

๐Ÿ™Œ Thanks for the support! This package is no longer maintained. For your async JS/CSS loading needs, I suggest looking at one of the following alternatives:

โ€” Rico (@rstacruz)


pre.js

Use pre.js to load your JS and CSS files efficiently. Perfect for mobile apps and sites where 3G can often fail.

  • Petite: only 2.5kb gzipped.
  • Resilient: Auto-retries downloads when they fail.
  • Efficient: Downloads files in parallel.

Status

Pre()
  .retries(10)
  .css('/assets/app.css')
  .js('http://www.google.com/jsapi', function() { return window.google; })
  .js('/assets/app.js', function() { return window.App; })
  .then({
    App.start();
  });

Usage

Use index.min.js.

pre.js is available via [bower] and [npm].

$ bower install --save pre-js
$ npm install --save pre-js

npm version [bower]: http://bower.io/search/?q=pre-js [npm]: https://www.npmjs.org/package/pre-js

Recommended use

Create a file like load.js, which contains pre.js and your loader code. Use whatever build tool you prefer to do this for you. This gets you a small <4kb loader you can use as a "gateway" to the rest of your app.

With Webpack or Browserify, it probably will be like this:

/* load.js */
var Pre = require('pre-js');
Pre()
  .css('/assets/app.css')
  .js ('/assets/vendor.js', function() { return window.jQuery; })
  .js ('/assets/app.js',    function() { return window.App; })
  .then({
    App.start();
  });

API reference

Here's a quick reference of the API:

Pre()
  /*
   * sets the maximum number of retries before giving up.
   */
  .retries(10)

  /*
   * loads JavaScript assets. if the function returns a falsy value, it's
   * assumed that the loading failed, and will try again.
   */
  .js('/assets/jquery.js', function() { return window.jQuery; })
  .js('http://www.google.com/jsapi', function() { return window.google; })
  .js('/vendor.js', function() { return window.jQuery; })
  .js('/app.js', function() { return window.App; })

  /*
   * defines callbacks to execute.
   * these will run after the immediately-preceding `.js` or `.css` file is
   * loaded. you can use as many .then() blocks as you like, inserted at
   * different points.
   */
  .then(function() {
    google.api.load('maps');
    App.start();
  })

  /*
   * loads CSS files.
   */
  .css('http://google.com/fonts?f=Roboto:300')
  .css('/assets/application.css')

  /*
   * preloads assets (like images and fonts).
   */
  .asset('/assets/image.jpg')
  .asset('/assets/font.woff')

  /*
   * reports progress.
   */
  .on('progress', function(e) {
    document.getElementById('progress').style.width = '' + e.percent*100 + '%';
    console.log("Loaded %s (%s of %s files loaded)", e.file, e.loaded, e.total);
  })

  /*
   * reports retries and failures when they happen.
   */
  .on('retry', function (e) {
    console.warn("Failed to fetch %s, retrying", e.uri);
  })
  .on('fail', function (e) {
    console.warn("Failed to load %s", e.uri);
  })

  /*
   * Conditionals: runs the function block if `condition` is true.
   */
  .if(condition, function (pre) {
    pre.js('...');
  })

Conditional loading

Simple:

Pre()
  .js(window.JSON || 'json2.js',
      function() { return window.JSON; })
  .js(oldie ? 'jquery-1.9.js' : 'jquery-2.1.js',
      function() { return window.jQuery; })

For more complicated things:

Pre()
  .if(env === 'development', function (pre) {
    pre
      .js('livereload.js')
      .js('weinre.js')
    })

CoffeeScript

Better with CoffeeScript, if that's your thing:

Pre()
  .css 'style.css'
  .js  'jquery.js', -> jQuery?
  .js  'app.js',    -> App?
  .then -> App.start()

Pre()

creates a resource loader. This is registered as window.Pre.

Pre()
  .js('jquery.js', function() { ... })

When pre.js is loaded via CommonJS, this is the object that's returned by the module.

var Pre = require('pre-js');
Pre()
  .js('jquery.js', function() { ... })

asset()

asset(uri)

registers an asset to preload. This usually refers to an image or a font.

pre()
  .asset('/images/logo.jpg')

js()

js(uri, fn)

loads a JavaScript resource from uri. A check function fn may be supplied to check if the thing loaded properly.

pre()
  .js('jquery.js', function () { return jQuery; })

if()

if(condition, fn)

runs fn if condition is met. The instance of Pre will be passed onto the function for convenience.

Pre()
  .if(navigator.userAgent.match(/iOS/), function (Pre) {
    Pre.js('...');
  })

css()

css(uri)

loads a CSS file from uri.

pre()
  .css('/css/style.css')

add()

(internal)

retries()

retries(n)

Sets the maximum number of retries to n.

pre()
  .retries(4)
  .retryDelay(5000)
  .js('/app.js')

retryDelay()

retryDelay(ms)

Sets the retry delay to ms milliseconds. When a resource fails to load, pre.js will wait for this much time before retrying.

Defaults to 5000 miliseconds. See retries() for an example.

then()

then(fn)

registers a success callback function for the previous asset.

pre()
  .js('/app.js')
  .then(function() { ... })

on()

on(event, fn)

registers a callback. event can either be progress or retry.

pre()
  .js('/app.js')
  .on('retry', function (e) {
    console.warn("Failed to fetch %s, retrying", e.uri);
  })
  .on('fail', function (e) {
    console.warn("Failed to load %s", e.uri);
  })

Thanks

pre.js ยฉ 2014+, Rico Sta. Cruz. Released under the MIT License.
Authored and maintained by Rico Sta. Cruz with help from contributors.

Includes code from yepnope.js, released under WTFPL. ยฉ 2012 Alex Sexton & Ralph Holzmann.

ricostacruz.com  ยท  GitHub @rstacruz  ยท  Twitter @rstacruz

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].