Next.js: Bekerja dengan file css dan scss eksternal

Dibuat pada 19 Okt 2017  ·  38Komentar  ·  Sumber: vercel/next.js

Ini adalah masalah yang berlebihan yang saya tahu, tetapi saya membuka masalah ini dengan sengaja. Sudah tiga hari saya menyiapkan boilerplate next.js (dengan redux, redux-saga, ...) dan dua hari saya terjebak dalam menyiapkan memuat file css dan scss eksternal. Saya telah memeriksa contoh with-global-stylesheet dan with-scoped-stylesheet-and-postcss , tetapi masing-masing dari mereka memiliki masalah besar yang disebutkan dalam masalah sebelumnya. Saya telah melihat terlalu banyak masalah terbuka dan tertutup yang memecahkan masalah ini dengan peretasan... Saya pikir itu ide yang baik bahwa alih-alih meninggalkan masalah untuk menemukan solusi terbaik, selesaikan dengan solusi yang tersedia saat ini sampai menemukan yang lebih baik. Karena banyak yang memiliki masalah ini sekarang dan ingin melihatnya diselesaikan sekarang!

Komentar yang paling membantu

Saya juga ingin menunjukkan bahwa saya pribadi tidak menyukai nada bicara orang dalam masalah ini.
Saya benar-benar mengerti Anda ingin mengimpor css. Dan kami sangat menyadari permintaan ini. Itu sebabnya saya menghabiskan seminggu terakhir untuk mencari solusi terbaik 👍
Lebih lanjut tentang ini segera. Sampai saat itu, harap bersikap baik dan selamat berlibur

Semua 38 komentar

Saya setuju, hanya styled-jsx yang memiliki dukungan clean (termasuk hot reloading) dan itulah yang mencegah saya menggunakan Next.js untuk apa pun kecuali ketika saya membutuhkan prototyping cepat.

Saya pikir solusi untuk masalah pelingkupan CSS dari Modul CSS jauh lebih bersih, ditambah dengan Modul CSS itu masih mungkin untuk meneruskan kelas ke komponen anak (coba letakkan kelas non-global pada SVG yang diimpor dengan babel-plugin-inline-react-svg dengan styled-jsx).

Itu dan saya lebih suka memiliki file .css untuk mencegah penguncian kerangka kerja sebanyak mungkin dan file CSS eksternal dalam produksi untuk caching (dan untuk membuat polyfill MQ seperti Respond.js berfungsi jika Anda kurang beruntung untuk masih harus mendukung IE8).

+1 besar-besaran
Ini adalah frustrasi besar bahwa hal sederhana seperti css/scss eksternal hampir tidak mungkin dicapai dengan next.js, yang menjadikannya tidak berguna untuk 90% aplikasi saya.

Saya bekerja dengan bootstrap, dan saya memerlukan konfigurasi di mana akan ada satu impor bootstrap css global, dengan tambahan css lingkup eksternal.

Sementara kami berhasil mendapatkan stylus eksternal yang berfungsi dengan jsx 1 ( webpack untuk menangani kompilasi ), mengalami kesulitan mencari tahu di jsx 2 yang ditata sejak melanggar perubahan penanganan file css terpisah yang diperkenalkan.
Pendekatan saat ini:

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

Akan sangat bagus untuk melihat https://github.com/zeit/next.js/tree/master/examples/with-styled-jsx-scss bekerja dengan file scss eksternal.

Kami mengalami cobaan yang sama saat menyiapkan lingkungan.
Akhirnya kami menyelesaikan dengan stylesheet global dengan scss+post css dengan lost-grid.
Reload panas berfungsi, jadi meskipun ini bukan solusi ideal (karena stylesheet global dimuat sekaligus), ini adalah kompromi yang baik.

Ketergantungan

"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"

Di package.json

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

Di 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
  }

Di pages/_document.js

...

import stylesheet from 'styles/main.scss'

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

Dan Anda kemudian dapat mengatur gaya Anda mulai dari /styles/main.scss
Semoga membantu

Masalah saya dengan masing-masing dari dua contoh gaya ini ( with-global-stylesheet dan with-scoped-stylesheets-and-postcss ) adalah tidak satupun dari mereka yang mudah diintegrasikan dengan pengujian Jest dan Snapshot dengan CSS di snapshot. Ada orang yang berhasil membuat Jest bekerja dengan Webpack, tapi itu dengan melewatkan CSS secara khusus.

Menjalankan file praprosesor babel-jest seperti yang dijelaskan dalam jawaban SO ini sepertinya merupakan peretasan yang buruk.

Tampaknya untuk mendapatkan CSS eksternal karena dengan-global-stylesheet Anda harus menggunakan Webpack, tetapi untuk menggunakan Jest Anda tidak dapat mengandalkan Webpack, hanya Babel.

Apakah ada yang punya ide di ruang ini?

Saya menghadapi masalah serupa. Saya baru mengenal nextjs dan saya tidak dapat membuat contoh "with-external-scoped-css" berfungsi dengan baik. Terkadang, css saya dimuat dan terkadang tidak. Saya tidak tahu apakah itu masalah yang sama yang Anda bicarakan.

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

Menyelesaikan masalah gaya eksternal dengan pemuat ini https://github.com/coox/styled-jsx-css-loader

@ilionic Saya telah memeriksa solusi Anda. Itu bagus! Terima kasih :)

@arefaslani Saya rasa masalah ini belum selesai.

Pada HTTP v1 itu masih merupakan pajak kinerja yang mengerikan untuk memuat banyak CSS, ini meningkatkan waktu untuk menggambar pertama secara dramatis.

Dukungan gaya eksternal yang tepat akan memungkinkan untuk mengimpor CSS dan menghasilkan a bukan sebaris