ユーザーが自分のウェブサイトでテーマを選択できるようにしたいのですが、これはドロップダウンから行います。私は現在、ダムコードを書かずにこの機能をサポートする方法を理解するのに苦労しています.
私は現在、postcss と一緒に css-modules を使用して生活を楽にしています。Webpack は、すべてをまとめるために使用されます。開発中はホット リロードを利用し、代わりにスタイル ローダーを使用します。
完全な構成は次のようになります
{
test: /\.css$/,
loader: !isDev
? ExtractTextPlugin.extract('style-loader', 'css-loader?sourcemap&minimize&modules&importLoaders=1&localIdentName=[name]-[local]-[hash:base64:5]!postcss-loader')
: 'style-loader!css-loader?sourcemap&minimize&modules&importLoaders=1&localIdentName=[name]-[local]-[hash:base64:5]!postcss-loader'
},
解決策 1
body タグにクラス名を配置して、どのテーマがロードされているかを判別します。これは、各コンポーネント css 内から正しいテーマを選択するために使用されます。これは非常に面倒で避けたいことですが、次のようになります。
.myComponent {
margin: 10px;
width: 100px;
}
:global(.theme1) {
.myComponent {
background: $theme1_myComponent_background;
}
}
:global(.theme2) {
.myComponent {
background: $theme2_myComponent_background;
}
}
これはすぐに拡張が難しく、保守できないものになるため、避けたいと思います。
解決策 2
css の事前にテーマ設定された静的バンドルを生成します。ユーザーが を要求する/main.css
と、サーバー上のハンドラーが送信するテーマ (おそらくクエリ文字列) を決定し、それらの行に沿ってそれらまたは何かtheme1-main.css
を送信します。theme2-main.css
問題は、開発環境をサポートする方法がわからないことです。
これの良いところは、私の css ファイルが追加のロジックを維持するのが難しいことを必要としないということです:
.myComponent {
margin: 10px;
width: 100px;
background: $myComponent_background;
}
解決策 3
ネイティブの CSS 変数を使用します。これらは実行時に更新でき、すでにロードされている css を反映し、本番環境と開発環境の両方で正常に動作します。私のコンポーネントも解決策 2 のように (または同様に) 見えます。ここでの問題は、それらがネイティブであまり広くサポートされていないことです。また、この種のことを行うために検討する価値のあるポリフィルがあるかどうかもわかりません。
以上が私の考えです。私はまだ決定的な結論に達していません。この問題を解決する方法について、すべてのフィードバックをお待ちしております。おそらく、私はそれについてすべて間違って考えており、私がやりたいことを行うためのはるかに良い方法があります.
前もって感謝します!