Bootstrap의 커스터마이징 내에 있는 Optimize 성능 최적화에 대해 알아봅시다.SCSS, JavaScript 파일에 필요하다고 생각하는 컴포넌트만 @import하여 최적화할 수 있습니다.trade-off라고 할 수 있습니다.Bootstrap 초기화 부분이 성능 최적화에 해당합니다.@import "../node_modules/bootstrap/scss/functions"; @import "../node_modules/bootstrap/scss/variables"; @import "../node_modules/bootstrap/scss/mixins"; $theme-colors: ( "primary": $primary, "secondary": $secondary, "success": $success, "info": $info, "warning": $warning, "danger": $danger, "light": $light, "dark": $dark ); @import "../node_modules/bootstrap/scss/bootstrap";
- 현재는
@import "../node_modules/bootstrap/scss/bootstrap";로 코딩하여Bootstrap전체 파일을 초기화시켜주었지만@import "../node_modules/bootstrap/scss/dropdown";과 같이 본인이 필요한dropdown만 초기화를 시키는 것이 가능 합니다.- 하지만 성능 최적화 부분이 아직
Bootstrap에서 최신의 기능으로 불안정하기 때문에SCSS등의 스타일 작업에서는 전체 파일을 초기화시키는 것을 추천드립니다.
JavaScript의 경우 개별적으로 가져오는 것이 성능적으로 큰 차이를 볼 수 있기 때문에 SCSS와는 달리 성능 최적화를 추천합니다.
- Before optimization
import bootstrap from 'bootstrap/dist/js/bootstrap.bundle'
- 성능 최적화 전에는
Bootstrap의bundle형태로 가져온 것을 확인할 수 있습니다.
- After optimization
- 대문자
D로 시작하는Dropdown이라는 변수로 아래의 경로에 있는dropdown에 관련된 코드만 내어주는 것을 받아서 사용할 수 있도록 합니다.import Dropdown from 'bootstrap/js/dist/dropdown'
- 초기화를 시켜주기 위해
dropdown컴포넌트에 있는Via JavaScript라고 되어있는 아래의 코드를 가져옵니다.var dropdownElementList = [].slice.call(document.querySelectorAll('.dropdown-toggle')) var dropdownList = dropdownElementList.map(function (dropdownToggleEl) { return new bootstrap.Dropdown(dropdownToggleEl) })
- 두번째 서번째 줄의 코드를 보면
map메소드를 통해dropdown의 모든 요소를 찾아dropdownToggleEl를 생성자 함수로 반환하고 있습니다.
- 이후 개발자 서버를 열어 확인하면
성공!이 되면 좋겠지만 아래와 같이 에러가 발생하게 됩니다.
- 그 이유는
dropdown의 팝업 기능은Boostrap의 외부 패키지인popper.js를 활용하고 있습니다.Bootstrap을 번들 형태로 받아왔을 때에는popper.js를 포함하고 있기 때문에 문제가 없었지만 개별적으로 가져오면서 문제가 발생하게 된 것입니다.
popper.js를 의존성 모듈로 아래와 같이 설치를 하면 간단히 해결됩니다.$ npm i @popperjs/core
package.json 파일에서 popper.js 설치 확인
{ "name": "bootstrap-test", "version": "1.0.0", "description": "", "main": "main.js", "scripts": { "dev": "parcel index.html", "build": "parcel build index.html" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "@popperjs/core": "^2.11.5", "bootstrap": "^5.1.3", "parcel-bundler": "^1.12.5" }, "devDependencies": { "sass": "^1.50.0" } }
popper.js을 설치하면 package.json 파일에서@popperjs/core": "^2.11.5"가 존재하면 성공적으로 설치 완료된 것 입니다.
Bootstrap의 컴포넌트 중 하나인 Modal의 최적화를 진행해봅시다.main.js
import Dropdown from 'bootstrap/js/dist/dropdown'; import Modal from "bootstrap/js/dist/modal" // 추가 실습 - Modal const dropdownElementList = [].slice.call(document.querySelectorAll('.dropdown-toggle')) dropdownElementList.map(function (dropdownToggleEl) { return new Dropdown(dropdownToggleEl) }) // 추가 실습 - Modal new Modal(document.querySelector('#exampleModal'), { backdrop: 'static' });
modal파일을 개별적으로 가져오고Bootstrap홈페이지의Modal컴포넌트의Via JavaScript를 참고하여 아래처럼 초기화해주면 됩니다.- 참고로 해당 예시는
backdrop옵션을 추가하여 모달 창 밖의 다른 곳을 클릭해도 모달 창이 꺼지지 않도록 하도록 적용한 예시 입니다.