Annotation Interface JavaScript
Component class. For adding
multiple JavaScript files for a single component, you can use this annotation
multiple times.
It is guaranteed that dependencies will be loaded only once. The files loaded
will be in the same order as the annotations were on the class. However,
loading order is only guaranteed on a class level; Annotations from different
classes may appear in different order, grouped by the annotated class. Also,
files identified by @JavaScript will be loaded after
JsModule and before
CssImport.
NOTE: Bundled frontend resources are combined into one big bundle. This
means, that a bundled JavaScript file loaded by one class will be present on
a view constructed by another class. For example, if there are two classes
RootRoute annotated with @Route(""), and another class
RouteA annotated with @Route("route-a") and
@JavaScript("./src/javascript.js"), the javascript.js will be
run on the root route as well. This does not apply to resources loaded at
runtime, such as a @JavaScript with type() set to
JavaScript.Type.MODULE, which are loaded per page and never bundled.
External JavaScript dependencies (e.g. "http://example.com/some.js") are
added in the same way as Page.addJavaScript(String) and the result is
just adding a classic script element to the page. Other paths used in
the value() method are considered as relative to
frontend directory and they are bundled and added to the page as a
JavaScript module (a script element with type="module"). In
this case a JavaScript annotation behaves exactly as a
JsModule annotation.
Setting type() to JavaScript.Type.MODULE opts out of that bundling: the
file is then always loaded at runtime as a script element with
type="module", even when the value is a bare relative path, which is
resolved against the servlet context root. Use it for hand-authored or
CDN-hosted ES modules that should not go through Vite; for build-time bundled
ES modules use JsModule instead.
It's not possible to execute a function defined in JavaScript module via
UI.getCurrent().getPage().executeJs("some_function_definied_in_module()");
because the function is private there (unless it's explicitly exposed). The
JavaScript where the function is defined should be either external or it
should be added using Page.addJavaScript(String): in this case all
declared functions become available in the global scope.- Since:
- 1.0
- Author:
- Vaadin Ltd
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic @interfaceInternal annotation to enable use of multipleJavaScriptannotations.static enumThe kind of<script>tag to render for the dependency. -
Required Element Summary
Required Elements -
Optional Element Summary
Optional ElementsModifier and TypeOptional ElementDescriptionbooleanDefines if the JavaScript should be loaded only when running in development mode (for development tooling etc.) or if it should always be loaded.Determines the dependency load mode.The kind of<script>tag to use when loading the file.
-
Element Details
-
value
String valueJavaScript file URL to load before using the annotatedComponentin the browser.Relative URLs are interpreted as relative to the configured
frontenddirectory location.This URL identifies a file which will be bundled, so the file should be available to be able to bundle it.
You can prefix the URL with
context://to make it relative to the context path or use an absolute URL to refer to files outside the frontend directory. Such URLs are not bundled but included into the page as standalone scripts in the same way as it's done byPage.addJavaScript(String).When
type()isJavaScript.Type.MODULE, the value is loaded at runtime regardless of whether it has a URL prefix; bare relative paths are normalized tocontext://<value>and served as static resources by the servlet container.- Returns:
- a JavaScript file URL
-
type
JavaScript.Type typeThe kind of<script>tag to use when loading the file. Defaults toJavaScript.Type.SCRIPT(a classic<script>element). Set toJavaScript.Type.MODULEto render a<script type="module">element instead, e.g. for hand-authored or CDN-hosted ES modules that should not go through Vite. For build-time bundled ES modules useJsModuleinstead.- Returns:
- the kind of script tag to render
- Since:
- 25.4
- Default:
SCRIPT
-
developmentOnly
boolean developmentOnlyDefines if the JavaScript should be loaded only when running in development mode (for development tooling etc.) or if it should always be loaded.By default, scripts are always loaded.
- Returns:
trueto load the script only in development mode,falseto always load it- Since:
- 24.2
- Default:
false
-
loadMode
LoadMode loadModeDetermines the dependency load mode. Refer toLoadModefor the details.LoadMode.INLINEcannot be combined withJavaScript.Type.MODULE; such a combination is rejected with anIllegalArgumentExceptionwhen the dependency is added to the page.- Returns:
- load mode for the dependency
- Default:
EAGER
-