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 URLs. 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.

reader
(:TYPE = (ERROR ":type argument is required."))

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.

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.

function
path-or-url &key system type integrity crossorigin cache-in-memory defer

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 URLs.

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.

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.