npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

sourcemint-loader-js

v0.3.7

Published

Downloads

15

Readme

Optimized PINF/CommonJS Loader for JavaScript

Status: ALPHA

The Sourcemint JavaScript Loader is an optimized (intended for production use) CommonJS package mappings based JavaScript module loader for the browser in only 1258 bytes (minified and zipped).

Demo: sourcemint.github.com/loader-js/workspace/www

What

The Sourcemint JavaScript Loader provides a minimal CommonJS environment that requests optimized static JavaScript code files called Bundles from a server via GET requests and boots these into sandboxes in the browser identified by the requested URL.

Supported Environments:

Supported features:

  • Load bundled JavaScript programs from static URLs
  • Asynchronously load more program code bundles as needed
  • Load bundles cross-domain
  • Isolated module scopes
  • Isolated package namespaces
  • Isolated sandbox namespaces
  • Nested and circular dependency trees
  • Consistent mapping of static application resource URLs to loader namespaces
  • CommonJS/Modues/1.1
    • function(require, exports, module) {}
    • var ModuleAPI = require("./Module")
  • CommonJS/Packages/Mappings/C (proposal)
    • package.json ~ {mappings:{"PackageAlias": "PackageIdentifier"}}
    • var ModuleAPI = require("PackageAlias/Module")
  • CommonJS/Modues/2.0draft8 (draft)
    • global.require.memoize("PackageIdentifier/ModuleIdentifier", ModuleInitializer) (no dependency argument)
    • require.id(ModuleIdentifierString) (returns PackageIdentifier/ModuleIdentifier)
  • (Un)CommonJS(kriskowal)/Modules
    • require.async(ModuleIdentifierString, function loaded(ModuleAPI) {}, function error(e) {})
  • Proposed:
    • [global.]require.sandbox(SandboxURI, function loaded(sandbox) {}, SandboxOptions)
    • [global.]require.sandbox.id to hold SandboxURI
    • sandbox.main()
    • require.bundle("BundleIdentifier", function ConsistentModuleSet(require) {})

Applications may be coded directly in the bundle format. Alternatively the bundle format may be treated as a compile target. The following tools can generate Sourcemint JavaScript Loader compatible bundles:

Why

Namespace isolation is essential for modular development when integrating arbitrary JavaScript libraries.

To achieve namespace isolation you need JavaScript libraries written in conventions that:

  • do not pollute the global namespace and
  • expose the library's API consistently

There are two evolving standards that specify such conventions:

When coding using these standards you need to keep in mind the two primary environments that the application will run in:

  1. Development - Needs a loader that will, on demand, locate in the source tree, assemble and transport module source files to the browser for rapid development.

  2. Production - Needs a build step that collects modules from the source tree and generates static optimized bundles that will be fetched by a loader optimized for production runtime performance.

The Sourcemint JavaScript Loader is intended to run your application in production.

Usage

http://localhost/index.html

<script type="text/javascript" src="loader.js"></script>
<script type="text/javascript">
	require.sandbox("app.js", function(sandbox)
	{
		sandbox.main();
	});
</script>

http://localhost/app.js

require.bundle("", function(require)
{
	require.memoize("/main.js", function(require, exports, module)
	{
		exports.main = function(options)
		{
			console.log("HelloWorld!");
		}
	});
});

For more examples see: github.com/sourcemint/loader-js/tree/master/examples

Tips

  • When testing an application use the ./loader.js file to get all error messages.
  • When deploying an application us the ./loader.min.gz file for optimum performance.
  • When using a different loader during development make sure only supported API features of this loader are used. Load extra features along with your application by augmenting a sandbox.
  • When writing or generating bundles make sure one consistent set of statically linked modules is contained in each bundle file. Dynamic links to other modules or bundles must be made via require.async() or require.sandbox() respectively. The hierarchy of how your application nests these dynamic links will determine which modules must be included in subsequently loaded bundles to avoid sending the same modules twice.
  • A module can only be memoized once for each Canonical Identifier (comprising of SandboxIdentifier/PackageIdentifier/ModuleIdentifier). When placing modules into bundles make sure bundle filenames do not overlap with module filenames (and the reverse) as these have the potential to conflict (modules and bundles share the same logical file hierarchy). The idea is that a set of statically linked modules can always be combined into one file which is placed into the file that first requires the dependencies and represents the entry point into the bundle.

FAQ

Why does the loader not support feature X?

This loader is pretty much complete in terms of what needs to be implemented at the core loader level. Convenience features can be loaded along with the application by augmenting a sandbox.

Why does the loader not support AMD-style Loader Plugins?

Because loader plugins that are invoked by modifying the string literal passed to require() are not necessary and combine two concepts that should really be separate and implemented differently. For more information see this discussion.

The AMD-style Loader Plugins can be replaced by:

  • Augmenting a sandbox
  • Loading helper modules within the application.
  • Using a loader that can run package-declared plugins.
  • Using a server helper to run plugins as modules are requested.

An AMD compatibility plugin that aguments a sandbox for AMD support is planned.

How does the loader compare to almond?

While the RequireJS + almond combination focuses on loading of optimized AMD formatted modules this loader focuses on loading of optimized CJS formatted modules.

The AMD Specification is a small subset combining several CommonJS Concepts in a different form.

CommonJS represents a more pure and modular approach to devising arbitrary JavaScript application architectures by carefully layering a few core concepts into a framework that provides one small existential foundation for all other concepts. It allows for isolated namespaces, nested package dependency structures and runtime sandboxes as well as automatic conversion from source trees to optimized bundles. This loader is one existential foundation implementation and fully compatible with the CommonJS Concepts.

In contrast RequireJS + almond focuses on optimally loading (primarily into the browser) a list of packages containing JavaScript modules and resource files into a single namespace. In optimized form (for almond), several key RequireJS features are not supported.

Links

Discussions:

Influential Specifications:

Prior Art:

  • https://github.com/unscriptable/curl
  • https://github.com/jrburke/almond
  • https://github.com/jrburke/requirejs
  • http://code.google.com/p/bravojs/
  • https://github.com/NobleJS/Noble-Modules
  • https://github.com/pinf/loader-js
  • https://github.com/kriszyp/nodules

Contribute

To work on the loader use the ./workspace/ (Development Workspace). Instructions on how to launch it on your local system can be found here: https://github.com/sourcemint/loader-js/tree/master/workspace

When done send a pull request.