问题:global()css模块选择器在NextJS中不是纯的

iyfamqjs  于 2022-11-23  发布在  其他
关注(0)|答案(3)|浏览(260)

因此,我将一个应用程序从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(...))?

mqkwyuun

mqkwyuun1#

没有,除了覆盖webpack配置本身,目前还没有任何解决方案。它在CRA中工作,因为他们可能有modelocal,而Next.js则具有pure
我还没有尝试过覆盖css-loader webpack config,所以我只是建议一个变通方法。因为你使用的是SCSS,你可以像这样 Package 你的 pseudo-global[1]样式:

.root :global {
  .foo {
    color: red;
  }
}

现在把你的组件/页面 Package 在一个div中,并在那个元素上把类设置为styles.root,然后,在所有的子元素上,你可以直接设置className="foo"

import styles from "../styles/index.module.scss";

const IndexPage = () => (
  <div className={styles.root}>
    <div className="foo">This text should be red!</div>
  </div>
);

export default IndexPage;

请注意,您需要考虑使用此方法后的特定性问题,而且此方法不能直接用于动画,您需要分离keyframes,然后使其全局化。
Demo Sandbox
[1]:这个方法并不能使样式真正的全局化,因为样式仍然是有作用域的。类foo只有在某个父类有styles.root时才能工作。只有当你不打算从其他组件使用:global(.selector),而只是因为你想用JS操作类名而不使用styles对象时,这才是最好的。
如果你想让它们成为真正的全局变量,那么在useEffect钩子中把styles.root添加到document.documentElement,如下所示:

import { useEffect } from "react";
import styles from "../styles/index.module.scss";

const IndexPage = () => {
  useEffect(() => {
    document.documentElement.classList.add(styles.root);
    return () => {
      document.documentElement.classList.remove(styles.root);
    };
  }, []);

  return (
    <div className="foo">
      This text should be red, even if you put it in another component until the
      page is same. If you want it across pages inject it in _app or _document.
    </div>
  );
};

export default IndexPage;

Demo Sandbox
附言:在_app_document中向html注入类与使用全局样式表完全相同,因为可能会发生这样的情况:您有多页面应用程序,那么由于Next.js会自动进行CSS代码拆分,因此只会请求特定页面上组件的CSS。如果情况并非如此,并且所有页面共享相同的CSS,那么就没有必要使事情复杂化,只需按照传统的方法在_app中导入样式即可。

5anewei6

5anewei62#

我也有同样的问题,正确的写法是

.root:global {
   color:red
}
4jb9z9bj

4jb9z9bj3#

另一种方法是制作一个容器,将其 Package ,然后按如下方式将其运出:
第一个
是的,如果你有很多标签和条件,你只需要在CSS文件中包含它们。

相关问题