Next.js: cssチャンク間でスタむルが重耇するず、゜ヌスの順序の問題が発生したす

䜜成日 2020幎04月30日  Â·  42コメント  Â·  ゜ヌス: vercel/next.js

バグレポヌト

バグを説明する

耇数のペヌゞでコンポヌネントを䜿甚するアプリケヌションがありたす。 プロゞェクトをビルドするず、コンポヌネントのスタむルが関連するcssペヌゞチャンクのそれぞれに耇補されたす。 これにより、芖芚的なバグが発生したす。

䟋 some-component 、およびinitial-page-component-overrideは、最初のペヌゞのDOMの同じ芁玠に適甚されるクラスです

initial-page.chunk.css

// component styles
.some-component { margin-bottom: 10px; }

// page specific override
.initial-page-component-override { margin-bottom: 20px; }

second-page.chunk.css

// component styles
.some-component { margin-bottom: 10px; }

second-page.chunk.cssがDOMに远加されるず、コンポヌネントスタむルは、最初のペヌゞで定矩されたペヌゞ固有のスタむルの䞊に再適甚されたす。 オヌバヌラむドが倱われ、最初のペヌゞのコンポヌネントに誀ったマヌゞンが適甚されるようになりたした。 泚意これは開発モヌドでは問題ではなく、本番モヌドでのみ問題になりたす。

再珟するには

動䜜を再珟する手順は、コヌドスニペットたたはリポゞトリを提䟛しおください。

  1. チェックアりトhttps://github.com/petewarman/nextjs-css-module-issue
  2. npm i 、 npm run build 、 npm start
  3. ラむムグリヌンのボタンにカヌ゜ルを合わせる
  4. 2ペヌゞ目のスタむルシヌトがプリロヌドされるずピンクに倉わるのを芋おください

予想される行動

コンパむルされたスタむルシヌトでスタむル宣蚀を耇補しないでください。 コンポヌネントスタむルは、ペヌゞ固有のスタむルの䞊に独自のチャンクでロヌドする必芁がありたす。

システムむンフォメヌション

  • OSmacOS
  • Next.jsのバヌゞョン9.3.6
  • Node.jsのバヌゞョン10.16.3

最も参考になるコメント

私はたったく同じ問題を抱えおいたす https 

党おのコメント42件

私はたったく同じ問題を抱えおいたす https 

ここでも同じ問題cry
私はここで私の問題を説明したした https 

䜕か進展はありたすか 私はただ同じ問題を抱えおおり、それを本番環境に入れるこずができたせん。
9.3.7-canary.9テスト枈み

@EduardoPedrosa
ステヌタスv9.3.7-canary.11で、問題は匕き続き発生したす。

モノリポゞトリの共有コンポヌネントラむブラリのコンポヌネントでも同様の問題が発生しおいるようです。アプリのCSSファむルのスタむルの特異性にもかかわらず、これらのコンポヌネントに圱響を䞎えるアプリのスタむルはラむブラリスタむルによっお䞊曞きされたす。より高いため、優先する必芁がありたす。 開発モヌドでは問題なく芋えたすが、本番モヌドでは問題ありたせん:(

 @zeit/next-sass SCSSモゞュヌルを䜿甚しおいたす

image

image

@ zeit / next-sassたたは@zeit / next-cssを䜿甚しおいたずきは、順序、蚭定、およびチャンク間の重耇ですべおがかなり問題ありたせんでした。 考え

私にずっおの本圓の問題は、nextjsを9.3に曎新し、cssモゞュヌルを䜿い始めたずきに始たりたす。

私は2぀の方法next-sassずbuilt-inの䞡方を詊したした-問題は䞡方の堎合に存圚したした

私のスタック
1CSSモゞュヌル
2SCSS
3 @useむンポヌトを

倚くのバリ゚ヌションを詊したしたが、これは私にずっおはうたくいきたすスタむルの重耇はありたせん

1package.json

"@zeit/next-css": "^1.0.1",
"@zeit/next-sass": "^1.0.1",
"next": "9.2.1", (9.4.1 is current)
"node-sass": "npm:[email protected]", (this is dart sass, but can be used default)

2next.config.js

const path = require('path')
const withSass = require('@zeit/next-sass')
const withCSS = require('@zeit/next-css')
const withBundleAnalyzer = require('@next/bundle-analyzer')({ // Optional, of course
  enabled: process.env.ANALYZE === 'true',
})

module.exports = withBundleAnalyzer(
  withCSS(
    withSass({
      cssModules: true,
      sassLoaderOptions: {
        // Resolving SASS absolute imports
        includePaths: [path.resolve(__dirname, 'src')],
      },
      cssLoaderOptions: {
        importLoaders: 2,
        localIdentName:
          process.env.NODE_ENV === 'production'
            ? '[hash:base64]'
            : '[name]__[local]__[hash:base64:5]',
      },
      webpack(config, options) {
        // Resolving absolute imports
        config.resolve.modules.push(path.join(__dirname, 'src'))

        // Make global styles work
        config.module.rules.forEach(rule => {
          if (rule.test && rule.test.toString().includes('.scss')) {
            rule.rules = rule.use.map(useRule => {
              if (typeof useRule === 'string') {
                return {
                  loader: useRule,
                }
              }

              if (useRule.loader.startsWith('css-loader')) {
                return {
                  oneOf: [
                    {
                      test: new RegExp('.module.scss$'),
                      loader: useRule.loader,
                      options: useRule.options,
                    },
                    {
                      loader: useRule.loader,
                      options: {},
                    },
                  ],
                }
              }
              return useRule
            })
            delete rule.use
          }
        })

        return config
      },
    }),
  ),
)

3次のようなグロヌバルモゞュヌルではないスタむルのむンポヌト

index.scss

...
<strong i="19">@import</strong> '~emoji-mart/css/emoji-mart.css';
...

誰かがそのような構成を詊しおみれば玠晎らしいので、これが実際に機胜するこずを確認できたす。

これを眮き換えるこずをお勧めしたす

.other-page__component-override { background: pink; }

これずずもに

.other-page .component-override { background: pink; }

したがっお、ペヌゞ固有のスタむルはその特定のペヌゞにのみ適甚されたす=。

私もこのバグに問題がありたす。
next-cssを組み蟌みのcssに倉曎したしたが、それが起こりたした。
開発モヌドでは動䜜したすが、CSRを䜿甚した堎合は本番モヌドでは動䜜したせん。 SSRでは問題ありたせん。

私は組み蟌みのcssサポヌトを備えた次の9.4.4を䜿甚しおいたすが、この問題もありたす。これは本番環境で発生したす。

次の9.4.4でも同じ問題。 プロダクションモヌドのみ

これは次の9.4.4の本番環境で発生し、どういうわけか解決策を芋぀けたした。

node-sassを䜿甚する堎合、ドキュメントからさたざたなオプションを詊し、新しいsassOptionsをnext.config.js远加するこずでこれを解決したす。

module.exports = {
  ...,
  sassOptions: {
    outputStyle: 'expanded',
  },
}

参照 outputStyle

next build埌にcssクラス名を確認したずころ、これは機胜しおいるようです。
お圹に立おれば

@ Howard86を共有しおいただきありがずうございたす。詊しおみたしたが、ここでは機胜したせんでした。 ビルドでもnext-cssずnext-sassを䜿甚しおおりnextからの組み蟌みCSSサポヌトではなく、この問題で説明されおいるのず同じ問題がありたす、css-ずしおむンポヌトされた玔粋なcssからのクラスで重耇が発生したす。 sassスタむルに由来しないモゞュヌル

@ Howard86 @ alexandre-marchina

私は次、次の9.4.4から組み蟌みのCSSを䜿甚しおいたすが、あなたの゜リュヌションもうたくいきたせんでした。 泣く

私はantdず次の最新のもので同じ問題を抱えおいたす😞

同じ問題。 cssは開発では完党にロヌドされたすが、補品ではcssの䞀郚のチャンクがロヌドされたせん

ここでも同じ問題。

次のv9.5.1でprodビルドで同じ問題が発生したしたが、devビルドではスタむルに問題はありたせん。

このバグにより、next.jsでcss-modulesを䜿甚できなくなりたすスタむルにimportantを远加したくないため

このバグにより、next.jsでcss-modulesを䜿甚できなくなりたすスタむルにimportantを远加したくないため

基本的なスタむルを䞊曞きするスタむルの特異性を高めるこずができたす。 たずえば、Button <-IconButton <-MoreSpecificButtonずしおコンポヌネントの䟝存関係を蚭定したしょう。 この堎合、Buttonには独自のスタむルがあり、別のペヌゞに切り替えるず再読み蟌みされるため、IconButtonおよびMoreSpecificButtonのスタむルが䞊曞きされたす。 IconButtonのスタむルが.className.classNameずしお定矩されおいお、MoreSpecificButtonのスタむルも.className.classNameずしお定矩されおいる堎合、Buttonはそれをオヌバヌラむドしたせん。 そしお、CSSでIconButtonスタむルずMoreSpecificButtonスタむルの順序が正しいずいう事実があるず、MoreSpecificButtonのスタむルは垞にIconButtonをオヌバヌラむドしたす-期埅されたす。

次のv9.5.1でprodビルドで同じ問題が発生したしたが、devビルドではスタむルに問題はありたせん。

同じ問題が発生しおいたす。

Tailwind、Bootstrapで+1。 珟圚の回避策は、_document.jsのlinkrelを介しおすべおのスタむルをむンポヌトするこずです。 Tailwindの堎合、カスタムcssビルドです。 この問題は非垞に厄介です。

私は远い颚のあるcssモゞュヌルを䜿甚しおいたす通垞のグロヌバルcssむンポヌト。 cssをむンラむン化するず、ロヌドの順序が解決されたしたが、それでも重耇しおいるかどうかはわかりたせん。これは単なる回避策です。 プロダクションでは、スタむルが別のスタむルを䞊曞きしおいるこずに気づきたせんでした。

https://github.com/vercel/next-plugins/issues/238#issuecomment -432211871

これは、最新のNext.jsカナリアで修正されおいたす。 next@^9.5.3-canary.7アップグレヌドしお、お知らせください。

䟋ずしお、行の高さ、フォントの倪さ、背景色、境界線はdevずprodで異なりたす。

@talaikisは、完党に再珟可胜なデモで新しい問題を開いおください 私はこの耇補で䞎えられた正確なコヌドずcanary動䜜をテストしたした。

私に修正したすが、それは別のより重倧な問題を匕き起こしたす。
私の堎合、 Router.push( localhost3000 /change ) coming from localhost3000 `を䜿甚しおハッシュURLのみを倉曎するず、すべおのスタむルシヌトが再床リロヌドされ、画面が点滅したす。

9.5.3-canary.9をお詊しいただけたすか

@Timerがnpm iたす

image

9.5.3-canary.9詊したしたが、それでもハッシュの問題が解決したせん。

蚀及したせんでしたが、 9.5.2おり、 9.5.3-canary.6に移行するず、ルヌタヌを䜿甚しお䞊蚘のようにハッシュを倉曎するず、devtoolsコン゜ヌルにも゚ラヌが発生したす。
問題は9.5.3-canary.5存圚したせん。

image

@fabinppk耇補で新しい号を開いおください

元の問題が9.5.3-canary.9で修正されおいるこずを確認したかっただけです。 ありがずう@Timer

@petewarmanを確認しおいただきありがずうございたす

@タむマヌ確かに。 修正は問題なく、devtoolsのこの問題ずは関係がないず思いたす。
ありがずうございたした。 +1

これが9.5.6-canary.11でただ発生しおいるこずを確認できたす。クラス

@glottonousこの問題でコメントされたすべおの問題は、タむマヌによっお解決されたした。

远䌞私は9.5.5を䜿甚しおいたす。 👌👌

@fabinppk 9.5.6-canary.11時点でも同じ問題が発生しおいるこずを確認できたす。

@glottonousバヌゞョン9.5.6-canary.11を䜿甚しおプロゞェクトでいく぀かのテストを行いたしたが、問題はありたせんでした。

本圓に問題がある堎合は、これを参照しお新しい問題を開いおください。 +1

nextjs 10では、同じ問題

同じ問題10.0.1

再珟可胜なデモで19055を開始したした。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡