Bootstrap & Webpack
Den officiella guiden för hur du inkluderar och paketerar Bootstraps CSS och JavaScript i ditt projekt med hjälp av Webpack.
Uppstart
Vi bygger ett Webpack-projekt med Bootstrap från grunden, så det finns några förutsättningar och steg i förväg innan vi verkligen kan komma igång. Den här guiden kräver att du har Node.js installerat och att du känner till terminalen.
-
Skapa en projektmapp och ställ in npm. Vi skapar
my-project
mappen och initierar npm med-y
argumentet för att undvika att det ställer oss alla interaktiva frågor.mkdir my-project && cd my-project npm init -y
-
Installera Webpack. Därefter måste vi installera våra Webpack-utvecklingsberoenden:
webpack
för kärnan i Webpack,webpack-cli
så att vi kan köra Webpack-kommandon från terminalen, ochwebpack-dev-server
så att vi kan köra en lokal utvecklingsserver. Vi använder--save-dev
för att signalera att dessa beroenden endast är för utvecklingsbruk och inte för produktion.npm i --save-dev webpack webpack-cli webpack-dev-server
-
Installera Bootstrap. Nu kan vi installera Bootstrap. Vi kommer också att installera Popper eftersom våra rullgardinsmenyer, popovers och verktygstips är beroende av den för deras placering. Om du inte planerar att använda dessa komponenter kan du utelämna Popper här.
npm i --save bootstrap @popperjs/core
-
Installera ytterligare beroenden. Förutom Webpack och Bootstrap behöver vi några fler beroenden för att korrekt importera och bunta Bootstraps CSS och JS med Webpack. Dessa inkluderar Sass, vissa lastare och Autoprefixer.
npm i --save-dev autoprefixer css-loader postcss-loader sass sass-loader style-loader
Nu när vi har alla nödvändiga beroenden installerade kan vi börja arbeta med att skapa projektfilerna och importera Bootstrap.
Projektets struktur
Vi har redan skapat my-project
mappen och initierat npm. Nu ska vi också skapa våra src
och dist
mappar för att avrunda projektstrukturen. Kör följande från my-project
, eller skapa manuellt mapp- och filstrukturen som visas nedan.
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 är klar bör ditt kompletta projekt se ut så här:
my-project/
├── dist/
│ └── index.html
├── src/
│ ├── js/
│ │ └── main.js
│ └── scss/
│ └── styles.scss
├── package-lock.json
├── package.json
└── webpack.config.js
Vid det här laget är allt på rätt plats, men Webpack kommer inte att fungera eftersom vi inte har fyllt i vår webpack.config.js
än.
Konfigurera Webpack
Med beroenden installerade och vår projektmapp redo för oss att börja koda, kan vi nu konfigurera Webpack och köra vårt projekt lokalt.
-
Öppna
webpack.config.js
i din editor. Eftersom den är tom, måste vi lägga till några boilerplate-konfigurationer till den så att vi kan starta vår server. Den här delen av konfigurationen säger att Webpack skulle leta efter vårt projekts JavaScript, var den kompilerade koden ska matas ut till (dist
), och hur utvecklingsservern ska bete sig (dra fråndist
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 } }
-
Därefter fyller vi i vår
dist/index.html
. Det här är HTML-sidan som Webpack kommer att ladda i webbläsaren för att använda den medföljande CSS och JS som vi lägger till i senare steg. Innan vi kan göra det måste vi ge det något att rendera och inkluderaoutput
JS från föregående steg.<!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 inkluderar lite Bootstrap-styling här med
div class="container"
och<button>
så att vi ser när Bootstraps CSS laddas av Webpack. -
Nu behöver vi ett npm-skript för att köra Webpack. Öppna
package.json
och lägg tillstart
skriptet som visas nedan (du bör redan ha testskriptet). Vi kommer att använda det här skriptet för att starta vår lokala Webpack-dev-server.{ // ... "scripts": { "start": "webpack serve --mode development", "test": "echo \"Error: no test specified\" && exit 1" }, // ... }
-
Och äntligen kan vi starta Webpack. Kör det nyligen tillagda npm-skriptet från
my-project
mappen i din terminal:npm start
I nästa och sista avsnitt i den här guiden kommer vi att ställa in Webpack-laddare och importera alla Bootstraps CSS och JavaScript.
Importera Bootstrap
Att importera Bootstrap till Webpack kräver de laddare som vi installerade i det första avsnittet. Vi har installerat dem med npm, men nu måste Webpack konfigureras för att använda dem.
-
Ställ in lastarna i
webpack.config.js
. Din konfigurationsfil är nu klar och bör matcha kodavsnittet nedan. Den enda nya delen här ärmodule
avsnittet.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' } ] } ] } }
Här är en sammanfattning av varför vi behöver alla dessa lastare.
style-loader
injicerar CSS i ett<style>
element i<head>
HTML-sidan,css-loader
hjälper till med att använda@import
ochurl()
,postcss-loader
krävs för Autoprefixer ochsass-loader
låter oss använda Sass. -
Låt oss nu importera Bootstraps CSS. Lägg till följande för
src/scss/styles.scss
att importera alla Bootstraps käll Sass.// Import all of Bootstrap's CSS @import "~bootstrap/scss/bootstrap";
Du kan även importera våra stilmallar individuellt om du vill. Läs våra Sass-importdokument för detaljer.
-
Därefter laddar vi CSS och importerar Bootstraps JavaScript. Lägg till följande för
src/js/main.js
att ladda CSS och importera alla Bootstraps JS. Popper kommer att importeras automatiskt via Bootstrap.// Import our custom CSS import '../scss/styles.scss' // Import all of Bootstrap's JS import * as bootstrap from 'bootstrap'
Du kan också importera JavaScript-plugins individuellt efter behov för att hålla nere paketstorlekar:
import Alert from 'bootstrap/js/dist/alert' // or, specify which plugins you need: import { Tooltip, Toast, Popover } from 'bootstrap'
Läs våra JavaScript-dokument för mer information om hur du använder Bootstraps plugins.
-
Och du är klar! 🎉 Med Bootstraps källkod Sass och JS fulladdat bör din lokala utvecklingsserver nu se ut så här.
Nu kan du börja lägga till alla Bootstrap-komponenter du vill använda. Se till att kolla in det kompletta Webpack-exempelprojektet för att inkludera ytterligare anpassade Sass och optimera din build genom att endast importera de delar av Bootstraps CSS och JS som du behöver.
Produktionsoptimeringar
Beroende på din inställning kanske du vill implementera några ytterligare säkerhets- och hastighetsoptimeringar som är användbara för att köra projektet i produktion. Observera att dessa optimeringar inte tillämpas på Webpack-exempelprojektet och är upp till dig att implementera.
Extraherar CSS
Den style-loader
vi konfigurerade ovan skickar bekvämt ut CSS i paketet så att manuell inläsning av en CSS-fil dist/index.html
inte är nödvändig. Det här tillvägagångssättet kanske inte fungerar med en strikt innehållssäkerhetspolicy, och det kan bli en flaskhals i din applikation på grund av den stora paketstorleken.
För att separera CSS så att vi kan ladda den direkt från dist/index.html
, använd mini-css-extract-loader
Webpack-plugin.
Installera först plugin:
npm install --save-dev mini-css-extract-plugin
Instantiera och använd sedan plugin-programmet 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 att ha körts npm run build
igen kommer det att finnas en ny fil dist/main.css
som innehåller all CSS som importerats av src/js/main.js
. Om du tittar dist/index.html
i din webbläsare nu kommer stilen att saknas, eftersom den är nu i dist/main.css
. Du kan inkludera den genererade CSS i dist/index.html
så här:
--- 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>
Extraherar SVG-filer
Bootstraps CSS innehåller flera referenser till SVG-filer via inline data:
URI:er. Om du definierar en innehållssäkerhetspolicy för ditt projekt som blockerar data:
URI:er för bilder, kommer dessa SVG-filer inte att laddas. Du kan komma runt det här problemet genom att extrahera de inbyggda SVG-filerna med hjälp av Webpacks funktion för tillgångsmoduler.
Konfigurera Webpack för att extrahera inline SVG-filer så här:
--- 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: [
När du har kört npm run build
igen hittar du SVG-filerna extraherade i dist/icons
och korrekt refererade från CSS.
Ser du något fel eller inaktuellt här? Öppna ett problem på GitHub . Behöver du hjälp med felsökning? Sök eller starta en diskussion på GitHub.