文档错误
虽然这不是您想要的答案,但正确的答案似乎是“Bootstrap 的文档有错误”。
对于umd 输出,如果我使用以下语法导入:
import Dropdown from '../../node_modules/bootstrap/js/dist/dropdown';
构建失败并出现以下错误:
Error: 'default' is not exported by node_modules\bootstrap\js\dist\dropdown.js, imported by src\js\bootstrap-build.js
与此相反:Files in bootstrap/js/dist use the default export,。
什么有效(包括 Popper):
对于读者,假设您来这里是为了解决您遇到的构建问题,以下是适合我的方法。
此答案假定所有依赖项都是使用 NPM 作为开发依赖项安装的,但 Bootstrap 5 除外,它是使用以下命令安装的:
npm install bootstrap
这是 rollup.config.js:
import {terser} from 'rollup-plugin-terser';
export default {
input: './src/js/bootstrap-build.js',
output: {
file: 'dist/js/bootstrap.umd.min.js',
format: "umd",
name: "bsbundle", // this is the name of the global object
esModule: false,
sourcemap: true,
},
plugins: [terser({compress: {drop_console: true, module: true}})]
};
这是项目的入口脚本,即bootstrap-build.js,位于/src/js/:
import * as Popper from '../../node_modules/@popperjs/core/dist/umd/popper.js';
// from 'js/src/*' source which works
import Modal from '../../node_modules/bootstrap/js/src/modal';
import Tab from '../../node_modules/bootstrap/js/src/tab';
import Dropdown from '../../node_modules/bootstrap/js/src/dropdown';
import Tooltip from '../../node_modules/bootstrap/js/src/tooltip';
export default {
// Alert,
// Button,
// Carousel,
// Collapse,
Dropdown,
Modal,
// Offcanvas,
// Popover,
// ScrollSpy,
Tab,
// Toast,
// Popper,
Tooltip
}
还有package.json:
{
"name": "bscomponents",
"version": "1.0.0",
"description": "Project for building Bootstrap 5 components.",
"main": "index.js",
"scripts": {
"build-bs": "rollup -c"
},
"keywords": [],
"author": "",
"license": "",
"dependencies": {
"bootstrap": "^5.1.3"
},
"devDependencies": {
"@rollup/plugin-multi-entry": "^4.1.0",
"autoprefixer": "^10.4.0",
"cross-env": "^7.0.3",
"postcss": "^8.3.11",
"rollup": "^2.60.0",
"rollup-plugin-node-resolve": "^5.2.0",
"rollup-plugin-terser": "^7.0.2",
}
}
NPM 构建命令:
NPM run build-bs
构建说明: Bootstrap Dropdown 和 Tooltip 源文件中导入 Popper 的行被注释掉。
Bundle 包括 Popper、Dropdown、Modal、Tab 和 Tooltip
在项目根目录中的文件 index.html 用于测试包。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bootstrap 5 components</title>
<!-- custom Bootstrap bundle saves about 21kb -->
<link rel="stylesheet" href="./node_modules/bootstrap/dist/css/bootstrap-reboot.min.css">
<link rel="stylesheet" href="./node_modules/bootstrap/dist/css/bootstrap.min.css">
<!-- and a few simple styles -->
<style>
body {
padding: 5rem;
margin: 1rem auto;
}
.btn-wrapper {
display: inline-block;
margin: 1rem auto;
}
.btn-wrapper li {
padding: 1rem
}
.tab-pane {
padding: 2rem;
}
ul {
margin: 3rem
}
</style>
</head>
<body>
<h1>Bootstrap 5 components</h1>
<ul>
<li>Dropdown</li>
<li>Modal (an option in the dropdown)</li>
<li>Tabs</li>
<li>Tooltip</li>
</ul>
<div class="btn-wrapper dropdown" data-bs-toggle="tooltip" data-bs-placement="top" title="This is a Bootstrap 5 dropdown.">
<button type="button" id="btnDropDown" class="btn btn-primary btn-calculator dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="true">Options <span class="caret"></span>
</button>
<ul class="dropdown-menu" aria-labelledby="btnDropDown">
<li data-bs-toggle="modal" data-bs-target="#MYMODAL">
<b>Modal</b>
</li>
<li>
Second option
</li>
<li>
And a final option
</li>
</ul>
</div>
<div>
<nav>
<div class="nav nav-tabs" id="nav-tab" role="tablist">
<button class="nav-link active" id="nav-tab-1" data-bs-toggle="tab" data-bs-target="#nav-calc-1" type="button" role="tab" aria-controls="nav-calc-1" aria-selected="true">Tab 1</button>
<button class="nav-link" id="nav-tab-2" data-bs-toggle="tab" data-bs-target="#nav-options-1" type="button" role="tab" aria-controls="nav-options-1" aria-selected="false">Tab 2</button>
</div>
</nav>
<!-- Tab panes -->
<div class="tab-content" id="nav-tabContent-1">
<div class="tab-pane fade show active" id="nav-calc-1" role="tabpanel" aria-labelledby="nav-tab-1">
<p>tab 1</p>
</div>
<!--role="tabpanel"-->
<div class="tab-pane fade show" id="nav-options-1" role="tabpanel" aria-labelledby="nav-tab-2">
<!-- option tab content -->
<p>tab 2</p>
</div>
<!-- role tabpanel -->
</div>
<!--end tab-content-->
</div>
<!-- modal -->
<div class="modal fade" tabindex="-1" id="MYMODAL">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Modal title</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>Before you leave, hover over the below buttons.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Click to close">Seconday</button>
<button type="button" class="btn btn-primary" data-bs-toggle="tooltip" data-bs-placement="right" title="I do nothing!">Primary</button>
</div>
</div>
</div>
</div>
<!-- end modal -->
<script src="./dist/js/bootstrap.umd.min.js"></script>
<script>
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bsbundle.Tooltip(tooltipTriggerEl)
})
</script>
</body>
</html>
开发环境:
- Windows 10
- 汇总 v2.6
- 节点 v16.10.0
- NPM 8.1.3
- 引导程序 5.1.3
在 VS Code v1.62 的 Bash 终端中运行构建。
结果:
包含Popper、/dist/js/bootstrap.umd.min.js 的构建包比 Bootstrap 的分布式缩小包节省了大约 21kb。
Probable documentation issue reported on GitHub