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