# Writing CasperJS modules

As of 1.1, CasperJS relies on PhantomJS’ native `require()` function internally though it had to be patched in order to allow requiring casper modules using their full name, eg. `require('casper')`.

So if you plan to write your own modules and use casperjs’ ones from them, be sure to call the `patchRequire()` function:

    // my module, stored in universe.js
    // patching phantomjs' require()
    var require = patchRequire(require);

    // now you're ready to go
    var utils = require('utils');
    var magic = 42;
    exports.answer = function() {
        return utils.format("it's %d", magic);
    };

Warning

When using CoffeeScript `global.require` must be passed to `patchRequire()` instead of just `require`:

    require = patchRequire global.require

    utils = require 'utils'
    magic = 42
    exports.answer = ->
      utils.format "it's ${magic}"

From your root casper script:

    var universe = require('./universe');
    console.log(universe.answer()); // prints "It's 42"

New in version 1.1..

Hint

CasperJS allows using nodejs modules installed through npm. Note that since CasperJS uses it’s own JavaScript environment, npm modules that use node-specific features will not work under CasperJS.

As an example, let’s install the underscore library:

    $ npm install underscore

Then, `require` it like you would with any other nodejs compliant module:

    //npm-underscore-test.js
    var _ = require('underscore');
    var casper = require('casper').create();
    var urls = _.uniq([
      'http://google.com/',
      'http://docs.casperjs.org/',
      'http://google.com/'
    ]);

    casper.start().eachThen(urls, function(response) {
      this.thenOpen(response.data, function(response) {
        this.echo(this.getTitle());
      });
    });

    casper.run();

Finally, you’ll probably get something like this:

    $ casperjs npm-underscore-test.js
    Google
    CasperJS documentation | CasperJS 1.1.0-DEV documentation