【发布时间】:2016-12-22 03:25:21
【问题描述】:
我想允许用户在我的网站上选择主题,他们将通过下拉菜单来选择。不过,我目前在不编写愚蠢代码的情况下无法弄清楚如何支持此功能。
我目前使用 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 可以为我做这种事情。
总而言之,这些是我的想法。我还没有得出任何明确的结论,并希望得到所有关于如何解决这个问题的反馈。也许我在想这一切都错了,有一种更好的方法可以做我想做的事。
提前致谢!
【问题讨论】:
-
我认为解决方案 2 更好,前提是您可以自动完成(为单个主题构建网站,并且自动制作其他捆绑包)。
-
@AshishChaudhary 当然可以,但是我如何启用它进行开发?我在开发过程中不请求 CSS 包。
-
您最终找到解决方案了吗?也遇到了这个确切的问题。
-
@Dean 不。我暂时选择了解决方案 1,直到它在我的脸上爆炸。最好的解决方案是在原生 CSS 变量可用时使用它们。
标签: css reactjs themes webpack postcss