Bootstrap dropdowns, tooltips, and popovers require Popper. The simplest fix for “createPopper is not a function” is to load one matching Bootstrap bundle, which already contains the compatible Popper build.
Last updated: October 18, 2026.
<button id="actions" class="btn btn-secondary dropdown-toggle"
data-bs-toggle="dropdown" aria-expanded="false">
Actions
</button>
<ul class="dropdown-menu" aria-labelledby="actions">
<li><button class="dropdown-item" type="button">Edit</button></li>
</ul>
<script src="/assets/bootstrap.bundle.min.js"></script>Use bootstrap.bundle.min.js, not both the bundle and the non-bundle build. The bundle includes Popper and must load without a 404 before a dropdown is opened. Test a dropdown on the smallest affected page before restoring optimization or concatenation. This isolates dependency loading from unrelated theme and plugin behavior.
Remove mixed and duplicate dependencies
Bootstrap’s dropdown documentation says to load Popper before the non-bundle Bootstrap JavaScript or use the bundle that contains Popper. Do not combine Bootstrap 4 markup or plugins with Bootstrap 5 scripts, and do not load two Bootstrap versions through a theme, plugin, and custom template at the same time.
In browser developer tools, check the Network panel for the actual JavaScript files and their status codes. Then inspect the Sources panel or run bootstrap.Tooltip.VERSION in the console when that component is available. A stale cached bundle or concatenated CMS asset can keep the error alive after the template is corrected.
Use the correct build for the project
For a bundler, install compatible bootstrap and @popperjs/core packages and import Bootstrap once. The official Bootstrap and Vite guide shows that Popper is imported automatically when the complete Bootstrap package is imported. Individual dropdown, tooltip, or popover imports still require Popper as a dependency.
After rebuilding, hard-refresh the page and confirm that the first console error is gone. Later component errors can be consequences of the initial dependency failure. Continue with tracing a JavaScript error to its source, running JavaScript after DOM readiness, and building predictable menu state.