Skript för att bygga WebApps 2, RESTApps och Widgets med Svelte.
Nyheter
Section titled “Nyheter”Kom igång
Section titled “Kom igång”Läs vår guide om hur man kommer igång med Svelte!
Installation
Section titled “Installation”Skriptet installeras lokalt i appen.
npm install @soleil-se/build-app --save-devSkript
Section titled “Skript”Lägg till följande skript i package.json:
{ "scripts": { "build": "build-app build", "watch": "build-app watch", "start": "build-app start", "deploy": "build-app deploy" }}build: Bygger ihop appen utan att ladda upp.watch: Startar en watcher, när någon av de filer som loggas vid uppstart ändras byggs appen ihop och laddas upp till default miljön eller den miljö som anges i--envargumentet.start: Bygger först ihop och laddar upp appen till default miljön eller den miljö som anges i--envargumentet, därefter startas en watcher.deploy: Bygger ihop, signerar och laddar upp appen till default miljön eller den miljö som anges i--envargumentet.
Styling preprocessor
Section titled “Styling preprocessor”Om en preprocessor används för styling (vanligtvis Sass) behöver denna installeras lokalt i appen eller i projektets rotkatalog.
npm install sass --save-devStruktur
Section titled “Struktur”Största skillnaden från Sitevisions standardstruktur är att appens konfiguration ligger i egna kataloger.
WebApp
Directoryconfig Konfiguration för appen.
- App.svelte Huvudkomponent för konfigurationen
- config.js Klientkod för konfigurationen
- index.js Serverkod för konfigurationen
Directoryconfig_global Global konfiguration för appen
- App.svelte Huvudkomponent för globala konfigurationen
- config.js Klientkod för globala konfigurationen
- index.js Serverkod för globala konfigurationen
Directorysrc
Directoryclient/ Klientspecifik kod
- …
Directorycommon/ Universell kod
- …
Directorycomponents/ Komponenter
- …
Directoryserver/ Serverspecifik kod
- …
Directoryresource/ Mapp för appens resurser
- …
- App.svelte Huvudkomponent för appen
- index.js Serverkod för appen
- hooks.js Pre render hooks
- main.js Klientkod för appen
- appDataDefaults.json Defaultvärden för konfiguration
- jsconfig.json
- manifest.json
- package.json
- svelte.config.json
RESTApp
Directoryconfig Konfiguration för appen.
- App.svelte Huvudkomponent för konfigurationen
- config.js Klientkod för konfigurationen
- index.js Serverkod för konfigurationen
Directorysrc
Directoryapi/ Kod för appen
- …
Directoryresource/ Appens resurser
- …
- index.js Serverkod för appen
- appDataDefaults.json Defaultvärden för konfiguration
- jsconfig.json
- manifest.json
- package.json
- svelte.config.json
Det går även att använda samma filer som Sitevision för enklare konfigurationer.
Sitevision konfiguration
Directoryconfig Konfiguration för appen
- index.html
- index.js
- config.js
- config.css
Directoryconfig_global Global konfiguration för appen.
- index.html
- index.js
- config.js
- config.css
Directorysrc/
- …
- jsconfig.json
- manifest.json
- package.json
- svelte.config.json
Inställningar
Section titled “Inställningar”Skriptet använder följande inställningar:
Signering
Section titled “Signering”I user_config.json anger man vilken användare och vilket certifikat som ska användas vid signering av appar.
auth- En base64-enkodad sträng med formatetusername:password.certificate- Namn på certifikatet som ska användas vid signering.
{ "webappSign": { "auth": "dXNlcm5hbWU6cGFzc3dvcmQ=", "certificate": "Soleil" }}Manifest
Section titled “Manifest”Information om appen, se till att bundled är satt till true för att använda WebApps 2.
Läs mer om manifest.json på Sitevisions utvecklarwebb.
{ "id": "se.soleil.myApp", "version": "1.0.0", "name": "Namn på app", "author": "Soleil AB", "description": "Beskrivning av app.", "helpUrl": "", "type": "WebApp", "bundled": true}Flerspråkiga namn 1.4.0
Section titled “Flerspråkiga namn ”I Sitevision 10.1 introducerades stöd för flerspråkiga namn på appar.
Som standard kommer det svenska namnet (name.sv i manifest.json) att användas för själva tillägget i sv:addonRepository.
Behöver man ändra detta kan man ange ett annat språk under addonNameLang i project_config.json.
{ "env": { ... }, "addonNameLang": "en"}Svelte config
Section titled “Svelte config”I filen svelte.config.js anger man inställningar för preprocessing och kompilatorn.
Exempel för att ändra inkluderade sökvägar för Sass och slå på inställningen preserveWhitespace i kompilatorn.
import { sveltePreprocess } from 'svelte-preprocess';
export default { preprocess: sveltePreprocess({ scss: { includePaths: [`${import.meta.dirname}/../../../../client_src/sass`] } }), compilerOptions: { preserveWhitespace: true, },};Läs mer om kompilatorinställningar.
Argument
Section titled “Argument”--no-eslint- Stänger av linting av kod.--no-sync- Stänger av uppladdning till Sitevision.--no-cache- Stänger av cachning av kod när appen byggs ihop.--force- Forcerar uppladdning av app.--debug- Stänger av minifiering för enklare felsökning.--sign- Signerar alltid appen.--activate- Aktiverar appen vid uppladdning.--append-watch-path- Lägger till en sökväg för till watchern, glob mönster är tillåtna, exnpm run start -- --append-watch-path=../common.
Följande argument är deprekerade och kommer att tas bort i framtida versioner:
--watch(DEPRECATED) - Startar övervakning av filer och bygger ihop appen vid förändringar.--build(DEPRECATED) - Bygger alltid appen vid uppstart, även med--watch.
Det finns möjlighet att sätta upp alias för Rollup för att slippa långa relativa sökvägar.
Alias prefixas med ett # för att vara lättare att urskilja.
import doSomething from '#api/doSomething';Alias definieras i project_config.json.
Utgångspunkten för alias är den katalog där project_config.json ligger.
{ "rollup": { "server": { "alias": { "#api": "./server/api", } }, "client": { "alias": { "#api": "./client/api", } } }}Utgångspunkten för alias är den katalog där project_config.json ligger.
På serversidan finns följande alias uppsatta som standard:
{ '#api': './server_src/api', '#api/webapps': './server_src/webapps/api', '#api/restapps': './server_src/restapps/api', '#components': './server_src/webapps/components',}På klientsidan finns följande alias uppsatta som standard:
{ '#api': './server_src/api', '#api/webapps': './server_src/webapps/api', '#components': './server_src/webapps/components',}Det går att definera egna alias i project_config.json.
{ "rollup": { "server": { "alias": { "#myAlias": "./some/path" } }, "client": { "alias": { "#myOtherAlias": "./some/other/path" } } }}TypeScript 2.4.0
Section titled “TypeScript ”Det finns från och med version 2.4.0 stöd för TypeScript.
Kom igång
Section titled “Kom igång”- Installera beroenden
Installera senaste versionen av
@soleil-se/build-appsamt de beroenden som krävs för att bygga och linta TypeScript-kod.Terminal window npm i @soleil-se/build-app@^2.4.0 typescript @soleil-se/eslint-config@^6.2.6 typescript-eslint eslint-import-resolver-typescript --save-dev - Skapa tsconfig.json
Skapa en
tsconfig.jsoni appens rotkatalog med följande innehåll.
Ta bortjsconfig.jsonom den finns.tsconfig.json {"exclude": ["node_modules","dist"],"compilerOptions": {"target": "ES2022","module": "ES2022","esModuleInterop": true,"forceConsistentCasingInFileNames": true,"strict": true,"skipLibCheck": true,"lib": ["ES2022", "DOM"],"moduleResolution": "node","outDir": "dist","verbatimModuleSyntax": true,"isolatedModules": true,"allowJs": true,}} - Uppdatera ESLint-config
Byt ut importen i ESLint-konfigurationen till den som stödjer TypeScript.
eslint.config.js import config from '@soleil-se/eslint-config';import config from '@soleil-se/eslint-config/typescript';export default [...config,];Man behöver även uppdatera inställningen
eslint.validatei VS Code för att linta TypeScript.settings.json "eslint.validate": ["javascript", "javascriptreact", "svelte"],"eslint.validate": ["javascript", "javascriptreact", "typescript", "typescriptreact", "svelte"], - Uppdatera filändelse på ingångspunkter
Byt filändelse på ingångspunkterna i appen till
.ts.src/index.js→src/index.tssrc/main.js→src/main.tssrc/hooks.js→src/hooks.ts
- Uppdatera main.ts
Om du har en
src/main.tsuppdatera den med följande typer för default exporten.src/main.ts import { render } from '@soleil-se/app-util/client/svelte/5';import App from './App.svelte';export default (props, target) => {export default (props: Record<string, unknown>, target: HTMLElement) => {render(App, { props, target });}; - Starta byggskript
Starta byggskriptet som vanligt, läs mer om TypeScript i Sitevision
Terminal window npm run start
Typning av appData och globalAppData
Section titled “Typning av appData och globalAppData”Man kan använda appData och globalAppData från @soleil-se/app-util för bättre typning av en apps konfiguration och slippa casting av typer.
import appData from '@sitevision/api/server/appData';import appData from '@soleil-se/app-util/server/app-data';
const myString = appData.get('myStringKey') as string;const myNumber = appData.get('myNumberKey') as number;const myBoolean = appData.get('myBooleanKey') as boolean;const myArray = appData.getArray('myStringArrayKey') as string[];const myString = appData.getString('myStringKey');const myNumber = appData.getNumber('myNumberKey');const myBoolean = appData.getBoolean('myBooleanKey');const myArray = appData.getStrings('myStringArrayKey');Typning av Props
Section titled “Typning av Props”Vill man få med typning för props i både src/index.ts och src/main.ts kan man exportera denna från
src/App.svelte och använda i src/index.ts och src/main.ts.
<script module lang="ts"> export type Props = { message: string; };</script>
<script lang="ts"> let { message }: Props = $props();</script>
<p>{message}</p>
<style lang="scss"> p { color: black; }</style>import router from '@sitevision/api/common/router';import appData from '@soleil-se/app-util/server/app-data';import { render } from '@soleil-se/app-util/server/svelte/5';
import App, { type Props } from './App.svelte';
router.get('/', (req, res) => { const props: Props = { message: appData.getString('message'), }; const html = render(App, props); res.agnosticRender(html, props);});import { render } from '@soleil-se/app-util/client/svelte/5';
import App, { type Props } from './App.svelte';
export default (props: Props, target: HTMLElement) => { render(App, { props, target });};