bootstrap-webpack
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseBootstrap 6 with Webpack
使用 Webpack 搭建 Bootstrap 6 项目
Set up a Bootstrap 6 project bundled with Webpack, including the loaders needed to process Sass. Requires Node.js and terminal familiarity.
搭建一个通过 Webpack 打包的 Bootstrap 6 项目,包含处理 Sass 所需的各类 loader。需要具备 Node.js 基础和终端使用经验。
Workflow
工作流程
- Step 1: Set up npm and install dependencies
- Step 2: Create the project structure
- Step 3: Configure Webpack (boilerplate + dev server)
- Step 4: Set up loaders and import Bootstrap
- Step 5: Verify
- Step 6 (optional): Production optimizations
- 步骤 1:配置 npm 并安装依赖
- 步骤 2:创建项目结构
- 步骤 3:配置 Webpack(基础模板 + dev server)
- 步骤 4:配置 loader 并引入 Bootstrap
- 步骤 5:验证配置
- 步骤 6(可选):生产环境优化
Step 1: Set up npm and install dependencies
步骤 1:配置 npm 并安装依赖
-
Create the project and initialize npm:sh
mkdir my-project && cd my-project npm init -y -
Install Webpack and its tooling:sh
npm i --save-dev webpack webpack-cli webpack-dev-server html-webpack-plugin -
Install Bootstrap and its optional peer dependencies (omitif not using menus/popovers/tooltips; omit
@floating-ui/domif not using the datepicker):vanilla-calendar-proshnpm i --save bootstrap@6.0.0-alpha.1 @floating-ui/dom vanilla-calendar-pro -
Install the loaders and Sass/Autoprefixer needed to bundle Bootstrap's CSS:sh
npm i --save-dev autoprefixer css-loader postcss-loader sass sass-loader style-loader
-
创建项目并初始化 npm:sh
mkdir my-project && cd my-project npm init -y -
安装 Webpack 及其相关工具:sh
npm i --save-dev webpack webpack-cli webpack-dev-server html-webpack-plugin -
安装 Bootstrap 及其可选 peer 依赖(如果不使用菜单/弹出框/工具提示,可省略;如果不使用日期选择器,可省略
@floating-ui/dom):vanilla-calendar-proshnpm i --save bootstrap@6.0.0-alpha.1 @floating-ui/dom vanilla-calendar-pro -
安装打包 Bootstrap CSS 所需的 loader 以及 Sass/Autoprefixer:sh
npm i --save-dev autoprefixer css-loader postcss-loader sass sass-loader style-loader
Step 2: Create the project structure
步骤 2:创建项目结构
sh
mkdir {src,src/js,src/scss}
touch src/index.html src/js/main.js src/scss/styles.scss webpack.config.jsTarget layout:
text
my-project/
├── src/
│ ├── js/
│ │ └── main.js
│ ├── scss/
│ │ └── styles.scss
│ └── index.html
├── package-lock.json
├── package.json
└── webpack.config.jssh
mkdir {src,src/js,src/scss}
touch src/index.html src/js/main.js src/scss/styles.scss webpack.config.js目标目录结构:
text
my-project/
├── src/
│ ├── js/
│ │ └── main.js
│ ├── scss/
│ │ └── styles.scss
│ └── index.html
├── package-lock.json
├── package.json
└── webpack.config.jsStep 3: Configure Webpack
步骤 3:配置 Webpack
-
— entry, output, and dev server:
webpack.config.jsjs'use strict' const path = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') module.exports = { mode: 'development', entry: './src/js/main.js', output: { filename: 'main.js', path: path.resolve(__dirname, 'dist') }, devServer: { static: path.resolve(__dirname, 'dist'), port: 8080, hot: true }, plugins: [ new HtmlWebpackPlugin({ template: './src/index.html' }) ] } -
:
src/index.htmlhtml<!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-solid theme-primary">Primary button</button> </div> </body> </html> -
— add scripts:
package.jsonjson{ "scripts": { "start": "webpack serve", "build": "webpack build --mode=production", "test": "echo \"Error: no test specified\" && exit 1" } } -
Start Webpack:sh
npm start
-
—— 入口、输出与 dev server 配置:
webpack.config.jsjs'use strict' const path = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') module.exports = { mode: 'development', entry: './src/js/main.js', output: { filename: 'main.js', path: path.resolve(__dirname, 'dist') }, devServer: { static: path.resolve(__dirname, 'dist'), port: 8080, hot: true }, plugins: [ new HtmlWebpackPlugin({ template: './src/index.html' }) ] } -
:
src/index.htmlhtml<!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-solid theme-primary">Primary button</button> </div> </body> </html> -
—— 添加脚本命令:
package.jsonjson{ "scripts": { "start": "webpack serve", "build": "webpack build --mode=production", "test": "echo \"Error: no test specified\" && exit 1" } } -
启动 Webpack:sh
npm start
Step 4: Set up loaders and import Bootstrap
步骤 4:配置 loader 并引入 Bootstrap
-
Add theloader chain to
module.rules(order matters:webpack.config.jscompiles,sass-loaderruns Autoprefixer,postcss-loaderresolves imports,css-loaderinjects CSS):style-loaderjs'use strict' const path = require('path') const autoprefixer = require('autoprefixer') const HtmlWebpackPlugin = require('html-webpack-plugin') module.exports = { mode: 'development', entry: './src/js/main.js', output: { filename: 'main.js', path: path.resolve(__dirname, 'dist') }, devServer: { static: path.resolve(__dirname, 'dist'), port: 8080, hot: true }, plugins: [ new HtmlWebpackPlugin({ template: './src/index.html' }) ], module: { rules: [ { test: /\.(scss)$/, use: [ { loader: 'style-loader' }, { loader: 'css-loader' }, { loader: 'postcss-loader', options: { postcssOptions: { plugins: [ autoprefixer ] } } }, { loader: 'sass-loader' } ] } ] } } -
— import the source Sass with
src/scss/styles.scss(never@use):@importscss// Import all of Bootstrap's CSS @use "bootstrap/scss/bootstrap";To customize, override Bootstrap's CSS token maps (,$root-tokens) — see Customize › Sass. Token names are written unprefixed in Sass; Bootstrap's dist/CDN CSS adds the$*-tokensprefix via PostCSS, so compiling the source yourself keeps them unprefixed.--bs- -
— load the CSS and import Bootstrap's JS. Floating UI and Vanilla Calendar Pro are imported automatically through Bootstrap:
src/js/main.jsjs// Import our custom CSS, then all of Bootstrap’s JS import '../scss/styles.scss' import * as bootstrap from 'bootstrap'Import only the plugins you need to keep bundle sizes down:jsimport { Tooltip, Toast, Popover } from 'bootstrap'
-
在中添加
webpack.config.jsloader 链(顺序很重要:module.rules负责编译,sass-loader运行 Autoprefixer,postcss-loader解析导入,css-loader注入 CSS):style-loaderjs'use strict' const path = require('path') const autoprefixer = require('autoprefixer') const HtmlWebpackPlugin = require('html-webpack-plugin') module.exports = { mode: 'development', entry: './src/js/main.js', output: { filename: 'main.js', path: path.resolve(__dirname, 'dist') }, devServer: { static: path.resolve(__dirname, 'dist'), port: 8080, hot: true }, plugins: [ new HtmlWebpackPlugin({ template: './src/index.html' }) ], module: { rules: [ { test: /\.(scss)$/, use: [ { loader: 'style-loader' }, { loader: 'css-loader' }, { loader: 'postcss-loader', options: { postcssOptions: { plugins: [ autoprefixer ] } } }, { loader: 'sass-loader' } ] } ] } } -
—— 使用
src/scss/styles.scss引入 Sass 源文件(切勿使用@use):@importscss// Import all of Bootstrap's CSS @use "bootstrap/scss/bootstrap";如需自定义样式,可覆盖 Bootstrap 的 CSS token 映射(、$root-tokens)—— 参见 自定义 › Sass。Sass 中的 token 名称没有前缀;Bootstrap 的发行版/CDN CSS 会通过 PostCSS 添加$*-tokens前缀,因此自行编译源文件时 token 不带此前缀。--bs- -
—— 加载 CSS 并引入 Bootstrap 的 JS。Floating UI 和 Vanilla Calendar Pro 会通过 Bootstrap 自动引入:
src/js/main.jsjs// Import our custom CSS, then all of Bootstrap’s JS import '../scss/styles.scss' import * as bootstrap from 'bootstrap'如需减小打包体积,可仅引入你需要的插件:jsimport { Tooltip, Toast, Popover } from 'bootstrap'
Step 5: Verify
步骤 5:验证配置
- Run and open
npm start— thehttp://localhost:8080and.containerbutton should be styled..btn-solid.theme-primary - Confirm the console is free of module-resolution or loader errors.
- Trigger a JS component (tooltip/dialog) to confirm the JS bundle works.
- Bootstrap 6 requires a browser that supports and
oklch().color-mix()
- 运行 并打开
npm start——http://localhost:8080容器和.container按钮应已应用样式。.btn-solid.theme-primary - 确认控制台没有模块解析或 loader 相关错误。
- 触发一个 JS 组件(如 tooltip/对话框),确认 JS 打包文件正常运行。
- Bootstrap 6 需要浏览器支持 和
oklch()。color-mix()
Step 6 (optional): Production optimizations
步骤 6(可选):生产环境优化
Not required for a working setup; apply only if needed.
- Extract CSS to a file (for strict CSP or to avoid a large JS bundle): install , replace
mini-css-extract-pluginwithstyle-loader, add the plugin, then link the generatedminiCssExtractPlugin.loaderfrom your HTML.dist/main.css - Extract inline SVGs: Bootstrap's CSS references SVGs via inline URIs. If your CSP blocks
data:images, add a Webpack asset-module rule matchingdata:/mimetype: 'image/svg+xml'withscheme: 'data'to emit them as files.type: 'asset/resource'
For a complete reference, see the twbs/examples Webpack project.
这部分不是正常运行的必要配置,仅在需要时应用。
- 将 CSS 提取为独立文件(适用于严格 CSP 或避免 JS 包体积过大的场景):安装 ,将
mini-css-extract-plugin替换为style-loader,添加该插件,然后在 HTML 中链接生成的miniCssExtractPlugin.loader文件。dist/main.css - 提取内联 SVG:Bootstrap 的 CSS 通过内联 URI 引用 SVG。如果你的 CSP 阻止
data:图片,可添加一条 Webpack asset-module 规则,匹配data:/mimetype: 'image/svg+xml'并设置scheme: 'data',将它们输出为独立文件。type: 'asset/resource'
完整参考示例请参见 twbs/examples 中的 Webpack 项目。