You may recall that I added some new options to Royale's compiler a couple
of months ago. They allow you to add .js, .css, and asset files to both
SWCs and app projects, and the compiler will automatically add <script> and
<link> tags to your HTML file. Full details here in the archive:

https://lists.apache.org/thread/5sws42w00jqdh0s5nhmb3ykdzs0nzj15

These compiler options work best when the compiler should add the <script>
and <link> tags if any definition in the SWC gets referenced. For example,
if someone is making a SWC library that contains only AS3 externs for a
particular JS library's types. All of the externs require the same <script>
and <link> tags, so these compiler options make it easy to add the
necessary files without duplication.

However, there's another use-case that wasn't covered yet. What if you want
to include <script>/<link> only when one specific class is referenced. What
if you don't want the hassle of creating a separate library for AS3
externs? That's where the new metadata comes in.

[JSIncludeScript(source="path/to/file.js")]
[JSIncludeCSS(source="path/to/file.css")]
[JSIncludeAsset(source="path/to/file.extension")]
public class MyClass {}

In the example above, the three files are copied, and <script> and <link>
tags are added, only when MyClass is referenced in your project.

It works similarly to the classic [Embed] tag provided by the SWF compiler.
You can specify a path to a file (relative to the .as file), and it will be
included at compilation-time. This metadata is available in both app
projects,and SWC library projects. There are special directories in the SWC
to store the files, and mxmlc knows to check for the metadata, find the
files in the SWC, and update the HTML template as needed.

So, now there's two options for including scripts, styles, or arbitrary
asset files. Which do you choose?

- Does every definition in the library always require some additional
files, use -js-include-script, -js-include-css, and -js-include-asset.
- Does a single class or extern require any additional files, and if you
don't use that class, skip them? Use [JSIncludeScript], [JSIncludeCSS], or
[JSIncludeAsset].

We're using both methods in royale-asjs, depending on how those questions
are answered.

For instance, JewelTheme requires the Lato font. There isn't really a
specific class to associate the Lato font with, and all Jewel components
use the same font, so we use -js-include-css and -js-include-asset to
include the necessary .css file and webfont files in the SWC.

The Icons library includes both the Font Awesome and Material icons.
Typically, you choose one set of icons or the other, and not both. So we
use [JSIncludeCSS] and [JSIncludeAsset] on the specific classes where those
files are needed, and the compiler will use only what's referenced.

The TabBarView class in Jewel needs the web-animations.min.js file.
However, other Jewel components do not. It's a good place to choose
[JSIncludeScript]. If a Jewel-based app doesn't use TabBar,
web-animations.min.js won't be loaded at all, even if other Jewel
components are used.

Whether you are using the new compiler options or the new metadata, this
should make it much easier to use external JS or CSS files in a Royale
project. You can bundle the necessary files into your library SWCs, and you
don't need to create a custom html-template quite as often.

--
Josh Tynjala
Bowler Hat LLC
https://bowlerhat.dev/

Reply via email to