Bootstrap & Webpack
De officiële gids voor het opnemen en bundelen van Bootstrap's CSS en JavaScript in uw project met behulp van Webpack.
Opstelling
We bouwen vanaf het begin een Webpack-project met Bootstrap, dus er zijn enkele vereisten en stappen vooraf voordat we echt aan de slag kunnen. Deze handleiding vereist dat u Node.js hebt geïnstalleerd en enige bekendheid met de terminal.
-
Maak een projectmap en stel npm in. We zullen de
my-project
map maken en npm initialiseren met het-y
argument om te voorkomen dat het ons alle interactieve vragen stelt.mkdir my-project && cd my-project npm init -y
-
Installeer Webpack. Vervolgens moeten we onze Webpack-ontwikkelingsafhankelijkheden installeren:
webpack
voor de kern van Webpack,webpack-cli
zodat we Webpack-commando's kunnen uitvoeren vanaf de terminal, enwebpack-dev-server
zodat we een lokale ontwikkelingsserver kunnen draaien. We gebruiken--save-dev
om aan te geven dat deze afhankelijkheden alleen voor ontwikkelingsgebruik zijn en niet voor productie.npm i --save-dev webpack webpack-cli webpack-dev-server
-
Installeer Bootstrap. Nu kunnen we Bootstrap installeren. We zullen Popper ook installeren omdat onze dropdowns, popovers en tooltips ervan afhankelijk zijn voor hun positionering. Als u niet van plan bent deze componenten te gebruiken, kunt u Popper hier weglaten.
npm i --save bootstrap @popperjs/core
-
Installeer extra afhankelijkheden. Naast Webpack en Bootstrap hebben we nog een paar afhankelijkheden nodig om de CSS en JS van Bootstrap correct te importeren en te bundelen met Webpack. Deze omvatten Sass, sommige laders en Autoprefixer.
npm i --save-dev autoprefixer css-loader postcss-loader sass sass-loader style-loader
Nu we alle benodigde afhankelijkheden hebben geïnstalleerd, kunnen we aan de slag met het maken van de projectbestanden en het importeren van Bootstrap.
Projectstructuur
We hebben de my-project
map al gemaakt en npm geïnitialiseerd. Nu zullen we ook onze src
en dist
mappen maken om de projectstructuur af te ronden. Voer het volgende uit vanaf my-project
, of maak handmatig de onderstaande map en bestandsstructuur aan.
mkdir {dist,src,src/js,src/scss}
touch dist/index.html src/js/main.js src/scss/styles.scss webpack.config.js
Als u klaar bent, ziet uw volledige project er als volgt uit:
my-project/
├── dist/
│ └── index.html
├── src/
│ ├── js/
│ │ └── main.js
│ └── scss/
│ └── styles.scss
├── package-lock.json
├── package.json
└── webpack.config.js
Op dit moment staat alles op de goede plek, maar Webpack werkt niet omdat we onze nog niet hebben ingevuld webpack.config.js
.
Webpack configureren
Nu afhankelijkheden zijn geïnstalleerd en onze projectmap klaar is om te beginnen met coderen, kunnen we nu Webpack configureren en ons project lokaal uitvoeren.
-
Openen
webpack.config.js
in je editor. Omdat het leeg is, moeten we er een standaardconfiguratie aan toevoegen, zodat we onze server kunnen starten. Dit deel van de configuratie vertelt Webpack dat het moet zoeken naar het JavaScript van ons project, waar de gecompileerde code moet worden uitgevoerd (dist
), en hoe de ontwikkelserver zich moet gedragen (uit dedist
map halen met hot reload).const path = require('path') module.exports = { entry: './src/js/main.js', output: { filename: 'main.js', path: path.resolve(__dirname, 'dist') }, devServer: { static: path.resolve(__dirname, 'dist'), port: 8080, hot: true } }
-
Vervolgens vullen we onze
dist/index.html
. Dit is de HTML-pagina die Webpack in de browser laadt om de gebundelde CSS en JS te gebruiken die we er in latere stappen aan zullen toevoegen. Voordat we dat kunnen doen, moeten we het iets geven om te renderen en deoutput
JS van de vorige stap opnemen.<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Bootstrap w/ Webpack</title> </head> <body> <div class="container py-4 px-3 mx-auto"> <h1>Hello, Bootstrap and Webpack!</h1> <button class="btn btn-primary">Primary button</button> </div> <script src="./main.js"></script> </body> </html>
We voegen hier een klein beetje Bootstrap-styling toe met de
div class="container"
en<button>
zodat we kunnen zien wanneer Bootstrap's CSS wordt geladen door Webpack. -
Nu hebben we een npm-script nodig om Webpack uit te voeren. Open
package.json
en voeg hetstart
onderstaande script toe (u zou het testscript al moeten hebben). We gebruiken dit script om onze lokale Webpack-ontwikkelserver te starten.{ // ... "scripts": { "start": "webpack serve --mode development", "test": "echo \"Error: no test specified\" && exit 1" }, // ... }
-
En tot slot kunnen we Webpack starten. Voer vanuit de
my-project
map in uw terminal dat nieuw toegevoegde npm-script uit:npm start
In het volgende en laatste deel van deze handleiding zullen we de Webpack-laders instellen en alle CSS en JavaScript van Bootstrap importeren.
Bootstrap importeren
Voor het importeren van Bootstrap in Webpack zijn de laders vereist die we in de eerste sectie hebben geïnstalleerd. We hebben ze met npm geïnstalleerd, maar nu moet Webpack worden geconfigureerd om ze te gebruiken.
-
Stel de laders in in
webpack.config.js
. Uw configuratiebestand is nu compleet en moet overeenkomen met het onderstaande fragment. Het enige nieuwe deel hier is demodule
sectie.const path = require('path') module.exports = { entry: './src/js/main.js', output: { filename: 'main.js', path: path.resolve(__dirname, 'dist') }, devServer: { static: path.resolve(__dirname, 'dist'), port: 8080, hot: true }, module: { rules: [ { test: /\.(scss)$/, use: [ { loader: 'style-loader' }, { loader: 'css-loader' }, { loader: 'postcss-loader', options: { postcssOptions: { plugins: () => [ require('autoprefixer') ] } } }, { loader: 'sass-loader' } ] } ] } }
Hier is een samenvatting van waarom we al deze laders nodig hebben.
style-loader
injecteert de CSS in een<style>
element in<head>
de HTML-pagina,css-loader
helpt bij het gebruik@import
enurl()
,postcss-loader
is vereist voor Autoprefixer ensass-loader
stelt ons in staat Sass te gebruiken. -
Laten we nu de CSS van Bootstrap importeren. Voeg het volgende toe aan
src/scss/styles.scss
om alle Sass-bronnen van Bootstrap te importeren.// Import all of Bootstrap's CSS @import "~bootstrap/scss/bootstrap";
U kunt onze stylesheets ook afzonderlijk importeren als u dat wilt. Lees onze Sass-importdocumenten voor meer informatie.
-
Vervolgens laden we de CSS en importeren we Bootstrap's JavaScript. Voeg het volgende toe
src/js/main.js
aan om de CSS te laden en alle JS van Bootstrap te importeren. Popper wordt automatisch geïmporteerd via Bootstrap.// Import our custom CSS import '../scss/styles.scss' // Import all of Bootstrap's JS import * as bootstrap from 'bootstrap'
U kunt indien nodig ook afzonderlijk JavaScript-plug-ins importeren om de bundelgroottes laag te houden:
import Alert from 'bootstrap/js/dist/alert' // or, specify which plugins you need: import { Tooltip, Toast, Popover } from 'bootstrap'
Lees onze JavaScript-documenten voor meer informatie over het gebruik van de plug-ins van Bootstrap.
-
En je bent klaar! 🎉 Met de bron Sass en JS van Bootstrap volledig geladen, zou uw lokale ontwikkelingsserver er nu zo uit moeten zien.
Nu kunt u beginnen met het toevoegen van alle Bootstrap-componenten die u wilt gebruiken. Zorg ervoor dat u het volledige Webpack-voorbeeldproject bekijkt om te zien hoe u extra aangepaste Sass kunt opnemen en uw build kunt optimaliseren door alleen de delen van Bootstrap's CSS en JS te importeren die u nodig hebt.
Productie optimalisaties
Afhankelijk van je setup, wil je misschien wat extra beveiliging en snelheidsoptimalisaties implementeren die nuttig zijn voor het uitvoeren van het project in productie. Houd er rekening mee dat deze optimalisaties niet worden toegepast op het Webpack-voorbeeldproject en dat u ze zelf moet implementeren.
CSS extraheren
De style-loader
hierboven geconfigureerde CSS verzendt gemakkelijk CSS naar de bundel, zodat het handmatig laden van een CSS-bestand dist/index.html
niet nodig is. Deze aanpak werkt echter mogelijk niet met een strikt beleid voor inhoudsbeveiliging en kan een knelpunt in uw toepassing worden vanwege de grote bundelgrootte.
dist/index.html
Gebruik de mini-css-extract-loader
Webpack-plug- in om de CSS te scheiden zodat we deze rechtstreeks vanuit kunnen laden .
Installeer eerst de plug-in:
npm install --save-dev mini-css-extract-plugin
Instantieer en gebruik vervolgens de plug-in in de Webpack-configuratie:
--- a/webpack/webpack.config.js
+++ b/webpack/webpack.config.js
@@ -1,8 +1,10 @@
+const miniCssExtractPlugin = require('mini-css-extract-plugin')
const path = require('path')
module.exports = {
mode: 'development',
entry: './src/js/main.js',
+ plugins: [new miniCssExtractPlugin()],
output: {
filename: "main.js",
path: path.resolve(__dirname, "dist"),
@@ -18,8 +20,8 @@ module.exports = {
test: /\.(scss)$/,
use: [
{
- // Adds CSS to the DOM by injecting a `<style>` tag
- loader: 'style-loader'
+ // Extracts CSS for each JS file that includes CSS
+ loader: miniCssExtractPlugin.loader
},
{
Nadat het npm run build
opnieuw is uitgevoerd, is er een nieuw bestand dist/main.css
, dat alle CSS bevat die is geïmporteerd door src/js/main.js
. Als u dist/index.html
nu in uw browser bekijkt, zal de stijl ontbreken, zoals deze nu in dist/main.css
. U kunt de gegenereerde CSS dist/index.html
als volgt opnemen:
--- a/webpack/dist/index.html
+++ b/webpack/dist/index.html
@@ -3,6 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="stylesheet" href="./main.css">
<title>Bootstrap w/ Webpack</title>
</head>
<body>
SVG-bestanden uitpakken
De CSS van Bootstrap bevat meerdere verwijzingen naar SVG-bestanden via inline data:
URI's. Als u een inhoudsbeveiligingsbeleid voor uw project definieert dat data:
URI's voor afbeeldingen blokkeert, worden deze SVG-bestanden niet geladen. U kunt dit probleem omzeilen door de inline SVG-bestanden uit te pakken met behulp van de functie voor activamodules van Webpack.
Configureer Webpack om inline SVG-bestanden als volgt uit te pakken:
--- a/webpack/webpack.config.js
+++ b/webpack/webpack.config.js
@@ -16,6 +16,14 @@ module.exports = {
},
module: {
rules: [
+ {
+ mimetype: 'image/svg+xml',
+ scheme: 'data',
+ type: 'asset/resource',
+ generator: {
+ filename: 'icons/[hash].svg'
+ }
+ },
{
test: /\.(scss)$/,
use: [
Nadat u het npm run build
opnieuw hebt uitgevoerd, vindt u de SVG-bestanden die zijn geëxtraheerd in dist/icons
en waarnaar op de juiste manier wordt verwezen vanuit CSS.
Zie je hier iets mis of verouderd? Open een probleem op GitHub . Hulp nodig bij het oplossen van problemen? Zoek of start een discussie op GitHub.