Plugin del Tema
Cos'è un plugin del tema?
Verdaccio, di default, utilizza un'UI personalizzata che fornisce una buona serie di funzonalità per visualizzare i pacchetti ma, il tuo team, potrebbe necessitare di delle funzionalità aggiuntive e personalizzate, ed è qui che un tema personalizzato diventa un'opzione. Il plugin memorizza delle risorse statiche, che saranno caricate dal lato del client, alla visualizzazione della pagina.
Come funziona la fase di caricamento di un plugin del tema?
Come caricano le risorsee del tema?
Di default, l'applicazione carica su http://localhost:4873
, ma nei casi in cui un proxy inverso con dominio personalizzato è coinvolto, le risorse sono caricate secondo la proprietà __VERDACCIO_BASENAME_UI_OPTIONS.base
e __VERDACCIO_BASENAME_UI_OPTIONS.basename
, dunque, soltanto una configurazione del dominio è utilizzabile.
Il tema carica soltanto dal lato del client, l'applicazione renderizza HTML con i tag <script>
per visualizzarla, il bundler si occupa del caricamento di qualsiasi altra risorsa, come svg
, images
o chunk associati con essa.
L'oggetto __VERDACCIO_BASENAME_UI_OPTIONS
window.__VERDACCIO_BASENAME_UI_OPTIONS
è disponibile nel contesto globale del browser, la forma è documentta e definita qui alle definizioni dei tipi di TemplateUIOptions
.
// esempio di output
{
"darkMode": false,
"basename": "/",
"base": "https://registry.my.org/",
"primaryColor": "#4b5e40",
"version": "5.20.1",
"pkgManagers": [
"yarn",
"pnpm",
"npm"
],
"login": true,
"logo": "",
"title": "Verdaccio Registry",
"scope": "",
"language": "es-US"
}
Configurazione del Tema
Di default, Verdaccio carica @verdaccio/ui-theme
, impacchettato nel pacchetto principale, se desideri caricare il tuo plugin personalizzato, dev'essere installato laddove sia individuabile.
$> npm install --global verdaccio-theme-dark
Il prefisso del nome del plugin deve iniziare per verdaccio-theme-xxx
, altrimenti, il plugin sarà ignorato. :::caution
Puoi caricare soltanto un tema per volta (se ne sono forniti di più, il primo viene selezionato) e passare le opzioni, se necessario.
theme:
dark:
option1: foo
option2: bar
Queste opzioni saranno disponibili
Struttura del plugin
Se disponi di un tema dell'interfaccia utente personalizzato, deve seguire una struttura specifica:
{
"name": "verdaccio-theme-xxxx",
"version": "1.0.0",
"description": "my custom user interface",
"main": "index.js",
}
Il file principale index.js
dovrebbe contenere i seguenti contenuti.
module.exports = () => {
return {
// posizione dei file statici, output del pacchetto web
staticPath: path.join(__dirname, 'static'),
// file json del manifesto del pacchetto web
manifest: require('./static/manifest.json'),
// file manifest principali da caricare
manifestFiles: {
js: ['runtime.js', 'vendors.js', 'main.js'],
},
};
};
Se una delle seguenti proprietà non è disponibile, il plugin non caricherà, dunque, segui questa struttura.
staticPath
: è la posizione assoluta/relativa dei file statici, potrebbe essere qualsiasi percorso conrequire.resolve
o da te creato; ciò che è importante si trova nel pacchetto o in qualsiasi posizione che il middleware Express.js possa trovare; dietro le quinte è utilzzatores.sendFile
.manifest
: L'oggetto del manifesto di un pacchetto web.manifestFiles
: Un oggetto con una proprietàjs
e l'insieme (l'ordine conta) dell'ID del manifesto da caricare dinamicamente nel modello.manifestFiles
si riferisce ai file principali che devono essere caricati come parte degli scripthtml
, per poter caricare la pagina; non devi includere i chunk, essendo caricati dinamicamente dal bundler.
File del manifesto
Verdacco richiede a un oggetto manifesto di renderizzare dinamicamente HTML, insieme a manifestFiles
, l'applicazione comprende cosa renderizzare.
Correntemente, supporta soltanto
js
ma, se necessiti anche dicss
, siamo aperti a discuterne e a fornire ulteriori miglioramenti.
const { WebpackManifestPlugin } = require('webpack-manifest-plugin');
plugins: [
...
new WebpackManifestPlugin({
// facoltativo, dipende dalla tua implementazione
removeKeyHash: true,
}),
...
],
Manifesto con altri bundler
Non esiste alcun feedback con altri bundler utilizzati con i plugin del tema, ma con esbuild
potrebbe essere possibile generare manifesti.
Alternative:
Componenti dell'UI
I componenti dell'UI sono una funzionalità sperimentale utilizzabile da verdaccio@5.x, aperta alle modifiche e ai feedback.
Creare una nuova interfaccia utente da zero è un grande sforzo, ma per facilitare il compito, esiste il pacchetto @verdaccio/ui-components. I componenti si basano sulla libreria React e Material UI.
Il pacchetto esporta parte dell'interfaccia dell'utente che potrebbe essere riutilizzata:
- Hook di React
- Fornitori (API di React Context)
- Componenti
- Sezioni: (Barra laterale, Dettaglio, Intestazione, Pagina Home e Piè di Pagina)