Next.js: 倖郚のcssおよびscssファむルの操䜜

䜜成日 2017幎10月19日  Â·  38コメント  Â·  ゜ヌス: vercel/next.js

これは私が知っおいる冗長な問題ですが、私はこの問題を意図的に開きたした。 next.jsボむラヌプレヌトredux、redux-sagaなどをセットアップするのに3日かかり、倖郚cssファむルずscssファむルのロヌドのセットアップに行き詰たるのは2日です。 with-global-stylesheetずwith-scoped-stylesheet-and-postcssの䟋を確認したしたが、それぞれに前の号で述べた倧きな問題がありたす。 ハックでこの問題を解決しおいるオヌプンおよびクロヌズの問題が倚すぎたす...問題を残しお最良の解決策を芋぀けるのではなく、珟圚利甚可胜な解決策で解決しお、より良い解決策を芋぀けるこずをお勧めしたす。 倚くの人が今この問題を抱えおいお、今それが解決されるのを芋たいからです

最も参考になるコメント

たた、私は個人的にこの問題で人々が持っおいる口調が奜きではないこずを指摘したいず思いたす。
私はあなたがcssをむンポヌトしたいず思っおいるこずを完党に理解しおいたす。 そしお、私たちはこの芁求をよく知っおいたす。 そのため、私はこの1週間、可胜な限り最良の゜リュヌションに取り組んできたした👍
これに぀いおはすぐに詳しく説明したす。 それたでは、芪切で幞せな䌑日をお過ごしください🎅😄

党おのコメント38件

私は同意したす、styled-jsxだけがクリヌンなホットリロヌドを含むサポヌトを持っおおり、それが私がラピッドプロトタむピングを必芁ずするずき以倖にNext.jsを䜿甚するこずを劚げおいる理由です。

CSSモゞュヌルのCSSのスコヌプの問題に察する解決策ははるかにクリヌンなものだず思いたす。さらに、CSSモゞュヌルを䜿甚するず、クラスを子コンポヌネントに枡すこずができたす babel-plugin-inline-react-svgむンポヌトされたSVGに非グロヌバルクラスを配眮しおみおください styled-jsxを䜿甚。

それず私は、フレヌムワヌクのロックむンを可胜な限り防ぐために.cssファむルを暙準化し、キャッシュ甚に本番環境で倖郚CSSファむルを䜿甚するこずを奜みたすそしお、運が悪ければRespond.jsのようなMQポリフィルを機胜させるためにただIE8をサポヌトする必芁がありたす。

倧芏暡な+1
倖郚のcss / scssのような単玔なこずをnext.jsで実珟するこずはほずんど䞍可胜であり、それが私のアプリケヌションの90で圹に立たないこずは、倧きなフラストレヌションです。

ブヌトストラップを䜿甚しおいたすが、倖郚スコヌプのcssを远加しお、グロヌバルブヌトストラップcssむンポヌトが1぀ある構成が必芁です。

スタむル付きjsx1コンパむルを凊理するためのwebpackで倖郚スタむラスを動䜜させるこずができたしたが、個別のcssファむルの凊理の倉曎が導入されたため、スタむル付きjsx2でそれを理解するのに苊劎したした。
珟圚のアプロヌチ

import ComponentStyles from './footer.styl';
...
      <style jsx>
        {ComponentStyles}
      </style>

https://github.com/zeit/next.js/tree/master/examples/with-styled-jsx-scssが倖郚のscssファむルを操䜜しおいるのを芋るのは玠晎らしいこずです。

環境を敎えるずきも同じ詊緎を経隓したした。
最終的には、scss + postcssずlost-gridを䜿甚したグロヌバルスタむルシヌトで解決したした。
ホットリロヌドは機胜するため、グロヌバルスタむルシヌトが䞀床にロヌドされるため理想的な゜リュヌションではありたせんが、劥協点ずしおは問題ありたせん。

䟝存関係

"autoprefixer": "^7.1.6",
"babel-plugin-module-resolver": "^2.7.1",
"babel-plugin-wrap-in-js": "^1.1.1",
"node-sass": "^4.5.3",
"sass-loader": "^6.0.6",
"pixrem": "^4.0.1",
"postcss-easy-import": "^3.0.0",
"postcss-loader": "^2.0.8"

package.json

  ...
  "postcss": {
    "plugins": {
      "lost": {},
      "postcss-easy-import": {
        "prefix": "_"
      },
      "autoprefixer": {},
      "pixrem": {}
    }
  }
  ...

next.config.js

webpack: (config, { dev }) => {
    config.module.rules.push(
      {
        test: /\.(css|scss)/,
        loader: 'emit-file-loader',
        options: {
          name: 'dist/[path][name].[ext]'
        }
      }
    ,
      {
        test: /\.css$/,
        use: ['babel-loader', 'raw-loader', 'postcss-loader']
      }
    ,
      {
        test: /\.s(a|c)ss$/,
        use: ['babel-loader', 'raw-loader', 'postcss-loader',
          { loader: 'sass-loader',
            options: {
              includePaths: ['styles', 'node_modules']
                .map((d) => path.join(__dirname, d))
                .map((g) => glob.sync(g))
                .reduce((a, c) => a.concat(c), [])
            }
          }
        ]
      }
    )
    return config
  }

pages/_document.js

...

import stylesheet from 'styles/main.scss'

   ...
        <Head>
          <style dangerouslySetInnerHTML={{ __html: stylesheet }} />
        </Head>
   ...

そしお、/ styles /main.scssからスタむルを管理できたす。
それが圹に立おば幞い

これらの2぀のスタむル䟋 with-global-stylesheetずwith-scoped-stylesheets-and-postcss のそれぞれに関する私の問題は、スナップショット内のCSSを䜿甚したJestおよびSnapshotテストずの統合が簡単ではないこずです。 JestをWebpackで動䜜させるこずに成功した人もいたすが、それは特にCSSをスキップするこずによるものです。

このSOの回答で説明されbabel-jestプリプロセッサフ​​ァむルを実行するこずは、非垞に悪いハックのようです。

with-global-stylesheetのように倖郚CSSを取埗するようですが、Jestを䜿甚するには、Webpackに䟝存するこずはできず、Babelのみに䟝存したす。

この分野で誰かアむデアがありたすか

私も同様の問題に盎面しおいたす。 nextjsは初めおで、「with-external-scoped-css」の䟋を正しく機胜させるこずができたせん。 私のcssがロヌドされるこずもあれば、ロヌドされないこずもありたす。 それがあなたが話しおいるのず同じ問題であるかどうかはわかりたせん。

https://github.com/zeit/next.js/issues/3276

このロヌダヌで解決された倖郚スタむルの問題https://github.com/coox/styled-jsx-css-loader

@ilionic私はあなたの解決策をチェックしたした。 それは玠晎らしい ありがずうございたした 

@arefaslaniこの問題は解決されおいないず思いたす。

HTTP v1の時点では、倧量のCSSをロヌドするのは䟝然ずしお恐ろしいパフォヌマンス皎であり、最初に描画するたでの時間が劇的に長くなりたす。

適切な倖郚スタむルのサポヌトにより、CSSのむンポヌトが可胜になり、結果ずしおむンラむンではありたせん