An CommonJS AMD Packager in PHP
JavaScript PHP
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
lib
test
web
.gitignore
README.md
builddocs
loader.js
options.php
packager-cli.php

README.md

AMD Packager PHP

A Tool to optimize your AMD JavaScript Modules. It will find the dependencies and package it into one file.

CLI

packager-cli.php [options] <modules>

Options:
  -h --help             Show this help
  --options             Specify another options file (defaults to options.php)
  --has [features]      Features for the has() api. Example: `--has feature=0 ie=1`
  --require [modules]   Require these modules
  --exclude [modules]   Exclude these modues
  -o --output           The file the output should be written to
  --modules --list      List the modules
  --dependencies        List the dependencies map
  --graph               Create a structural dependency graph
                        and write it to this file
  --watch               Watches the required modules

Tip:

Add the following line to your ~/.bashrc file

alias packager-amd='~/path/to/amd-packager-php/packager-cli.php'

Now you can use the packager as:

packager-amd Package/Module1 Package/Module2 > myTools.js

Packager Class

API Docs

API documentation generated by phpdoc

Example


$packager = new Packager;

// Set baseurl

$packager->setBaseUrl(__DIR__ . '/../foo/bar');

// Add aliases

$packager->addAlias('Core', 'MooTools/Core');
$packager->addAlias('Tests', 'MooTools/Tests');

// Require. Returns a Packager_Builder instance

$builder = $packager->req(array('Core/DOM/Node', 'Tests/Host/Array'));

// reduce to a new set, or exclude modules
$builder->reduce(array('Tests/Host/Array'));
// soft exclude
$builder->exclude(array('Tests/Utility/typeOf'));
// forced exclude
$builder->excludeForced(array('Tests/Utility/typeOf'));

// Output

echo '/* These modules are loaded:';
echo implode("\n - ", $builder->modules());
echo "\n*/\n\n";

echo $builder->output();

Unit Tests

See the test folder. Run it with phpunit test for the PHP Packager. For the resulted JavaScript and the Loader.js you could open test/js/SpecRunner.html in your browser or run test/js/SpecRunner.js with Node.js.

Web Interface

The Web Interface of Packager Web has been ported to work with this packager. This means you can easily select the desired modules and build them in one or several files. The download also supports compressing of the JavaScript with YUI-compressor or UglifyJS. When the files are packaged per package, the download is provided as a ZIP file.

JavaScript Examples:

This are examples of your source files. You can already define an ID for the module, but that's not very useful. The dependencies argument can be relative paths to the other modules, or use the aliases.

Source/Storage.js: Only the factory function

define(function(){
    var storage = {};
    return {
        store: function(key, value){
            storage[key] = value;
            return this;
        },
        retrieve: function(key){
            return storage[key];
        }
    };
});

Source/App.js: With dependencies

define(['Core/Utility/typeOf', './Storage.js'], function(typeOf, Storage){
    Storage.store('foo', 'bar');
    alert(storage.retrieve('foo')); // bar
});

After that you can write a build script or use the CLI script. The packager will add an ID to each define() function an ID so when each define() is in the same file, everything continues to work. If the module already had an ID, it will not replace it.

Using has()

has.js is a great tool for feature detections and has a nice API which makes it easy to strip unnecessary code and which works on the client-side as well.

Example of using has()

define(function(){

    if (has('css-transitions')){
        // do something cool
    } else {
        // meh...
    }

});

Now if you know your script will only be used in modern browsers, the else code-branch is useless.

$packager = new Packager;
$builder = $packager->req(array('ModuleA', 'ModuleB'));

$builder->addHas('css-transitions', true);
$builder->output();

This will result in code like:

if (true){
    // do something cool
} else {
    // meh...
}

Minifiers, like UglifyJS or Google Closure Compiler, can remove dead-code branches like these. This will make your build perfectly optimized for your environment.

Analysis

With the --graph cli option, a dependency graph can be made. These can be generated to do some analysis on your modules and make better decisions.

Alternatively the Packager_Graph class in Graph.php can be used directly too. For this graph Graphviz is required.

Dependency Graph

Notes

This is not a full implementation of the AMD specification.

Some restrictions are:

  • It does not execute JavaScript, so the define function MUST be in the literal form. It also MUST use square brackets ([ and ]) for dependencies.

Requirements

  • PHP 5.2 (tested on 5.3, but should work on 5.2)
  • Graphviz (for the --graph option or Graph.php class)

To installation for graphviz is easy for debian(-like) systems with:

sudo apt-get install graphviz

For other systems you should look at the graphviz download page.

License

Just the MIT-License