Bootstrap & Webpack
Den officielle guide til, hvordan du inkluderer og bundter Bootstraps CSS og JavaScript i dit projekt ved hjælp af Webpack.
Opsætning
Vi er ved at bygge et Webpack-projekt med Bootstrap fra bunden, så der er nogle forudsætninger og forhåndstrin, før vi rigtig kan komme i gang. Denne vejledning kræver, at du har Node.js installeret og en vis fortrolighed med terminalen.
-
Opret en projektmappe og opsæt npm. Vi opretter
my-project
mappen og initialiserer npm med-y
argumentet for at undgå, at det stiller os alle de interaktive spørgsmål.mkdir my-project && cd my-project npm init -y
-
Installer Webpack. Dernæst skal vi installere vores Webpack-udviklingsafhængigheder:
webpack
for kernen af Webpack,webpack-cli
så vi kan køre Webpack-kommandoer fra terminalen, ogwebpack-dev-server
så vi kan køre en lokal udviklingsserver. Vi bruger--save-dev
til at signalere, at disse afhængigheder kun er til udviklingsbrug og ikke til produktion.npm i --save-dev webpack webpack-cli webpack-dev-server
-
Installer Bootstrap. Nu kan vi installere Bootstrap. Vi vil også installere Popper, da vores dropdowns, popovers og værktøjstip afhænger af det for deres placering. Hvis du ikke planlægger at bruge disse komponenter, kan du udelade Popper her.
npm i --save bootstrap @popperjs/core
-
Installer yderligere afhængigheder. Ud over Webpack og Bootstrap har vi brug for et par flere afhængigheder for korrekt at importere og bundle Bootstraps CSS og JS med Webpack. Disse omfatter Sass, nogle læssere og Autoprefixer.
npm i --save-dev autoprefixer css-loader postcss-loader sass sass-loader style-loader
Nu hvor vi har alle de nødvendige afhængigheder installeret, kan vi komme i gang med at oprette projektfilerne og importere Bootstrap.
Projektets struktur
Vi har allerede oprettet my-project
mappen og initialiseret npm. Nu vil vi også oprette vores src
og dist
mapper for at afrunde projektstrukturen. Kør følgende fra my-project
, eller opret manuelt mappen og filstrukturen vist nedenfor.
mkdir {dist,src,src/js,src/scss}
touch dist/index.html src/js/main.js src/scss/styles.scss webpack.config.js
Når du er færdig, skal dit komplette projekt se sådan ud:
my-project/
├── dist/
│ └── index.html
├── src/
│ ├── js/
│ │ └── main.js
│ └── scss/
│ └── styles.scss
├── package-lock.json
├── package.json
└── webpack.config.js
På dette tidspunkt er alt på det rigtige sted, men Webpack virker ikke, fordi vi ikke har udfyldt vores webpack.config.js
endnu.
Konfigurer Webpack
Med afhængigheder installeret og vores projektmappe klar til, at vi kan begynde at kode, kan vi nu konfigurere Webpack og køre vores projekt lokalt.
-
Åbn
webpack.config.js
i din editor. Da det er tomt, bliver vi nødt til at tilføje nogle boilerplate-konfigurationer til det, så vi kan starte vores server. Denne del af konfigurationen fortæller, at Webpack skulle lede efter vores projekts JavaScript, hvor den kompilerede kode skal udlæses (dist
), og hvordan udviklingsserveren skal opføre sig (trække fradist
mappen med 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 } }
-
Dernæst udfylder vi vores
dist/index.html
. Dette er HTML-siden, som Webpack vil indlæse i browseren for at bruge den medfølgende CSS og JS, som vi tilføjer til den i senere trin. Før vi kan gøre det, skal vi give det noget at gengive og inkludereoutput
JS fra det forrige trin.<!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>
Vi inkluderer en lille smule Bootstrap-styling her med
div class="container"
og<button>
, så vi kan se, hvornår Bootstraps CSS er indlæst af Webpack. -
Nu har vi brug for et npm-script for at køre Webpack. Åbn
package.json
og tilføjstart
scriptet vist nedenfor (du burde allerede have testscriptet). Vi bruger dette script til at starte vores lokale Webpack-udviklerserver.{ // ... "scripts": { "start": "webpack serve --mode development", "test": "echo \"Error: no test specified\" && exit 1" }, // ... }
-
Og endelig kan vi starte Webpack. Kør det nyligt tilføjede npm-script fra
my-project
mappen i din terminal:npm start
I det næste og sidste afsnit af denne vejledning opsætter vi Webpack-indlæserne og importerer alle Bootstraps CSS og JavaScript.
Importer Bootstrap
Import af Bootstrap til Webpack kræver de indlæsere, vi installerede i den første sektion. Vi har installeret dem med npm, men nu skal Webpack konfigureres til at bruge dem.
-
Sæt læsserne op i
webpack.config.js
. Din konfigurationsfil er nu færdig og bør matche uddraget nedenfor. Den eneste nye del her ermodule
afsnittet.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' } ] } ] } }
Her er en opsummering af, hvorfor vi har brug for alle disse læssere.
style-loader
injicerer CSS'en i et<style>
element i<head>
HTML-siden,css-loader
hjælper med at bruge@import
ogurl()
,postcss-loader
er påkrævet for Autoprefixer ogsass-loader
giver os mulighed for at bruge Sass. -
Lad os nu importere Bootstraps CSS. Tilføj følgende til
src/scss/styles.scss
for at importere hele Bootstraps kilde Sass.// Import all of Bootstrap's CSS @import "~bootstrap/scss/bootstrap";
Du kan også importere vores stylesheets individuelt, hvis du ønsker det. Læs vores Sass-importdokumenter for detaljer.
-
Dernæst indlæser vi CSS'en og importerer Bootstraps JavaScript. Tilføj følgende til
src/js/main.js
for at indlæse CSS og importere alle Bootstraps JS. Popper importeres automatisk gennem Bootstrap.// Import our custom CSS import '../scss/styles.scss' // Import all of Bootstrap's JS import * as bootstrap from 'bootstrap'
Du kan også importere JavaScript-plugins individuelt efter behov for at holde bundtstørrelserne nede:
import Alert from 'bootstrap/js/dist/alert' // or, specify which plugins you need: import { Tooltip, Toast, Popover } from 'bootstrap'
Læs vores JavaScript -dokumenter for mere information om, hvordan du bruger Bootstraps plugins.
-
Og du er færdig! 🎉 Med Bootstraps kilde Sass og JS fuldt indlæst, skulle din lokale udviklingsserver nu se sådan ud.
Nu kan du begynde at tilføje alle Bootstrap-komponenter, du vil bruge. Sørg for at tjekke det komplette Webpack-eksempelprojekt for, hvordan du inkluderer yderligere tilpasset Sass og optimerer din build ved kun at importere de dele af Bootstraps CSS og JS, du har brug for.
Produktionsoptimeringer
Afhængigt af din opsætning vil du måske implementere nogle yderligere sikkerheds- og hastighedsoptimeringer, der er nyttige til at køre projektet i produktion. Bemærk, at disse optimeringer ikke anvendes på Webpack-eksempelprojektet og er op til dig at implementere.
Udpakning af CSS
Det style-loader
, vi konfigurerede ovenfor, udsender bekvemt CSS i bundtet, så det dist/index.html
ikke er nødvendigt at indlæse en CSS-fil manuelt. Denne tilgang virker muligvis ikke med en streng indholdssikkerhedspolitik, og den kan blive en flaskehals i din applikation på grund af den store bundtstørrelse.
For at adskille CSS'en, så vi kan indlæse den direkte fra dist/index.html
, skal du bruge mini-css-extract-loader
Webpack-plugin'et.
Installer først pluginnet:
npm install --save-dev mini-css-extract-plugin
Foretag og brug derefter pluginnet i Webpack-konfigurationen:
--- 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
},
{
Efter at have kørt npm run build
igen, vil der være en ny fil dist/main.css
, som vil indeholde al CSS importeret af src/js/main.js
. Hvis du ser dist/index.html
i din browser nu, vil stilen mangle, da den nu er i dist/main.css
. Du kan inkludere den genererede CSS i dist/index.html
sådan her:
--- 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>
Udpakning af SVG-filer
Bootstraps CSS indeholder flere referencer til SVG-filer via inline- data:
URI'er. Hvis du definerer en indholdssikkerhedspolitik for dit projekt, der blokerer data:
URI'er for billeder, indlæses disse SVG-filer ikke. Du kan omgå dette problem ved at udpakke de indbyggede SVG-filer ved hjælp af Webpacks aktivmoduler.
Konfigurer Webpack til at udpakke inline SVG-filer som dette:
--- 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: [
Efter at have kørt npm run build
igen, vil du finde SVG-filerne udtrukket i dist/icons
og korrekt refereret fra CSS.
Ser du noget forkert eller forældet her? Åbn venligst et problem på GitHub . Har du brug for hjælp til fejlfinding? Søg eller start en diskussion på GitHub.