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

@ambers/amdefine

v1.0.2

Published

Provide AMD's define() API for declaring modules in the AMD format

Downloads

13

Readme

amdefine

A module that can be used to implement AMD's define() in Node. This allows you to code to the AMD API and have the module work in node programs without requiring those other programs to use AMD.

Usage

1) Update your package.json to indicate amdefine as a dependency:

    "dependencies": {
        "amdefine": ">=0.1.0"
    }

Then run npm install to get amdefine into your project.

2) At the top of each module that uses define(), place this code:

if (typeof define !== 'function') { var define = require('amdefine')(module) }

Only use these snippets when loading amdefine. If you preserve the basic structure, with the braces, it will be stripped out when using the RequireJS optimizer.

You can add spaces, line breaks and even require amdefine with a local path, but keep the rest of the structure to get the stripping behavior.

As you may know, because if statements in JavaScript don't have their own scope, the var declaration in the above snippet is made whether the if expression is truthy or not. If RequireJS is loaded then the declaration is superfluous because define is already already declared in the same scope in RequireJS. Fortunately JavaScript handles multiple var declarations of the same variable in the same scope gracefully.

If you want to deliver amdefine.js with your code rather than specifying it as a dependency with npm, then just download the latest release and refer to it using a relative path:

Latest Version

amdefine/intercept

Consider this very experimental.

Instead of pasting the piece of text for the amdefine setup of a define variable in each module you create or consume, you can use amdefine/intercept instead. It will automatically insert the above snippet in each .js file loaded by Node.

Warning: you should only use this if you are creating an application that is consuming AMD style defined()'d modules that are distributed via npm and want to run that code in Node.

For library code where you are not sure if it will be used by others in Node or in the browser, then explicitly depending on amdefine and placing the code snippet above is suggested path, instead of using amdefine/intercept. The intercept module affects all .js files loaded in the Node app, and it is inconsiderate to modify global state like that unless you are also controlling the top level app.

Why distribute AMD-style modules via npm?

npm has a lot of weaknesses for front-end use (installed layout is not great, should have better support for the `baseUrl + moduleID + '.js' style of loading, single file JS installs), but some people want a JS package manager and are willing to live with those constraints. If that is you, but still want to author in AMD style modules to get dynamic require([]), better direct source usage and powerful loader plugin support in the browser, then this tool can help.

amdefine/intercept usage

Just require it in your top level app module (for example index.js, server.js):

require('amdefine/intercept');

The module does not return a value, so no need to assign the result to a local variable.

Then just require() code as you normally would with Node's require(). Any .js loaded after the intercept require will have the amdefine check injected in the .js source as it is loaded. It does not modify the source on disk, just prepends some content to the text of the module as it is loaded by Node.

How amdefine/intercept works

It overrides the Module._extensions['.js'] in Node to automatically prepend the amdefine snippet above. So, it will affect any .js file loaded by your app.

define() usage

It is best if you use the anonymous forms of define() in your module:

define(function (require) {
    var dependency = require('dependency');
});

or

define(['dependency'], function (dependency) {

});

RequireJS optimizer integration.

Version 1.0.3 of the RequireJS optimizer will have support for stripping the if (typeof define !== 'function') check mentioned above, so you can include this snippet for code that runs in the browser, but avoid taking the cost of the if() statement once the code is optimized for deployment.

Node 0.4 Support

If you want to support Node 0.4, then add require as the second parameter to amdefine:

//Only if you want Node 0.4. If using 0.5 or later, use the above snippet.
if (typeof define !== 'function') { var define = require('amdefine')(module, require) }

Limitations

Synchronous vs Asynchronous

amdefine creates a define() function that is callable by your code. It will execute and trace dependencies and call the factory function synchronously, to keep the behavior in line with Node's synchronous dependency tracing.

The exception: calling AMD's callback-style require() from inside a factory function. Then require and the callback is called on process.nextTick():

define(function (require) {
    require(['a'], function(a) {
        //both 'a' is loaded, and this callback is called
        //on process.nextTick().
    });
});

Loader Plugins

Loader plugins are supported as long as they call their load() callbacks synchronously. So ones that do network requests will not work. However plugins like text can load text files locally.

The plugin API's load.fromText() is not supported in amdefine, so this means transpiler plugins like the CoffeeScript loader plugin will not work. This may be fixable, but it is a bit complex, and I do not have enough node-fu to figure it out yet. See the source for amdefine.js if you want to get an idea of the issues involved.

Tests

To run the tests, cd to tests and run:

node all.js
node all-intercept.js

License

New BSD and MIT. Check the LICENSE file for all the details.