生产环境打破了 material-ui 样式

IT技术 reactjs webpack material-ui
2021-05-13 18:45:23

这是一个很难解释的问题。我正在使用一个相当基本的 webpack react + redux + 路由器设置。在该设置中,我仅使用 material-ui@1.0.0-beta.43 作为用户界面包。侧面还有一些额外的 scss 样式。所有软件包都是最新的。

在开发环境中,这一切都按预期工作。然而,当它在 NODE_ENV 设置为production样式的情况下编译时变得非常奇怪。我已经检查了生产和开发之间的 webpack 配置差异,但这并没有解决任何问题。所以在包中的某个地方,环境似乎以某种方式破坏了事物。

正常发展 正常发展

生产环境使用 <code>import { Grid } from 'material-ui'</code> 在根目录下import { Grid } from 'material-ui'在root中 使用的生产环境

生产环境使用<code>import Grid from 'material-ui/es/Grid/Grid'</code> 在根目录下import Grid from 'material-ui/es/Grid/Grid'在root中 使用的生产环境


老实说,我不知道为什么它会这样。在另一个项目中,我将 material-ui@1.0.0-beta.22 以 react-create-app 为基础进行生产,一切正常。使用 beta 22 也不能解决问题。降级到 react-create-app 中使用的 webpack 3 也不行。我似乎找不到任何可能导致此结果的主要差异。

如果有人能对可能的解决方案有所了解,我将不胜感激。

3个回答

在我发布这个问题之前和 1 小时之后尝试了 5 个小时,我终于找到了原因。IntelliJ 自动导入material-ui/es了包的一些部分,这些部分设法完全打破了生产中的所有样式。混合两个导入位置或仅使用/es导入可能是问题所在。

对我来说,它现在已经在生产中修复了。

一种解决方法,

import {createGenerateClassName} from 'react-jss'
const generateClassName = createGenerateClassName()

<JssProvider generateClassName={generateClassName}>
  <App1 />
</JssProvider>

@kof 在 github 上对类似问题的评论

我有一个类似的问题。这是由开发和生产环境中样式表不同顺序引起的,导致不必要的覆盖。在 dev env 中,创建的所有样式表makeStyles()都在所有 MUI 样式表之后注入,但在生产中它们是混合的。

解决方案:

添加一个选项:{ index: 1 }到所有makeStyles()调用,以便将这些工作表放在索引为 0(默认情况下)的 MUI 工作表之后。这个可选参数直接传递给底层 JSSjss.createStyleSheet()并规定注入顺序:

const useStyles = makeStyles(
  (...),         //  styles
  { index: 1 },  //  optional argument for JSS, to set position after MUI stylesheets
)

(之后:https : //stackoverflow.com/a/62646041/624597