That is very clearly explained with those examples, and the feature sounds amazing Josh, thank you so much for this work. -Greg
On Thu, 29 May 2025, 12:01 am Josh Tynjala, <joshtynj...@bowlerhat.dev> wrote: > 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/ >