bootstrap is the core CSS framework providing styles and JavaScript plugins, while react-bootstrap and reactstrap are React-specific implementations that rebuild Bootstrap components as native React elements. bootstrap requires manual DOM management or jQuery (in v4) for interactive elements, whereas the React libraries handle state and events within the React lifecycle. react-bootstrap is known for strict adherence to React patterns without Bootstrap JS dependencies, while reactstrap offers a lightweight alternative with a similar component API. Choosing between them depends on whether you need raw CSS control or fully managed React components.
When building React applications with Bootstrap, developers face a critical choice: use the core CSS library directly or adopt a React-specific wrapper. bootstrap, react-bootstrap, and reactstrap each solve this problem differently. Understanding their architectural differences is key to avoiding technical debt and ensuring smooth maintenance.
The fundamental difference lies in what you import. bootstrap provides styles and JS plugins, while the others provide React components that require the CSS separately.
bootstrap requires importing the CSS file globally and optionally initializing JS plugins.
// bootstrap: Global CSS import in entry point
import 'bootstrap/dist/css/bootstrap.min.css';
// Interactive components need Bootstrap JS or manual handling
import * as bootstrap from 'bootstrap';
react-bootstrap requires the CSS import but replaces JS plugins with React components.
// react-bootstrap: Global CSS import + React components
import 'bootstrap/dist/css/bootstrap.min.css';
import { Button } from 'react-bootstrap';
reactstrap follows a similar pattern to react-bootstrap but uses its own component imports.
// reactstrap: Global CSS import + React components
import 'bootstrap/dist/css/bootstrap.min.css';
import { Button } from 'reactstrap';
How you render a button reveals the level of abstraction. bootstrap uses standard HTML with classes, while the React libraries use props.
bootstrap relies on standard HTML elements with className strings.
// bootstrap: Standard HTML with className
function SubmitButton() {
return (
<button className="btn btn-primary" type="submit">
Submit
</button>
);
}
react-bootstrap uses dedicated components with props for variants.
// react-bootstrap: Component with variant prop
import { Button } from 'react-bootstrap';
function SubmitButton() {
return (
<Button variant="primary" type="submit">
Submit
</Button>
);
}
reactstrap also uses components but with slightly different prop naming conventions.
// reactstrap: Component with color prop
import { Button } from 'reactstrap';
function SubmitButton() {
return (
<Button color="primary" type="submit">
Submit
</Button>
);
}
Modals highlight the biggest architectural gap. bootstrap traditionally relies on jQuery or data attributes, while the React libraries manage visibility via state.
bootstrap requires manual instantiation or data attributes to toggle visibility.
// bootstrap: Manual JS instantiation
import { Modal } from 'bootstrap';
function MyModal() {
useEffect(() => {
const modalEl = document.getElementById('myModal');
const modal = new Modal(modalEl);
modal.show();
}, []);
return <div className="modal" id="myModal">...</div>;
}
react-bootstrap controls visibility through React state props.
// react-bootstrap: Controlled via show prop
import { Modal, Button } from 'react-bootstrap';
function MyModal({ show, handleClose }) {
return (
<Modal show={show} onHide={handleClose}>
<Modal.Header closeButton>
<Modal.Title>Heading</Modal.Title>
</Modal.Header>
<Modal.Body>Content</Modal.Body>
</Modal>
);
}
reactstrap also uses controlled state but separates the toggle logic slightly.
// reactstrap: Controlled via isOpen prop
import { Modal, ModalHeader, ModalBody, Button } from 'reactstrap';
function MyModal({ isOpen, toggle }) {
return (
<Modal isOpen={isOpen} toggle={toggle}>
<ModalHeader toggle={toggle}>Heading</ModalHeader>
<ModalBody>Content</ModalBody>
</Modal>
);
}
Theming approaches vary from build-time configuration to runtime props.
bootstrap uses SASS variables compiled at build time for global theme changes.
// bootstrap: SASS variable override
$primary: #563d7c;
$btn-border-radius: 0.25rem;
@import "bootstrap/scss/bootstrap";
react-bootstrap supports SASS but also allows some runtime customization via props.
// react-bootstrap: Runtime props for size/variant
<Button variant="primary" size="lg">Large Button</Button>
// Global theme still requires SASS or CSS variables
reactstrap relies heavily on props for component-level changes and CSS for global themes.
// reactstrap: Props for outline and size
<Button outline color="primary" size="lg">Large Outline</Button>
// Global theme requires external CSS or SASS
Long-term support is critical for enterprise applications.
bootstrap is the core standard. It is stable and updated regularly by the core team. However, integrating it into React requires extra work to avoid conflicts between React state and DOM manipulation.
react-bootstrap has a large community and frequent releases. It aligns closely with Bootstrap 5 and React 18 standards. It is generally considered the safest choice for new React projects due to active maintenance and strong TypeScript definitions.
reactstrap is stable but has seen slower update cycles compared to react-bootstrap. While it supports Bootstrap 5 in version 9, developers should verify compatibility with the latest React features before committing to it for large-scale new projects.
| Feature | bootstrap | react-bootstrap | reactstrap |
|---|---|---|---|
| Type | CSS Framework | React Component Library | React Component Library |
| JS Dependency | Yes (vanilla or jQuery v4) | No (Pure React) | No (Pure React) |
| Control | Manual DOM / Data Attributes | React State (Controlled) | React State (Controlled) |
| Props API | N/A (className) | variant, size | color, outline, size |
| Maintenance | Active Core | Very Active | Moderate / Stable |
bootstrap is the foundation — choose it if you need raw CSS or are building non-React parts of an app. It gives maximum control but requires more boilerplate in React.
react-bootstrap is the robust engineer's choice — perfect for teams prioritizing long-term maintenance, TypeScript support, and strict React patterns. It removes the need for Bootstrap JS entirely.
reactstrap is the lightweight alternative — suitable for smaller projects or legacy codebases already using it. It works well but may lag behind in adopting new React features compared to react-bootstrap.
Final Thought: For most modern React applications, react-bootstrap offers the best balance of features and maintenance. Use bootstrap directly only if you have specific needs for DOM control, and consider reactstrap primarily for existing projects or specific preference reasons.
Choose bootstrap if you need the raw CSS framework for a project that mixes React with other technologies or requires direct DOM manipulation. It is best suited for teams that want full control over markup and prefer to handle interactivity via standard HTML data attributes or custom hooks. This option works well when you do not want the abstraction layer of a component library.
Choose react-bootstrap if you want a robust, actively maintained library that fully embraces React patterns without relying on Bootstrap's JavaScript files. It is ideal for new projects requiring strong TypeScript support, accessible components, and close alignment with the latest Bootstrap 5 standards. This package is the safest bet for long-term scalability in modern React ecosystems.
Choose reactstrap if you prefer a simpler API surface or are maintaining an existing codebase already dependent on it. It is suitable for projects that need Bootstrap 5 support (via v9) but want a slightly different prop structure than react-bootstrap. However, be aware that update cycles may be slower compared to react-bootstrap, so evaluate long-term maintenance needs carefully.
Sleek, intuitive, and powerful front-end framework for faster and easier web development.
Explore Bootstrap docs »
Report bug
·
Request feature
·
Blog
Our default branch is for development of our Bootstrap 5 release. Head to the v4-dev branch to view the readme, documentation, and source code for Bootstrap 4.
Several quick start options are available:
git clone https://github.com/twbs/bootstrap.gitnpm install bootstrap@v5.3.8yarn add bootstrap@v5.3.8bun add bootstrap@v5.3.8composer require twbs/bootstrap:5.3.8Install-Package bootstrap Sass: Install-Package bootstrap.sassRead the Getting started page for information on the framework contents, templates, examples, and more.
Within the download you’ll find the following directories and files, logically grouping common assets and providing both compiled and minified variations.
bootstrap/
├── css/
│ ├── bootstrap-grid.css
│ ├── bootstrap-grid.css.map
│ ├── bootstrap-grid.min.css
│ ├── bootstrap-grid.min.css.map
│ ├── bootstrap-grid.rtl.css
│ ├── bootstrap-grid.rtl.css.map
│ ├── bootstrap-grid.rtl.min.css
│ ├── bootstrap-grid.rtl.min.css.map
│ ├── bootstrap-reboot.css
│ ├── bootstrap-reboot.css.map
│ ├── bootstrap-reboot.min.css
│ ├── bootstrap-reboot.min.css.map
│ ├── bootstrap-reboot.rtl.css
│ ├── bootstrap-reboot.rtl.css.map
│ ├── bootstrap-reboot.rtl.min.css
│ ├── bootstrap-reboot.rtl.min.css.map
│ ├── bootstrap-utilities.css
│ ├── bootstrap-utilities.css.map
│ ├── bootstrap-utilities.min.css
│ ├── bootstrap-utilities.min.css.map
│ ├── bootstrap-utilities.rtl.css
│ ├── bootstrap-utilities.rtl.css.map
│ ├── bootstrap-utilities.rtl.min.css
│ ├── bootstrap-utilities.rtl.min.css.map
│ ├── bootstrap.css
│ ├── bootstrap.css.map
│ ├── bootstrap.min.css
│ ├── bootstrap.min.css.map
│ ├── bootstrap.rtl.css
│ ├── bootstrap.rtl.css.map
│ ├── bootstrap.rtl.min.css
│ └── bootstrap.rtl.min.css.map
└── js/
├── bootstrap.bundle.js
├── bootstrap.bundle.js.map
├── bootstrap.bundle.min.js
├── bootstrap.bundle.min.js.map
├── bootstrap.esm.js
├── bootstrap.esm.js.map
├── bootstrap.esm.min.js
├── bootstrap.esm.min.js.map
├── bootstrap.js
├── bootstrap.js.map
├── bootstrap.min.js
└── bootstrap.min.js.map
We provide compiled CSS and JS (bootstrap.*), as well as compiled and minified CSS and JS (bootstrap.min.*). Source maps (bootstrap.*.map) are available for use with certain browsers’ developer tools. Bundled JS files (bootstrap.bundle.js and minified bootstrap.bundle.min.js) include Popper.
Have a bug or a feature request? Please first read the issue guidelines and search for existing and closed issues. If your problem or idea is not addressed yet, please open a new issue.
Bootstrap’s documentation, included in this repo in the root directory, is built with Astro and publicly hosted on GitHub Pages at https://getbootstrap.com/. The docs may also be run locally.
Documentation search is powered by Algolia's DocSearch.
npm install to install the Node.js dependencies, including Astro (the site builder).npm run test (or a specific npm script) to rebuild distributed CSS and JavaScript files, as well as our docs assets./bootstrap directory, run npm run docs-serve in the command line.Learn more about using Astro by reading its documentation.
You can find all our previous releases docs on https://getbootstrap.com/docs/versions/.
Previous releases and their documentation are also available for download.
Please read through our contributing guidelines. Included are directions for opening issues, coding standards, and notes on development.
Moreover, if your pull request contains JavaScript patches or features, you must include relevant unit tests. All HTML and CSS should conform to the Code Guide, maintained by Mark Otto.
Editor preferences are available in the editor config for easy use in common text editors. Read more and download plugins at https://editorconfig.org/.
Get updates on Bootstrap’s development and chat with the project maintainers and community members.
irc.libera.chat server, in the #bootstrap channel.bootstrap-5).bootstrap on packages which modify or add to the functionality of Bootstrap when distributing through npm or similar delivery mechanisms for maximum discoverability.For transparency into our release cycle and in striving to maintain backward compatibility, Bootstrap is maintained under the Semantic Versioning guidelines. Sometimes we screw up, but we adhere to those rules whenever possible.
See the Releases section of our GitHub project for changelogs for each release version of Bootstrap. Release announcement posts on the official Bootstrap blog contain summaries of the most noteworthy changes made in each release.
Mark Otto
Jacob Thornton
Thanks to BrowserStack for providing the infrastructure that allows us to test in real browsers!
Thanks to Netlify for providing us with Deploy Previews!
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor]
Thank you to all our backers! 🙏 [Become a backer]
Code and documentation copyright 2011-2025 the Bootstrap Authors. Code released under the MIT License. Docs released under Creative Commons.