Skip to content
/ js-loader Public

A small module to dynamically load Javascript source

License

Notifications You must be signed in to change notification settings

ogus/js-loader

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

JsLoader

JsLoader is a small, fast, simple module that helps loading Javascript source in a browser environment

Why ?

This module is certainly a must-have in any of these situations:

  • You need to load new JS source at runtime
  • You have a lot of JS dependencies, but you are tired of writing billions of <script> tag in your .html header
  • You want to use a single JS file to load other JS source before computing everything

Moreover, it has the following features:

  • It is small: ~2.3 Ko for the non-minified version
  • It is fast: straighforward implementation && no external dependencies
  • It is easy to use: modular input arguments easily configurable
  • It is browser-friendly: both ES5 && ES6 version available

Installation

Step 1

You can clone the repository & include the js-loader.js file in your project:

git clone https://github.com/ogus/js-loader.git

Alternatively, you can import it from a Gist file (not yet)

Step 2

Then import the module as the first <script> tag of your HTML

<script src="path/to/js-loader.js"></script>

Usage

// load a JS file from a URL
JsLoader.load("http://url/to/some/code.js");

// load a JS file from a relative path
JsLoader.load("../path/to/script");

// load many files, in many directories
JsLoader.load({
  "dir1/": ["file1", "file2", "file3"],
  "dir2/": {
    ".": "hello",
    "sub/": [ "foo", "bar", "subsub/script"]
  }
}).then(function () {
  // Callback that let you wait for loading completion !
});

API

The script provides a global static class JsLoader, with two public methods.

The JsLoader.load(args) function allows to load JS files passed as arguments. and

The JsLoader.require(script) function allows to require a script instantly. that has been previously loaded, and return it. If the script has not been loaded yet, it will be loaded synchronously.

JsLoader.load(args)

Allows to load JS files passed as arguments.

Return either a Promise (default) or a context (ES5) that can be used for chain execution when all JS source are loaded with the function then()

JsLoader.load(...).then(function () {
  // all scripts are loaded
});

JsLoader.require(src)

Allows to require a script.

If it has been previously loaded return it instantly, or else it will be loaded synchronously.

Input args

The structure of the input arguments has been made as flexible as possible.

You can use a String, an Array, an Object with keys as directory name, or a mix of all of this argument types.

Note: The .js extension will automatically be added to any script if it is missing (so you can save up to 0.017s of your precious time).

String

args can be a String that describes the path to a local file, or the url to a remote file.

JsLoader.load("http://url/to/some/code.js");

JsLoader.load("path/to/script");  // load 'path/to/script.js'

Array

args can be an Array structure that list all JS source files.

JsLoader.load(["./file1", "./src/file2"]);

JsLoader.load([
  "directory/file1.js",
  "https://url/to/secure/script.js",
  "../directory/relative/to/html/foobar.js"
]);

Object

args can be a JSON-like structure. Each keys of the object is used as a sub-directory name, and each value is used as a file name.

This can avoid writing repetitively the path to a directory containing several scripts.

JsLoader.load({
  "src/": {
    "foo/": "file.js",    // load "src/foo/file.js"
    "bar/": "file2"       // load "src/bar/file2.js"
  },
  "buzz/": "lightning.js" // load "buzz/lightning.js"
});

There is also two specific Object keys, with special properties : . and ?

Reserved Object key: .

The . key is used to indicate the current directory in the file tree.

JsLoader.load({
  "directory/": {
    ".": "file.js",    // load "directory/file.js"
    "bar/": "file2"    // load "directory/bar/file2.js"
  }
});

Reserved Object key: ?

The ? key is used to define the configuration for a JS source file.

When this key appears in the file tree structure, the value is expected to be a single Object. The loader will looks for the following parameters:

  • src: String, path to the file (relative to the file tree) REQUIRED
  • id: String, ID of the file. Useful to require() it later
  • cache: Boolean, set to false to disable cache storage (default: true)
  • async: Boolean, set to true to enable async script loading (default: false)
  • type: String, the MIME type of the file (default: "text/javascript")
JsLoader.load({
  "directory/": {
    "foo/": "file.js",
    "?": {src: "bar/file2.js", async: false}, // load "directory/bar/file2.js" synchronously
    "buzz/": {
      "?" : {
        src: "path/to/lightning",  // load "buzz/path/to/lightning.js"
        id: "light",               // as "light"
        cache: false               // without cache storage
      }
    }
  }
});

Mixin

You can also mix any of the previous data structures !

Load an Array of Objects:

JsLoader.load([
  "http://": ["url/script", "other/url/script.min"],
  "dir/": [
    "foo", {
      "bar/": {
        "bob",
        {"?": "bobby", src: "bobby", async: false}
      }
    }
  ],
  "ok.js"
]);
/*
Loads 6 files:
http://url/script.js, http://other/url/script.min.js,
dir/foo.js, dir/bar/bob.js, dir/bar/bobby.js (as 'bobby'),
ok.js
*/

Load a complicated Object:

JsLoader.load({
  "pika/": ["file1", "file2", "file3"],
  "loop/": {
    ".": "hello.js",
    "child/": [
      "foo",
      "bar",
      {
        "gadget/": "far_away"
      }
    ]
  },
  "letters/": ["a", "b", ["d", "e"], "f": ["g", "h"]]
});
/*
Loads 15 files:
pika/file1.js, pika/file2.js, pika/file3.js,
loop/hello.js, loop/child/foo.js,
loop/child/bar.js, loop/child/gadget/far_way.js,
letters/a.js, letters/b.js, letters/c.js, letters/d.js,
letters/e.js, letters/f/g.js, letters/f/h.js
*/

An Array inside another Array does not add sub-directories. You might never use it, but who knows...

License

This project is licensed under the WTFPL - see LICENSE for more details

About

A small module to dynamically load Javascript source

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published