next info
(从版本 12.0.8 及更高版本可用)
Operating System:
Platform: darwin
Arch: x64
Version: Darwin Kernel Version 20.3.0: Thu Jan 21 00:06:51 PST 2021; root:xnu-7195.81.3~1/RELEASE_ARM64_T8101
Binaries:
Node: 14.17.0
npm: 6.14.13
Yarn: 1.22.10
pnpm: N/A
Relevant packages:
next: 12.0.8
react: 17.0.2
react-dom: 17.0.2
您使用的 Next.js 版本是什么?
12.0.8
您使用的 Node.js 版本是什么?14.17
描述错误使用 加载组件时next/dynamic
,CSS 模块有时无法正确加载。这看起来可能类似于https://github.com/vercel/next.js/issues/18252,它被描述为已修复(尽管没有链接的 PR 显示修复)。
此错误仅在运行next build
+时发生next start
。在开发中按预期工作 ( next dev
)。此外,它发生的情况似乎非常具体,我试图在重现步骤中尽可能清晰、简洁地概述这些情况。
CSS 模块应加载到文档中,以便应用您的样式。
重现 Repro 存储库和部署create-next-app --typescript
我使用12.0.8创建了一个演示: https://github.com/jzxhuang/dynamic-import-css-module-next-bug
它托管在: https: //dynamic-import-css-module-next-bug.vercel.app/
隔离繁殖步骤- 直接转到https://dynamic-import-css-module-next-bug.vercel.app/broken/one ,注意按钮有红色背景。
- 单击链接到
/foo
.该按钮现在将具有清晰的背景,即使它是完全相同的组件,没有任何更改。
这可以通过 SCSS 和 CSS 模块来重现。使用https://dynamic-import-css-module-next-bug.vercel.app/broken/two重复上述步骤将破坏蓝色按钮。这仅在“生产”版本中重现,如果您遵循与 相同的步骤next dev
,则 上的按钮/foo
应始终为正确的颜色。
上述步骤是我们在生产中发现的此错误的独立再现。现在,事情开始变得非常奇怪,我们决定做一些更多的实验。我不确定以下场景是否会有帮助,或者只是让您陷入白费力气,但我们开始吧:
- 转到https://dynamic-import-css-module-next-bug.vercel.app
- 点击链接
/broken/one
,请勿刷新 - 单击链接到
/foo
. - 预计按钮现在是红色的......
我们还在 paths 下创建了一些其他示例/working/*
。这里唯一的区别是我们加载 2、3 或 0 个按钮。由于某种原因,这些似乎工作正常,但如果您只加载一个broken/one
按钮(如和中所示) broken/two
,样式就会被破坏。
回到有意义的事情。该示例/working/three
表明蓝色按钮始终是正确的颜色。它不是在 /foo 中动态导入的,因此不存在与动态导入的按钮相同的错误。
在 /broken/one 上,我们看到按钮具有comp-one_button__MtA0_
样式表中的类0ff09bacf4af1553.css
。
当我们点击进入时/foo
,按钮仍然具有相同的类,但样式表没有被应用。
我不确定这可能的根本原因是什么,但在动态导入时不知何故缺少样式表,并且它似乎与在动态导入的组件内使用前一个组件上的组件有关。