jekyll-asset_bundler

jekyll-asset_bundler

A small plugin for Jekyll to easily bundle and compress site assets

Jekyll Asset Bundler

Jekyll Asset Bundler is a Jekyll plugin for... bundling assets. It is hacked onto... I mean, utilizes deep integration with Jekyll for a seamless deployment experience.

Installation

Copy or link asset_bundler.rb into your _plugins folder for your Jekyll project.

If your Jekyll project is in a git repository, you can easily manage your plugins by utilizing git submodules.

To install this plugin as a git submodule:

git submodule add git://github.com/moshen/jekyll-asset_bundler.git _plugins/asset_bundler

To update:

cd _plugins/asset_bundler
git pull origin master

Status

Currently only supports absolute asset paths in relation to your source directory. For example: /css/mystyle.css looks for a file in my_source_dir/css/mystyle.css.

Features

  • Works with Octopress
  • Custom commands for bundle compression
  • Compressed bundle caching
  • Bundling and caching of remote assets
  • Dev mode, for easy site development with all assets
  • Dev-only asset inclusion

TODO

  • Relative paths support
  • CoffeeScript and LessCSS compilation support

Notes

v0.05 - Changed from using Liquid::Tags to Liquid::Blocks. This will break on existing bundle markup if you upgrade.

Why change it? Well, Liquid::Tags have to be on one line, whereas Liquid::Blocks do not, also it opens up some more flexibility, as additional options could be included in the tag text.

v0.08 - Changed the cdn config parameter to server_url in order to be more generic. For the time being, cdn still works (see below).

Why change it? There seemed to be a little confusion about the parameter name and what the parameter does.

v0.11 - jekyll --watch now turns on dev mode. Removed code for compatibility with versions of Jekyll pre 1.0.

Why change it? jekyll --watch isn't really supported by the plugin anyway. Also, Jekyll is changing and I don't want this to be any more of an unmaintainable mess.

Is it production ready?

Consider this beta software, though for small Jekyll sites you should have no problem using it.

Usage

Once installed in your _plugins folder Jekyll Asset Bundler provides Liquid::Blocks to use which will generate the appropriate markup for including JavaScript and CSS. Each of the following blocks consumes a YAML formatted array.

Liquid::Blocks

bundle

{% bundle %} [/js/main.js, /js/somethingelse.js] {% endbundle %}

Is equal to:

{% bundle %}
- /js/main.js
- /js/somethingelse.js
{% endbundle %}

Remote assets can also be bundled:

{% bundle %}
- http://cdnjs.cloudflare.com/ajax/libs/jquery/1.7.2/jquery.min.js
- //cdnjs.cloudflare.com/ajax/libs/underscore.js/1.3.1/underscore-min.js
- https://cdnjs.cloudflare.com/ajax/libs/backbone.js/0.9.2/backbone-min.js
- /js/my_local_javascript.js
{% endbundle %}

Remote assets will be cached in the _asset_bundler_cache folder (in the same directory as your _plugins folder). If you want to regenerate cached items, delete the cache folder.

The bundle tag will concatenate the provided scripts and make a hash of the result. This hash is used as a filename. The Bundle is then compressed (if desired), and the final result cached in the _asset_bundler_cache folder. Therefore, the bundle is only recreated and compressed again if the source files have been modified. This greatly speeds up future site builds.

Note: Asset Bundler makes no attempt to clean up the cache folder. If it has grown too large, simply delete it.

The proper markup is finally inserted to include your bundle file.

bundle_glob

{% bundle_glob %}
- /js/*.js
- /css/*.css
{% endbundle_glob %}

The bundle_glob tag uses the Ruby Dir.glob method to include multiple assets. WARNING: assets will be included in alphanumeric order, this may screw something up.

dev_assets

{% dev_assets %}
- /js/less.js
{% enddev_assets %}

The dev_assets tag includes the normal markup for the referenced assets only in 'dev mode'. The array items can either be local files or urls for external scripts and are included as-is. At any other time, it does nothing. In a future version (hopefully soon), this will play a role in utilizing things like LessCSS and CoffeeScript.

Configuration

Some behavior can be modified with settings in your _config.yml. The following represents the default configuration:

asset_bundler:
  compress:
    js: false
    css: false
  base_path: /bundles/
  server_url:
  remove_bundled: false
  dev: false
  bundle_name: false
  markup_templates:
    js: "<script type='text/javascript' src='{{url}}'></script>\n"
    css: "<link rel='stylesheet' type='text/css' href='{{url}}' />\n"

Here is a breakdown of each configuration option under the top level asset_bundler key.

compress:

Compresses nothing by default. Change the js and css keys to modify compression behavior.

js:

To compress with the yui-compressor gem, use 'yui' here, to compress with the closure compiler gem, use 'closure' here.

compress:
  js: yui

To compress with a system command, enter it for the appropriate asset type:

compress:
  js: uglifyjs :infile -o :outfile -c

This example will run a uglifyjs command from your PATH while substituting :outfile and :infile for temporary files stored in _asset_bundler_cache.

If either :outfile or :infile are omitted, stdout and stdin will be used. WARNING, stdin and stdout are done with IO.popen , which doesn't work on Windows

Note: Some have reported other issues when using the yui-compressor or closure compiler gems on Windows. If you having trouble on windows, try specifying a command as outlined above.

css:

Takes the exact same arguments as js:, with the exception of the Google Closure Compiler ( it's JavaScript only ).

base_path:

Where the bundles will be copied within your destination folder.

Default: /bundles/.

server_url:

NOTE: In v0.07 and earlier this setting was cdn. The cdn key still works and will act as an alias. However, if the server_url key is set, it will override cdn.

The root path of your server_url or CDN (if you use one). For example: http://my-cdn.cloudfront.net/

Jekyll Asset Bundler checks to make sure that this setting ends in a slash.

Default: (blank).

remove_bundled:

If set to true, will remove the files included in your bundles from the destination folder.

Default: false.

dev:

NOTE: In v0.10 and earlier, dev mode was not enabled automatically for --auto or --watch mode.

If set to true, enables dev mode. When dev mode is active, no bundles are created and all the referenced files are included individually without modification.

Dev mode is also automatically enabled when using jekyll server, jekyll --watch or when a top level configuration key: dev is set to true.

Default: false.

bundle_name:

Overrides bundle name. When false, MD5 hash of the content is used instead.

Default: false.

markup_templates:

Use the relevant markup_template options to override the default templates for inserting bundles. Each option is parsed with Liquid::Template.parse and passed a url (String) parameter.

Note: if you want newlines to be passed in properly, be sure to quote your templates in _config.yml.

js:

The default JavaScript markup is fairly verbose. If you would like a modern replacement, try "<script src='{{url}}'></script>\n".

Default: "<script type='text/javascript' src='{{url}}'></script>\n"

css:

The default CSS is also verbose. If you would like a modern replacement, try "<link rel=stylesheet href='{{url}}'>\n".

Default: "<link rel='stylesheet' type='text/css' href='{{url}}' />\n"

Dependencies

Jekyll Asset Bundler uses the yui-compressor or closure-compiler gems (when configured) and (obviously) Jekyll.

Author

Colin Kennedy, moshen on GitHub

License

MIT, see LICENSE file.