因此,我将一个应用程序从CRA迁移到NextJS,我遇到了一个错误的.module.scss文件的一些组件和页面:
Syntax error: Selector ":global(.label-primary)" is not pure (pure selectors must contain at least one local class or id)
我得到这个错误的所有:global和:local css模块选择器。根据我所搜索的,我可以修复这个问题, Package 选择器在一个类和编辑jsx以及。但这不是会违背它的目的?这是如何工作的CRA版本的应用程序,而不是在NextJS?
编辑:对此我有一个解决方案,就是将:global()selectors移动到导入到_app. js中的全局css文件中,但我的问题是,有没有什么方法可以让这些样式像现在这样可用(:global(...))?
3条答案
按热度按时间mqkwyuun1#
没有,除了覆盖webpack配置本身,目前还没有任何解决方案。它在CRA中工作,因为他们可能有
mode
:local
,而Next.js则具有pure
。我还没有尝试过覆盖
css-loader
webpack config,所以我只是建议一个变通方法。因为你使用的是SCSS,你可以像这样 Package 你的 pseudo-global[1]样式:现在把你的组件/页面 Package 在一个
div
中,并在那个元素上把类设置为styles.root
,然后,在所有的子元素上,你可以直接设置className="foo"
。请注意,您需要考虑使用此方法后的特定性问题,而且此方法不能直接用于动画,您需要分离
keyframes
,然后使其全局化。Demo Sandbox
[1]:这个方法并不能使样式真正的全局化,因为样式仍然是有作用域的。类
foo
只有在某个父类有styles.root
时才能工作。只有当你不打算从其他组件使用:global(.selector)
,而只是因为你想用JS操作类名而不使用styles对象时,这才是最好的。如果你想让它们成为真正的全局变量,那么在
useEffect
钩子中把styles.root
添加到document.documentElement
,如下所示:Demo Sandbox
附言:在
_app
或_document
中向html
注入类与使用全局样式表不完全相同,因为可能会发生这样的情况:您有多页面应用程序,那么由于Next.js会自动进行CSS代码拆分,因此只会请求特定页面上组件的CSS。如果情况并非如此,并且所有页面共享相同的CSS,那么就没有必要使事情复杂化,只需按照传统的方法在_app
中导入样式即可。5anewei62#
我也有同样的问题,正确的写法是
4jb9z9bj3#
另一种方法是制作一个容器,将其 Package ,然后按如下方式将其运出:
第一个
是的,如果你有很多标签和条件,你只需要在CSS文件中包含它们。