I bundler di moduli JavaScript possono fare molte cose, ma una delle loro funzionalità più utili è la possibilità di aggiungere e utilizzare librerie esterne nella base di codice. I bundler di moduli leggono i percorsi di importazione nel codice e combinano (raggruppano) il codice specifico dell'applicazione con il codice della libreria importata.
A partire dalla versione 9, l'API Firebase JavaScript modulare è ottimizzata per funzionare con le funzionalità di ottimizzazione dei bundler di moduli per ridurre la quantità di codice Firebase incluso nella build finale.
import { initializeApp } from 'firebase/app';
import { getAuth, onAuthStateChanged, getRedirectResult } from 'firebase/auth';
const firebaseApp = initializeApp({ /* config */ });
const auth = getAuth(firebaseApp);
onAuthStateChanged(auth, user => { /* check status */ });
/**
* getRedirectResult is unused and should not be included in the code base.
* In addition, there are many other functions within firebase/auth that are
* not imported and therefore should not be included as well.
*/
Questa procedura di eliminazione del codice inutilizzato da una libreria è nota come tree shaking. Rimuovere manualmente questo codice richiederebbe molto tempo e sarebbe soggetto a errori, ma i bundler di moduli possono automatizzare questa rimozione.
Nell'ecosistema JavaScript esistono molti bundler di moduli di alta qualità. Questa guida si concentra sull'utilizzo di Firebase con webpack, Rollup e esbuild.
Inizia
Questa guida richiede l'installazione di npm nell'ambiente di sviluppo. npm viene utilizzato per installare e gestire le dipendenze (librerie). Per installare npm, installa Node.js, che include npm automaticamente.
La maggior parte degli sviluppatori è configurata correttamente dopo aver installato Node.js. Tuttavia, molti sviluppatori riscontrano problemi comuni durante la configurazione dell'ambiente. Se riscontri errori, assicurati che nel tuo ambiente sia presente l'interfaccia a riga di comando npm e di aver configurato le autorizzazioni corrette in modo da non dover installare i pacchetti come amministratore con il comando sudo.
package.json e installazione di Firebase
Una volta installato npm, devi creare un file package.json
nella
directory principale del tuo progetto locale. Genera questo file con il seguente comando npm:
npm init
Verrà visualizzata una procedura guidata per fornire le informazioni necessarie. Una volta creato, il file sarà simile al seguente:
{
"name": "your-package-name",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
}
}
Questo file è responsabile di molte cose diverse. Si tratta di un file importante da
conoscere se vuoi saperne di più sul raggruppamento dei moduli e sulla
creazione di codice JavaScript in generale. L'elemento importante di questa guida è l'oggetto
"dependencies"
. Questo oggetto conterrà una coppia chiave-valore della libreria
che hai installato e della versione che utilizza.
L'aggiunta di dipendenze viene eseguita tramite il comando npm install
o npm i
.
npm i firebase
Quando esegui npm i firebase
, la procedura di installazione aggiornerà
package.json
per elencare Firebase come dipendenza:
"dependencies": {
"firebase": "^9.0.0"
},
La chiave è il nome della libreria e il valore è la versione da utilizzare. Il valore della versione è flessibile e può accettare una serie di valori. Questo meccanismo è noto come controllo delle versioni semantico o semver. Per saperne di più su semver, consulta la guida di npm sul controllo delle versioni semantico.
Cartelle di origine e di build
Il codice che scrivi viene letto ed elaborato da un bundler di moduli e quindi restituito come un nuovo file o un nuovo insieme di file. È importante separare questi due tipi di file. Il codice letto ed elaborato dai bundler di moduli è noto come codice "sorgente". I file che generano sono noti come codice compilato o "dist" (distribuzione).
Una configurazione comune nei codebase è quella di archiviare il codice sorgente in una cartella denominata src
e il codice compilato in una cartella denominata dist
.
- src
|_ index.js
|_ animations.js
|_ datalist.js
- dist
|_ bundle.js
Nella struttura di file di esempio riportata sopra, considera che index.js
importa sia
animations.js
che datalist.js
. Quando un bundler di moduli elabora il codice sorgente, produce il file bundle.js
nella cartella dist
. bundle.js
è una combinazione dei file nella cartella src
e di tutte le librerie importate
inoltre.
Se utilizzi sistemi di controllo del codice sorgente come Git, è prassi comune ignorare la cartella
dist
quando memorizzi questo codice nel repository principale.
Entry point
Tutti i bundler di moduli hanno un concetto di punto di ingresso. Puoi pensare alla tua applicazione come a un albero di file. Un file importa il codice da un altro e così via. Ciò significa che un file sarà la radice dell'albero. Questo file è noto come punto di ingresso.
Torniamo all'esempio precedente di struttura dei file.
- src
|_ index.js
|_ animations.js
|_ datalist.js
- dist
|_ bundle.js
// src/index.js
import { animate } from './animations';
import { createList } from './datalist';
// This is not real code, but for example purposes only
const theList = createList('users/123/tasks');
theList.addEventListener('loaded', event => {
animate(theList);
});
Il file src/index.js
è considerato il punto di ingresso perché inizia
le importazioni di tutto il codice necessario per l'applicazione. Questo file del punto di ingresso viene
utilizzato dai bundler di moduli per iniziare il processo di bundling.
Utilizzo di Firebase con webpack
Non è necessaria alcuna configurazione specifica per le app Firebase e webpack. Questa sezione tratta una configurazione webpack generale.
Il primo passaggio consiste nell'installare webpack da npm come dipendenza di sviluppo.
npm i webpack webpack-cli -D
Crea un file nella directory principale del progetto locale denominato webpack.config.js
e
aggiungi il seguente codice.
const path = require('path');
module.exports = {
// The entry point file described above
entry: './src/index.js',
// The location of the build folder described above
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js'
},
// Optional and for development only. This provides the ability to
// map the built code back to the original source format when debugging.
devtool: 'eval-source-map',
};
Poi assicurati di aver installato Firebase come dipendenza.
npm i firebase
Quindi, inizializza Firebase nella tua base di codice. Il seguente codice importa e inizializza Firebase in un file punto di ingresso e utilizza Firestore Lite per caricare un documento "city".
// src/index.js
import { initializeApp } from 'firebase/app';
import { getFirestore, doc, getDoc } from 'firebase/firestore/lite';
const firebaseApp = initializeApp({ /* config */ });
const db = getFirestore(firebaseApp);
async function loadCity(name) {
const cityDoc = doc(db, `cities/${name}`);
const snapshot = await getDoc(cityDoc);
return {
id: snapshot.id,
...snapshot.data(),
};
}
Il passaggio successivo consiste nell'aggiungere uno script npm
per eseguire la build di webpack. Apri il file package.json
e aggiungi la seguente coppia chiave-valore all'oggetto "scripts"
.
"scripts": {
"build": "webpack --mode=development"
},
Per eseguire webpack e generare la cartella di build, esegui questo comando.
npm run build
Infine, controlla la cartella di build dist
. Deve contenere un file denominato
bundle.js
che contiene il codice dell'applicazione e delle dipendenze in bundle.
Per ulteriori informazioni sull'ottimizzazione della build webpack per la produzione, consulta la documentazione ufficiale sull'impostazione di configurazione "mode".
Utilizzo di Firebase con Rollup
Non è necessaria alcuna configurazione specifica per le app Firebase e Rollup. Questa sezione descrive una configurazione di Rollup generale.
Il primo passaggio consiste nell'installare Rollup e un plug-in utilizzato per mappare le importazioni alle dipendenze installate con npm.
npm i rollup @rollup/plugin-node-resolve -D
Crea un file nella root del progetto locale denominato rollup.config.js
e aggiungi il seguente codice.
import { nodeResolve } from '@rollup/plugin-node-resolve';
export default {
// the entry point file described above
input: 'src/index.js',
// the output for the build folder described above
output: {
file: 'dist/bundle.js',
// Optional and for development only. This provides the ability to
// map the built code back to the original source format when debugging.
sourcemap: 'inline',
// Configure Rollup to convert your module code to a scoped function
// that "immediate invokes". See the Rollup documentation for more
// information: https://rollupjs.org/guide/en/#outputformat
format: 'iife'
},
// Add the plugin to map import paths to dependencies
// installed with npm
plugins: [nodeResolve()]
};
Quindi, inizializza Firebase nella tua base di codice. Il seguente codice importa e inizializza Firebase in un file punto di ingresso e utilizza Firestore Lite per caricare un documento "city".
// src/index.js
import { initializeApp } from 'firebase/app';
import { getFirestore, doc, getDoc } from 'firebase/firestore/lite';
const firebaseApp = initializeApp({ /* config */ });
const db = getFirestore(firebaseApp);
async function loadCity(name) {
const cityDoc = doc(db, `cities/${name}`);
const snapshot = await getDoc(cityDoc);
return {
id: snapshot.id,
...snapshot.data(),
};
}
Il passaggio successivo consiste nell'aggiungere uno script npm
per eseguire la build di Rollup. Apri il file package.json
e aggiungi la seguente coppia chiave-valore all'oggetto "scripts"
.
"scripts": {
"build": "rollup -c rollup.config.js"
},
Per eseguire il rollup e generare la cartella di build, esegui questo comando.
npm run build
Infine, controlla la cartella di build dist
. Deve contenere un file denominato
bundle.js
che contiene il codice dell'applicazione e delle dipendenze in bundle.
Per saperne di più sull'ottimizzazione della build di Rollup per la produzione, consulta la documentazione ufficiale sui plug-in per le build di produzione.
Utilizzo di Firebase con esbuild
Non è necessaria alcuna configurazione specifica per le app Firebase ed esbuild. Questa sezione tratta una configurazione esbuild generale.
Il primo passaggio consiste nell'installazione di esbuild come dipendenza di sviluppo.
npm i esbuild -D
Crea un file nella directory principale del progetto locale denominato esbuild.config.js
e
aggiungi il seguente codice.
require('esbuild').build({
// the entry point file described above
entryPoints: ['src/index.js'],
// the build folder location described above
outfile: 'dist/bundle.js',
bundle: true,
// Replace with the browser versions you need to target
target: ['chrome60', 'firefox60', 'safari11', 'edge20'],
// Optional and for development only. This provides the ability to
// map the built code back to the original source format when debugging.
sourcemap: 'inline',
}).catch(() => process.exit(1))
Quindi, inizializza Firebase nella tua base di codice. Il seguente codice importa e inizializza Firebase in un file punto di ingresso e utilizza Firestore Lite per caricare un documento "city".
// src/index.js
import { initializeApp } from 'firebase/app';
import { getFirestore, doc, getDoc } from 'firebase/firestore/lite';
const firebaseApp = initializeApp({ /* config */ });
const db = getFirestore(firebaseApp);
async function loadCity(name) {
const cityDoc = doc(db, `cities/${name}`);
const snapshot = await getDoc(cityDoc);
return {
id: snapshot.id,
...snapshot.data(),
};
}
Il passaggio successivo consiste nell'aggiungere uno script npm
per eseguire esbuild. Apri il file package.json
e aggiungi
la seguente coppia chiave-valore all'oggetto "scripts"
.
"scripts": {
"build": "node ./esbuild.config.js"
},
Infine, controlla la cartella di build dist
. Deve contenere un file denominato
bundle.js
che contiene il codice dell'applicazione e delle dipendenze in bundle.
Per ulteriori informazioni sull'ottimizzazione di esbuild per la produzione, consulta la documentazione ufficiale sulla minimizzazione e altre ottimizzazioni.