Dependencies
When Reblocks renders page, it collects CSS
and JS
dependencies from all widgets
by calling generic-function reblocks/dependencies:get-dependencies
. Also, this function
is called on the current app to get such common dependencies as jQuery and CSS
framework.
If you are defining your own method for reblocks/dependencies:get-dependencies
generic-function,
make sure it returns a list of reblocks/dependencies:dependency
objects.
Typically, you already have JS
or CSS
file somewhere near your ASDF
system. In this case,
you can use reblocks/dependencies:make-dependency
function like this:
(defmethod reblocks/dependencies:get-dependencies ((app my-app))
(list* (reblocks/dependencies:make-dependency "js/my-app.js"
:system :some-asdf-system)
(call-next-method)))
Other way to specify a dependency is to use Parenscript or LASS
to define JS
or CSS
right inside
the method. Here we define CSS
code for the widget:
(defmethod reblocks/dependencies:get-dependencies ((widget my-custom-widget))
(list*
(reblocks-lass:make-dependency
`(.my-custom-widget
:border 2px solid red
:padding 1em))
(call-next-method)))
Pay attention, this code uses REBLOCKS-LASS:MAKE-DEPENDENCY
function which is available from
the separate asdf system REBLOCKS-LASS
.
API
This class represents a web-dependency. It could be CSS
, JS
or an image.
All dependencies are divided into remote-dependency
or local-dependency
.
Remote dependencies refer some URL
s. Usually these dependencies are served from a CDN
.
Local dependencies are served by the same webserver which renders reblocks widgets.
Each local dependency should provide a route, which will be added to the server routing table. Also, it might define a path to the file on the local file-system.
If this variable is set to a pathname, then remote dependencies will be cached and served as local dependencies.
This pathname should point to a directory where cached dependencies will be stored.
Returns a MIME
content type for given dependency.
It is used when dependency is served locally.
A hash, used by modern browsers for subresource integrity checking.
See more information at: https://www.w3.org/TR/SRI/
Returns a path on local disk to serve dependency from.
This could be a real source file or a cached version of remote dependency.
This method should return a routes:route object if dependency should ber served from local server.
Returns URL
of the dependency.
If dependency should be served by the server, second value is :local.
Otherwise it is :external. Also, in first case dependency's URL
should have only path part, like /local/css/bootstrap.css.
When true, then on creation dependency will read file's data into the memory. This is useful for applications, deployed as a single executable file. Create such dependencies in compile time and store in a global variable.
Returns a keyword meaning content type of the dependency
by infering it from URL
or a path
Returns a JS
code to dynamically include a CSS
or JS
dependency
into a webpage on AJAX
response.
This makes possible to load new styles and code for widgets which can appear on a page as a response to some action.
Renders a piece of html.
Returns two values - content and content-type.
Example output::
(values "body {background: light-green;}" "text/css")
Pushes dependency into the currently collected list of dependencies.
Makes deduplication by comparing dependencies' urls.
Same as `push-dependency' but for the list.
Use this macro to wrap code which may push new dependencies for the page or an action.
Returns T, if dependency is already loaded into the page.
Returns as list of dependencies loaded into the page. Most recently loaded go first.
Creates a JavaScript dependency, served from the disk.
If the system's name is given, then the path is calculated relatively to this system's source root.
Returns a list of object's dependencies.
Object could be an application or a widget.
Reblocks will call this method for application and every widget on a page
to gather necessary dependencies and to inject them into resulting HTML
.
Should return T if two dependencies are considered equal. By default compares their URL
s.
If your widget might return a slightly different code from it's get-dependencies
generic-function method,
these dependencies will be consided different and every-time loaded into the page.
Sometimes this happens with JS
, generated by Parenscript, because it uses GENSYM
in the
LET
form. But actually code is the same and there is no need to load it again when
the widget is updated.
A list of cached dependencies.
Boolean flag. When T then result of get-dependencies
generic-function will be cached.
By default is True, but you might turn it off while debugging the application.