Questo è un semplice post pro memoria. Nelle ultime settimane ho sperimentato con Svelte e mi sono concentrato in particolar modo su come caricare un sito statico su GitHub. Non ho trovato molte guide e tutorial quindi credo vada la pena mettere giù i passaggi che ho seguito. Innanzitutto per me, che ho la memoria di un pesce rosso.

Allora, cosa c’è da fare?

Per prima cosa decidiamo il repository dove caricare il sito e creiamo una branch gh-pages. Ho notato che conviene caricare le pagine su una branch separata dalla principale. In questo modo il codice utilizzato per lo sviluppo resta separato dalle pagine visibili del sito. Scegliere gh-pages ci permette inoltre di usare un package npm specifico (chiamato per l’appunto gh-pages).

Quindi, dopo aver creato il repository e la branch dedicata alla pubblicazione della pagina su GitHub cominciamo a creare il sito vero e proprio. E cominciamo dalla versione più semplice, un sito statico senza nessuna pretesa. Da terminale digitiamo:

npx degit sveltejs/template my-fantastic-site

Quindi entriamo nella cartella my-fantastic-site

cd my-fantastic-site

Se vogliamo possiamo anche usare TypeScript ma non è obbligatorio:

node scripts/setupTypeScript.js

Fatto questo installiamo il necessario con

npm install

Adesso è possibile provare il sito usando semplicemente

npm run dev

Tralascio la creazione del sito in sé, sarebbe un argomento troppo vasto e non è quello di cui voglio parlare adesso. Passiamo quindi alla creazione del file compilato eseguendo

npm run build

Dopo aver eseguito questo comando abbiamo una cartella public contenente il codice compilato pronto per essere caricato su GitHub. Volendo possiamo fare tutto a mano. È però più comodo usare gh-pages. Quindi eseguiamo:

npm install gh-pages --save-dev

Aggiungiamo quindi uno script nel file package.json:

 "scripts": {
    "deploy": "node ./gh-pages.js"
  }

Quindi creiamo il file gh-pages.js:

var ghpages = require('gh-pages');

ghpages.publish(
	'public', // path to public directory
	{
		branch: 'gh-pages',
		repo: 'https://github.com/el3um4s/petits-chevaux.git', // Update to point to your repository
		user: {
			name: 'Samuele', // update to use your name
			email: 'samuele@stranianelli.com' // Update to use your email
		},
		dotfiles: true
	},
	() => {
		console.log('Deploy Complete!');
	}
);

In alternativa si può anche usare nella forma:

import { publish } from 'gh-pages';

publish(
  // ...
);

Adesso ci sono alcuni dettagli da sistemare. Il primo, assicurarsi che il file .gitignore non escluda la cartella public. È sufficiente commentare la riga corrispondente.

/node_modules/
# /public/build/

La seconda cosa è legata al funzionamento di GitHub Pages: funziona tramite Jekyll. In genere non dà particolari problemi ma ho notato che non legge correttamente le cartelle che cominciano con il carattere underscore (_). Conviene quindi disabilitarlo creando un file vuoto dal nome .nojekyll. Inseriamo anche questo file nella cartella public.

Infine il dominio del sito. Quando eseguiremo il deploy del sito sovrascriveremo automaticamente tutto il contenuto della branch gh-pages compreso il file CNAME. Se ci interessa usare un dominio specifico conviene allora aggiungere il file alla cartella public.

Bene, dopo aver fatto tutto questo siamo pronti a caricare il sito. Quindi, prima di tutto lo compiliamo

npm run build

Poi carichiamo sul repository il codice compilato. Io mi trovo bene con la versione desktop di GitHub ma è anche possibile farlo da riga di comando:

git add .
git commit -m "descrizione del commit"
git push origin gh-pages

Dopo aver caricato il repository possiamo eseguire

npm run deploy

Oppure

node ./gh-pages.js

Con questo è tutto. C’è però ancora una cosa da dire. Se invece di creare un sito con Svelte lo creiamo con SvelteKit dobbiamo fare alcune modifiche a questa procedura.

Per prima cosa dobbiamo installare l’adapter corretto. In questo caso si tratta di @sveltejs/adapter-static. Quindi:

npm i -D @sveltejs/adapter-static@next

Quindi aggiorniamo il file svelte.config.js

import preprocess from 'svelte-preprocess';
import adapter from '@sveltejs/adapter-static';

/** @type {import('@sveltejs/kit').Config} */
const config = {
	preprocess: preprocess(),

	kit: {
		target: '#svelte',
		adapter: adapter({
			pages: 'build',  // path to public directory
			assets: 'build',  // path to public directory
			fallback: null
		})
	}
};

export default config;

Ecco, con questo direi che è davvero tutto.