Skip to main content Skip to docs navigation
Contribute

ドキュメントのビルドスクリプトとテストを使って、Bootstrapの開発に協力します。

ツール設定

Bootstrapは、ドキュメントの構築とソースファイルのコンパイルにnpm scriptsを使用しています。私たちのpackage.jsonには、コードのコンパイルやテストの実行などのためのこれらのスクリプトがあります。これらは、私たちのリポジトリとドキュメントの外での使用は意図されていません。

ビルドシステムを使用し、ローカルでドキュメントを実行するには、BootstrapのソースファイルのコピーとNodeが必要です。以下のステップに従えば、ロックする準備が整うはずです:

  1. 依存関係を管理するために使用するNode.jsをダウンロード・インストールします
  2. Bootstrapのソースをダウンロードするか、Bootstrapのリポジトリをフォークしてクローンしてください。
  3. ルートの/bootstrapディレクトリに移動し、npm installを実行してpackage.jsonに記載されているローカル依存関係をインストールします。

完成すると、提供された各種コマンドをコマンドラインから実行することができるようになります。

npmスクリプトを使用する

私たちのpackage.jsonには、プロジェクトを開発するための多数のタスクが含まれています。npm runを実行すると、ターミナルにすべてのnpmスクリプトが表示されます。主なタスクは以下の通りです

Task Description
npm start CSSとJavaScriptのコンパイル、ドキュメントのビルド、ローカルサーバーの起動を行います。
npm run dist コンパイルしたファイルで dist/ディレクトリを作成します。SassAutoprefixerterserを使用します。
npm test npm run distを実行した後、ローカルでテストを実行します。
npm run docs-serve ドキュメントをローカルにビルドして実行します。
スタータープロジェクトで、npm経由でBootstrapを始めましょう!SassとJavaScriptの例テンプレートリポジトリにアクセスして、あなた自身のnpmプロジェクトでBootstrapを構築しカスタマイズする方法を確認してください。Sassコンパイラ、Autoprefixer、Stylelint、PurgeCSS、Bootstrapアイコンが含まれています。

Sass

Bootstrapでは、SassのソースファイルをCSSファイルにコンパイルするためにDart Sassを使用しています(ビルドプロセスに含まれています)。独自のアセットパイプラインを使用してSassをコンパイルする場合は、同じことをすることをお勧めします。以前、Bootstrap v4のためにNode Sassを使用しましたが、Node Sassを含むLibSassとその上に構築されたパッケージは現在非推奨となっています。

Dart Sassでは丸め精度を10としており、効率的な理由からこの値を調整することはできません。最小化など、生成されたCSSをさらに処理する際にこの精度を下げることはありませんが、もしそうするのであれば、ブラウザの丸めに関する問題を防ぐために、少なくとも6以上の精度を維持することをお勧めします。

Autoprefixer

Bootstrapでは、Autoprefixer(ビルドプロセスに含まれています)を使用して、ビルド時に一部のCSSプロパティにベンダープレフィックスを自動的に追加しています。これにより、CSSの重要な部分を一度に記述することができ、v3にあるようなベンダーMixinsの必要性がなくなるため、時間とコードの節約になります。

Autoprefixerでサポートされているブラウザのリストは、GitHubリポジトリ内の別ファイルで管理しています。詳しくは.browserslistrcをご覧ください。

RTLCSS

Bootstrapは、RTLCSSを使って、コンパイルされたCSSを処理し、RTLに変換します。基本的には、水平方向を意識したプロパティ(例:padding-left)とその反対とを置き換えます。これにより、CSSを一度だけ記述し、RTLCSSのcontrolvalueディレクティブを使って微調整をすることができます。

ローカルドキュメント

ローカルでドキュメントを実行するには、Hugoを使用する必要があります。Hugoは、hugo-bin npmパッケージでインストールします。Hugoは非常に高速で拡張性の高い静的サイトジェネレータで、基本的なインクルード、Markdownベースのファイル、テンプレートなどを提供します。ここでは、Hugoを始める方法を説明します:

  1. 上記のツール設定を実行し、すべての依存関係をインストールします。
  2. ルートの/bootstrapディレクトリから、コマンドラインでnpm run docs-serveを実行します。
  3. ブラウザでhttp://localhost:9001/を開いてみると、出来上がり。

Hugoの使い方については、そのドキュメントを読んでください。

トラブル対応

依存関係のインストールで問題が発生した場合は、以前の依存関係のバージョン(グローバルとローカル)をすべてアンインストールしてください。その後、npm installを再実行します。

` const jsSnippetContent = jsSnippet ? '\/\/ NOTICE!!! Initially embedded in our docs this JavaScript\n\/\/ file contains elements that can help you create reproducible\n\/\/ use cases in StackBlitz for instance\.\n\/\/ In a real project please adapt this content to your needs\.\n\/\/ \u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\u002b\n\n\/\*!\n \* JavaScript for Bootstrap\u0027s docs \(https:\/\/getbootstrap\.com\/\)\n \* Copyright 2011\-2023 The Bootstrap Authors\n \* Licensed under the Creative Commons Attribution 3\.0 Unported License\.\n \* For details, see https:\/\/creativecommons\.org\/licenses\/by\/3\.0\/\.\n \*\/\n\n\/\* global bootstrap: false \*\/\n\n\(\(\) =\u003e \{\n \u0027use strict\u0027\n\n \/\/ \-\-\-\-\-\-\-\-\n \/\/ Tooltips\n \/\/ \-\-\-\-\-\-\-\-\n \/\/ Instantiate all tooltips in a docs or StackBlitz\n document\.querySelectorAll\(\u0027\[data\-bs\-toggle=\u0022tooltip\u0022\]\u0027\)\n \.forEach\(tooltip =\u003e \{\n new bootstrap\.Tooltip\(tooltip\)\n \}\)\n\n \/\/ \-\-\-\-\-\-\-\-\n \/\/ Popovers\n \/\/ \-\-\-\-\-\-\-\-\n \/\/ Instantiate all popovers in docs or StackBlitz\n document\.querySelectorAll\(\u0027\[data\-bs\-toggle=\u0022popover\u0022\]\u0027\)\n \.forEach\(popover =\u003e \{\n new bootstrap\.Popover\(popover\)\n \}\)\n\n \/\/ \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\n \/\/ Toasts\n \/\/ \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\n \/\/ Used by \u0027Placement\u0027 example in docs or StackBlitz\n const toastPlacement = document\.getElementById\(\u0027toastPlacement\u0027\)\n if \(toastPlacement\) \{\n document\.getElementById\(\u0027selectToastPlacement\u0027\)\.addEventListener\(\u0027change\u0027, function \(\) \{\n if \(!toastPlacement\.dataset\.originalClass\) \{\n toastPlacement\.dataset\.originalClass = toastPlacement\.className\n \}\n\n toastPlacement\.className = `\$\{toastPlacement\.dataset\.originalClass\} \$\{this\.value\}`\n \}\)\n \}\n\n \/\/ Instantiate all toasts in docs pages only\n document\.querySelectorAll\(\u0027\.bd\-example \.toast\u0027\)\n \.forEach\(toastNode =\u003e \{\n const toast = new bootstrap\.Toast\(toastNode, \{\n autohide: false\n \}\)\n\n toast\.show\(\)\n \}\)\n\n \/\/ Instantiate all toasts in docs pages only\n \/\/ js\-docs\-start live\-toast\n const toastTrigger = document\.getElementById\(\u0027liveToastBtn\u0027\)\n const toastLiveExample = document\.getElementById\(\u0027liveToast\u0027\)\n\n if \(toastTrigger\) \{\n const toastBootstrap = bootstrap\.Toast\.getOrCreateInstance\(toastLiveExample\)\n toastTrigger\.addEventListener\(\u0027click\u0027, \(\) =\u003e \{\n toastBootstrap\.show\(\)\n \}\)\n \}\n \/\/ js\-docs\-end live\-toast\n\n \/\/ \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\n \/\/ Alerts\n \/\/ \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\n \/\/ Used in \u0027Show live alert\u0027 example in docs or StackBlitz\n\n \/\/ js\-docs\-start live\-alert\n const alertPlaceholder = document\.getElementById\(\u0027liveAlertPlaceholder\u0027\)\n const appendAlert = \(message, type\) =\u003e \{\n const wrapper = document\.createElement\(\u0027div\u0027\)\n wrapper\.innerHTML = \[\n `\u003cdiv class=\u0022alert alert\-\$\{type\} alert\-dismissible\u0022 role=\u0022alert\u0022\u003e`,\n ` \u003cdiv\u003e\$\{message\}\u003c\/div\u003e`,\n \u0027 \u003cbutton type=\u0022button\u0022 class=\u0022btn\-close\u0022 data\-bs\-dismiss=\u0022alert\u0022 aria\-label=\u0022Close\u0022\u003e\u003c\/button\u003e\u0027,\n \u0027\u003c\/div\u003e\u0027\n \]\.join\(\u0027\u0027\)\n\n alertPlaceholder\.append\(wrapper\)\n \}\n\n const alertTrigger = document\.getElementById\(\u0027liveAlertBtn\u0027\)\n if \(alertTrigger\) \{\n alertTrigger\.addEventListener\(\u0027click\u0027, \(\) =\u003e \{\n appendAlert\(\u0027Nice, you triggered this alert message!\u0027, \u0027success\u0027\)\n \}\)\n \}\n \/\/ js\-docs\-end live\-alert\n\n \/\/ \-\-\-\-\-\-\-\-\n \/\/ Carousels\n \/\/ \-\-\-\-\-\-\-\-\n \/\/ Instantiate all non\-autoplaying carousels in docs or StackBlitz\n document\.querySelectorAll\(\u0027\.carousel:not\(\[data\-bs\-ride=\u0022carousel\u0022\]\)\u0027\)\n \.forEach\(carousel =\u003e \{\n bootstrap\.Carousel\.getOrCreateInstance\(carousel\)\n \}\)\n\n \/\/ \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\n \/\/ Checks \u0026 Radios\n \/\/ \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\n \/\/ Indeterminate checkbox example in docs and StackBlitz\n document\.querySelectorAll\(\u0027\.bd\-example\-indeterminate \[type=\u0022checkbox\u0022\]\u0027\)\n \.forEach\(checkbox =\u003e \{\n if \(checkbox\.id\.includes\(\u0027Indeterminate\u0027\)\) \{\n checkbox\.indeterminate = true\n \}\n \}\)\n\n \/\/ \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\n \/\/ Links\n \/\/ \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\n \/\/ Disable empty links in docs examples only\n document\.querySelectorAll\(\u0027\.bd\-content \[href=\u0022#\u0022\]\u0027\)\n \.forEach\(link =\u003e \{\n link\.addEventListener\(\u0027click\u0027, event =\u003e \{\n event\.preventDefault\(\)\n \}\)\n \}\)\n\n \/\/ \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\n \/\/ Modal\n \/\/ \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\n \/\/ Modal \u0027Varying modal content\u0027 example in docs and StackBlitz\n \/\/ js\-docs\-start varying\-modal\-content\n const exampleModal = document\.getElementById\(\u0027exampleModal\u0027\)\n if \(exampleModal\) \{\n exampleModal\.addEventListener\(\u0027show\.bs\.modal\u0027, event =\u003e \{\n \/\/ Button that triggered the modal\n const button = event\.relatedTarget\n \/\/ Extract info from data\-bs\-\* attributes\n const recipient = button\.getAttribute\(\u0027data\-bs\-whatever\u0027\)\n \/\/ If necessary, you could initiate an Ajax request here\n \/\/ and then do the updating in a callback\.\n\n \/\/ Update the modal\u0027s content\.\n const modalTitle = exampleModal\.querySelector\(\u0027\.modal\-title\u0027\)\n const modalBodyInput = exampleModal\.querySelector\(\u0027\.modal\-body input\u0027\)\n\n modalTitle\.textContent = `New message to \$\{recipient\}`\n modalBodyInput\.value = recipient\n \}\)\n \}\n \/\/ js\-docs\-end varying\-modal\-content\n\n \/\/ \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\n \/\/ Offcanvas\n \/\/ \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\n \/\/ \u0027Offcanvas components\u0027 example in docs only\n const myOffcanvas = document\.querySelectorAll\(\u0027\.bd\-example\-offcanvas \.offcanvas\u0027\)\n if \(myOffcanvas\) \{\n myOffcanvas\.forEach\(offcanvas =\u003e \{\n offcanvas\.addEventListener\(\u0027show\.bs\.offcanvas\u0027, event =\u003e \{\n event\.preventDefault\(\)\n \}, false\)\n \}\)\n \}\n\}\)\(\)\n' : null const project = { files: { 'index.html': markup, 'index.js': jsSnippetContent }, title: 'Bootstrap Example', description: `Official example from ${window.location.href}`, template: jsSnippet ? 'javascript' : 'html', tags: ['bootstrap'] } StackBlitzSDK.openProject(project, { openFile: 'index.html' }) }
OSZAR »