我想让用户在我的网站上选择主题,他们将通过下拉菜单来完成。我目前无法弄清楚如何支持此功能,而无需编写愚蠢的代码。
我目前使用 css-modules 和 postcss 来让我的生活更轻松。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'
},
方案一
在 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。这里的问题是它们在本地没有得到广泛支持,我不确定是否有任何值得研究的 polyfills 可以为我做这种类型的事情。
总而言之,这些都是我的想法。我还没有得出任何明确的结论,并感谢所有关于我如何解决这个问题的反馈。也许我认为这一切都是错误的,并且有更好的方法来做我想做的事情。
提前致谢!