Next.js: العمل مع ملفات css و scss الخارجية

تم إنشاؤها على ١٩ أكتوبر ٢٠١٧  ·  38تعليقات  ·  مصدر: vercel/next.js

إنها قضية زائدة عن الحاجة أعرفها ، لكنني فتحت هذا العدد عن قصد. إنها ثلاثة أيام أقوم فيها بإعداد Boilerplate next.js (مع redux ، redux-saga ، ...) وأنا عالق في إعداد تحميل ملفات css و scss الخارجية لمدة يومين. لقد راجعت باستخدام ورقة الأنماط العامة وأمثلة ورقة الأنماط ذات النطاق و postcss ، ولكن كل واحد منهم لديه مشاكل كبيرة مذكورة في الإصدارات السابقة. لقد رأيت الكثير من المشكلات المفتوحة والمغلقة التي تعمل على حل هذه المشكلة باستخدام الاختراقات ... أعتقد أنها فكرة جيدة أنه بدلاً من ترك المشكلة للعثور على أفضل حل ، قم بحلها بالحلول المتاحة حاليًا حتى تجد حلًا أفضل. لأن الكثيرين لديهم هذه المشكلة الآن ويريدون رؤيتها تم حلها الآن!

التعليق الأكثر فائدة

أود أيضًا أن أشير إلى أنني شخصياً لا أحب اللهجة التي يستخدمها الناس في هذه القضية.
أفهم تمامًا أنك تريد استيراد css. ونحن مدركون تمامًا لهذا الطلب. لهذا قضيت الأسبوع الماضي في العمل على أفضل حل ممكن 👍
المزيد عن هذا قريبًا. حتى ذلك الحين ، من فضلك كوني لطيفة وعطلة سعيدة

ال 38 كومينتر

أوافق ، فقط style-jsx لديه دعم نظيف (بما في ذلك إعادة التحميل الساخن) وهذا ما يمنعني من استخدام Next.js لأي شيء ولكن عندما أحتاج إلى بعض النماذج الأولية السريعة.

أعتقد أن حل مشكلات CSS الخاصة بنطاق وحدات CSS هو حل أكثر وضوحًا ، بالإضافة إلى أنه مع وحدات CSS لا يزال من الممكن تمرير الفئات إلى المكونات الفرعية (حاول وضع فئة غير عالمية على SVG مستورد babel-plugin-inline-react-svg مع التصميم- jsx).

هذا وأنا أفضل أن يكون لدينا ملفات .css موحدة لمنع قفل الإطار قدر الإمكان وملفات CSS خارجية في الإنتاج للتخزين المؤقت (ولجعل MQ polyfills مثل Respond.js تعمل إذا كنت محظوظًا بما فيه الكفاية ل لا يزال يتعين عليك دعم IE8).

+1 ضخمة
إنه لإحباط كبير أن مثل هذا الشيء البسيط مثل css / scss الخارجي يكاد يكون من المستحيل تحقيقه مع next.js ، مما يجعله عديم الفائدة لـ 90٪ من تطبيقاتي.

أنا أعمل مع bootstrap ، وأحتاج إلى تكوين حيث سيكون هناك استيراد عالمي واحد لـ bootstrap css ، مع إضافة css الخارجية ذات النطاق.

بينما تمكنا من الحصول على قلم خارجي يعمل باستخدام jsx 1 المصمم (webpack للتعامل مع التجميع) ، واجهنا صعوبة في اكتشافه على jsx 2 المصمم منذ كسر التغيير في التعامل مع ملفات css المنفصلة المقدمة.
النهج الحالي:

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

سيكون من الرائع رؤية https://github.com/zeit/next.js/tree/master/examples/with-styled-jsx-scss يعمل مع ملفات scss الخارجية.

لقد مررنا بنفس المحنة عند إعداد البيئة.
في النهاية استقرنا على ورقة أنماط عامة باستخدام scss + post css مع الشبكة المفقودة.
يعمل إعادة التحميل السريع ، لذلك على الرغم من أنه ليس حلاً مثاليًا (نظرًا لتحميل ورقة الأنماط العامة دفعة واحدة) ، إلا أنه حل وسط جيد.

التبعيات

"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
آمل أن يساعد

مشكلتي مع كل من هذين النموذجين ( مع ورقة الأنماط العامة وأوراق الأنماط ذات النطاق و postcss ) هي أنه لا يوجد أي منهما

يبدو أن تشغيل ملف المعالج المسبق babel-jest كما هو موضح في إجابة SO هذه يعد اختراقًا سيئًا.

يبدو أنه للحصول على CSS خارجي كما هو الحال مع ورقة الأنماط العامة ، يجب عليك استخدام Webpack ، ولكن لاستخدام 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 وينتج عنه ملف ليس مضمنة