Provided by: libmojolicious-plugin-assetpack-perl_2.14-1_all 

NAME
Mojolicious::Plugin::AssetPack::Guides::Tutorial - AssetPack tutorial
OVERVIEW
This guide will give detailed information about how to define assets and include them into your
templates.
See "DESCRIPTION" in Mojolicious::Plugin::AssetPack for a short description of AssetPack.
GUIDE
Loading the plugin
The plugin needs to be installed an loaded before any assets can be defined:
$app->plugin(AssetPack => \%args);
Details about %args can be found under "register" in Mojolicious::Plugin::AssetPack, but there is one
mandatory argument worth noting: "pipes". "pipes" need to be a list of all the pipes you need to process
your assets. Example:
$app->plugin(AssetPack => {pipes => [qw(Sass Css Combine)]});
Loading the plugin with the list above will enable AssetPack to process Sass and Css files, minify them
and combine them into a single asset in production.
Optional dependencies
AssetPack has only optional dependencies. The reason for that is that the dependencies should only be
required while developing, and not for running the application. See
<https://github.com/jhthorsen/mojolicious-plugin-assetpack/blob/v2/cpanfile> for a complete list, but
here are the current list:
• CSS::Minifier::XS 0.09
Used to minify CSS.
• CSS::Sass 3.3.0
Used to process and minify CSS.
• Imager::File::PNG 0.90
TODO: Used to generate CSS sprites.
• JavaScript::Minifier::XS 0.11
Used to minify JavaScript.
Pipes
AssetPack does not do any heavy lifting itself: All the processing is left to the pipe objects.
• Mojolicious::Plugin::AssetPack::Pipe::CoffeeScript
Process CoffeeScript coffee files. Should be loaded before
Mojolicious::Plugin::AssetPack::Pipe::JavaScript.
• Mojolicious::Plugin::AssetPack::Pipe::Combine
Combine multiple assets to one. Should be loaded last.
• Mojolicious::Plugin::AssetPack::Pipe::Css
Minify CSS.
• Mojolicious::Plugin::AssetPack::Pipe::Favicon
There is a special topic called "favicon.ico", combined with the
Mojolicious::Plugin::AssetPack::Pipe::Favicon pipe which can be used to describe favicons, touch icons
and tile icons.
• Mojolicious::Plugin::AssetPack::Pipe::Fetch
Will look for "url(...)" in CSS files and download the related assets.
• Mojolicious::Plugin::AssetPack::Pipe::JavaScript
Minify JavaScript.
• Mojolicious::Plugin::AssetPack::Pipe::Jpeg
Used to crush "jpeg" image files.
• Mojolicious::Plugin::AssetPack::Pipe::Less
Process Less CSS files. Should be loaded before Mojolicious::Plugin::AssetPack::Pipe::Css.
• Mojolicious::Plugin::AssetPack::Pipe::Png
Used to crush "png" image files.
• Mojolicious::Plugin::AssetPack::Pipe::Riotjs
Process <http://riotjs.com/> tag files. Should be loaded before
Mojolicious::Plugin::AssetPack::Pipe::JavaScript.
• Mojolicious::Plugin::AssetPack::Pipe::Sass
Process sass and scss files. Should be loaded before Mojolicious::Plugin::AssetPack::Pipe::Css.
Where to place source files
The source/input files that make up a virtual asset (topic) can come from either...
On disk
AssetPack will look for source files in the "assets" directory, relative to the application home. Unlike
the "public" directory, this directory is not shared on the internet, but the generated assets will still
be available thanks to a custom route.
Mojolicious::Plugin::AssetPack::Store is a sub class of Mojolicious::Static, allowing it to find files
relative to "paths" in Mojolicious::Static. For example, to change asset search paths, you can do:
$app->asset->store->paths(["/some/new/location", "/other/location"]);
DATA section
Mojolicious::Plugin::AssetPack::Store is a sub class of Mojolicious::Static, allowing it to look for
files in DATA sections of "classes" in Mojolicious::Static.
The DATA section can also be used to lookup "@import" files. (Currently only supported by
Mojolicious::Plugin::AssetPack::Pipe::Sass)
Web
Any file starting with "http" or "https" will be downloaded from web using "ua" in
Mojolicious::Plugin::AssetPack.
It will also parse recursively "@import" files and download those as well. (Currently only supported by
Mojolicious::Plugin::AssetPack::Pipe::Sass)
Assets from web will be cached locally to prevent downloading new and untested assets on each application
startup.
Current Mojolicious application
See "DYNAMIC ASSETS" in Mojolicious::Plugin::Assets::Guides::Cookbook.
Process assets
Assets should be defined when you application starts. This can either be done using a definition file or
inside you application.
Defining assets in the application
Assets can be defined using the "process" in Mojolicious::Plugin::AssetPack method:
$app->asset->process(
"app.css" => (
"sass/bar.scss",
"foo/bar.css",
"https://github.com/Dogfalo/materialize/blob/master/sass/materialize.scss",
)
);
In the example above we have defined a topic named "app.css" which later can be included in templates.
The list of files following are the source files which will make up the final asset.
Defining assets in a definition file
Moving the definition to an external file can be useful for keeping the application code tidy. The
definition file should be located in the assets directory, or optionally defined it in the "DATA"
section. The default file is called "assetpack.def" and will be looked up if "process" in
Mojolicious::Plugin::AssetPack is called without arguments. Example file:
! app.css
< sass/bar.scss
<< https://github.com/Dogfalo/materialize/blob/master/sass/materialize.scss
< sass/main.scss
Empty lines and lines starting with "#" will be skipped. Each line starting with "!" will be used to
define a topic (virtual asset name), and "<" will define a source file. This means that the file above
will result in (almost) the same as in the example above.
The idea of the line starting with "<<" is to download an external (remote) file for your convenience,
which can be imported in your SASS/LESS files. The downloaded file is not included in the output asset.
For example, you have "sass/main.scss" which depends on "materialize.scss" (remote file) and you need
this "materialize.scss" file locally available to be imported in "sass/main.scss". If you want to
include a remote file in your output asset, use '<' insteaf of '<<'.
It is also possible to add conditions:
! app.css
< development.css [mode==development] [minify==0]
< production.css [mode!=development]
"development.css" will be processed if "mode" in Mojolicious is "development" and "minify" in
Mojolicious::Plugin::AssetPack is "0". "production.css" will be processed if "mode" in Mojolicious is
something else than "development". This is especially useful if you want to include a JavaScript with
debug flags set while developing, but switch to a smaller version without debug in production.
Using assets
Any processed asset can be accessed by referring to a topic.
Template
An asset can be included in a template using the "asset" in Mojolicious::Plugin::AssetPack helper:
<head>
%= asset "app.css"
%= asset "app.js"
</head>
The "asset" in Mojolicious::Plugin::AssetPack helper takes additional arguments which will be passed on
directly to either the "javascript" in Mojolicious::Plugin::TagHelpers helper or "stylesheet" in
Mojolicious::Plugin::TagHelpers helper. Example:
%= asset "app.css", media => "print"
In production mode, the helper above will just result in one "link" tag. On the other hand, if you are in
"development" mode, it will result in on "link" tag per source asset.
Asset objects
It is also possible to retrieve the processed asset objects. The example below will retrieve a
Mojo::Collection object holding zero or more Mojolicious::Plugin::AssetPack::Asset objects:
my $collection = $app->asset->processed("app.css");
print $collection->map("checksum")->join(", ");
This can also be used to inline assets in a template:
%= stylesheet sub { asset->processed('app.css')->map('content')->join }
Application mode
The application mode will define if the assets should be combined and minified. The "minify" in
Mojolicious::Plugin::AssetPack attribute can also be set manually if you have special needs.
Development
The assets will be processed, but not minified/combined if MOJO_MODE or "mode" in Mojolicious is set to
"development". This is to make it easier to map JavaScript or CSS bugs to a specific file and line.
"development" is the default mode while running morbo:
$ morbo -w assets/ -w lib/ -w templates/ script/myapp
Any other mode
Any "production" mode will result in one combined and minified asset. This will save bandwidth and
roundtrip time to the server.
Caching
Processed assets will be cached to disk when possible. The process step is run so if such a processed
asset exists, the process step will not be run again. Again, the external tools (less, coffee, ...) and
modules (JavaScript::Minifier::XS, CSS::Sass) will only be required while developing, but can be skipped
when installing an already built application.
Assets without topics
One nifty feature is to use Mojolicious::Plugin::AssetPack for assets which do not have any pipe to
process them. The reason why this comes in handy is to avoid cache issues, since changing the file on
disk will generate a new URL.
These assets can also be defined directly in the templates, without having to be defined in the
application startup process. Examples:
# <img src="/asset/52e98718f0/foo.gif">
%= asset "/image/foo.gif"
# <img src="/asset/87652910af/baz.svg">
%= asset "/image/baz.svg"
# <link rel="icon" href="/asset/65428718f1/bar.ico">
%= asset "/image/bar.ico"
# <source src="/asset/87652718f0/baz.mp3" type="audio/mpeg">
%= asset "/audio/baz.mp3"
# <source src="/asset/52e87652f0/foo.mp4" type="video/mp4">
%= asset "/video/foo.mp4"
# <source src="/asset/52eaz7613a/bar.ogg" type="audio/ogg">
%= asset "/audio/bar.ogg"
# <source src="/asset/baf72618f1/foo.ogv" type="audio/ogv">
%= asset "/video/foo.ogv"
# <source src="/asset/92118711f0/bar.webm" type="audio/webm">
%= asset "/video/bar.webm"
SEE ALSO
Mojolicious::Plugin::AssetPack, Mojolicious::Plugin::AssetPack::Guides::Developing and
Mojolicious::Plugin::AssetPack::Guides::Cookbook.
perl v5.36.0 2023-02-04 Mojolicious::Pl...uides::Tutorial(3pm)