Skip to content

Script ​

Routed .js resources for shared utilities, ES Modules, and cooperation with <script> tags inside Pages.

What It Is ​

Script is a separately stored JavaScript file in a Kooboo site. Once registered, it is accessible through a URL such as /assets/app.js. It is a good fit for:

  • utility functions shared across many pages,
  • a Vue or React entry module,
  • /scripts/layout.js in an importmap plus type="module" architecture,
  • or frontend logic that should not be pasted into every Page.

In KScript, Scripts are managed by k.site.scripts. See k.site.scripts.

Difference from Code or API resources

  • Script: a static JS file loaded by URL in the browser
  • Code (Api): a server-side route plus KScript, see k.site.codes
  • <script env="server"> inside a Page: server-side KScript, not a Script resource

Referencing It in Templates ​

Inside a Layout or Page:

html
<script src="/scripts/layout.js" type="module"></script>

The path is the url configured when the Script was created. If not configured, the default is /{name}.js. On the server, k.site.scripts.getUrl(id) returns the relative path.

async and defer ​

When the resource is created, you can configure async and defer, which become attributes on the rendered tag. See the API docs for details.

Two Script Responsibilities ​

TypeSyntaxRuntime
Server-side KScript<script env="server">Server render
Frontend JSA standalone Script resource, or <script> / <script type="module"> inside a PageBrowser

Put env="server" directly on the KScript tag instead of relying on an ancestor. Recommended split: prepare data near the top of a View or Page with <script env="server">, and keep interactive behavior at the bottom of the View or in Script resources.

ES Module + importmap Pattern ​

In multi-page sites, a common pattern is to declare an import map in the Layout <head> and boot the app from a type="module" script near the end of the Page:

html
<!-- Layout head -->
<script type="importmap">
{
  "imports": {
    "vue": "https://cdn.jsdelivr.net/npm/vue@3/dist/vue.esm-browser.prod.js"
  }
}
</script>

<!-- Page footer -->
<script type="module">
import { createApp } from 'vue'
import { store } from '/scripts/layout.js'
createApp({ /* ... */ }).mount('#app')
</script>

Here /scripts/layout.js is a site Script resource. It can export symbols that other Pages later import.

No build tool required

Native browser ES Modules plus importmap are enough to organize a medium or large frontend, even without Webpack or Vite.

type="module" and Server-side CodeBlocks ​

On the server, a module script with env="server" can import other CodeBlocks and export values back to the template. See Template Binding Syntax.