Next.js: Trabalhar com arquivos css e scss externos

Criado em 19 out. 2017  ·  38Comentários  ·  Fonte: vercel/next.js

É um problema redundante, eu sei, mas abri esse problema intencionalmente. Faz três dias que estou configurando um boilerplate next.js (com redux, redux-saga, ...) e faz dois dias que estou preso na configuração do carregamento de arquivos css e scss externos. Verifiquei os exemplos with-global-stylesheet e with-scoped-stylesheet-and-postcss , mas cada um deles tem problemas importantes mencionados em edições anteriores. Já vi muitos problemas abertos e fechados que estão resolvendo esse problema com hacks ... Eu acho uma boa ideia que ao invés de deixar o problema para encontrar a melhor solução, resolva-o com as soluções atuais disponíveis até encontrar uma melhor. Porque muitos têm esse problema agora e querem vê-lo resolvido agora!

Comentários muito úteis

Também gostaria de salientar que, pessoalmente, não gosto do tom que as pessoas estão dando nesta edição.
Eu entendo perfeitamente que você deseja importar css. E estamos bem cientes desse pedido. É por isso que passei a semana passada trabalhando na melhor solução possível 👍
Mais sobre isso em breve. Até então, por favor, seja gentil e feliz feriado 🎅😄

Todos 38 comentários

Eu concordo, apenas styled-jsx tem suporte limpo (incluindo recarregamento a quente) e é isso que me impede de usar Next.js para qualquer coisa, exceto quando eu preciso de um prototipagem rápida.

Acho que a solução para os problemas de escopo de CSS dos Módulos CSS é muito mais limpa, além disso, com os Módulos CSS ainda é possível passar classes para componentes filhos (tente colocar uma classe não global em um SVG importado com babel-plugin-inline-react-svg com jsx com estilo).

Isso e eu prefiro ter arquivos .css padronizados para evitar o bloqueio de estrutura o máximo possível e arquivos CSS externos em produção para armazenamento em cache (e para fazer polyfills MQ como Respond.js funcionarem se você tiver o azar de ainda tem que oferecer suporte ao IE8).

Massive +1
É uma grande frustração que algo tão simples como css / scss externo seja quase impossível de conseguir com next.js, o que o torna inútil para 90% dos meus aplicativos.

Estou trabalhando com bootstrap e preciso de uma configuração onde haverá uma importação css de bootstrap global, com adição de css com escopo externo.

Embora tenhamos conseguido trabalhar com o stylus externo com jsx 1 estilizado (webpack para lidar com a compilação), tivemos dificuldade em descobrir no jsx 2 estilizado desde que introduziu uma mudança significativa no manuseio de arquivos css separados.
Abordagem atual:

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

Seria ótimo ver https://github.com/zeit/next.js/tree/master/examples/with-styled-jsx-scss trabalhando com arquivos scss externos.

Passamos pela mesma provação ao configurar o ambiente.
Eventualmente, estabelecemos uma folha de estilo global com scss + post css com lost-grid.
O recarregamento a quente funciona, portanto, embora não seja a solução ideal (devido à folha de estilo global ser carregada de uma só vez), é um compromisso ok.

Dependências

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

Em package.json

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

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

Em pages/_document.js

...

import stylesheet from 'styles/main.scss'

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

E você pode gerenciar seus estilos começando em /styles/main.scss
Espero que ajude

Meu problema com cada um desses dois exemplos de estilo ( with-global-stylesheet e with-scoped-stylesheets-and-postcss ) é que nenhum deles é simples de integrar com o teste Jest e Snapshot com o CSS no instantâneo. Tem havido pessoas que conseguem fazer o Jest trabalhar com o Webpack, mas isso é especificamente ignorando o CSS.

Executar um arquivo de pré-processador babel-jest conforme descrito nesta resposta do SO parece um hack muito ruim.

Parece obter CSS externo como with-global-stylesheet, você deve usar o Webpack, mas para usar o Jest você não pode confiar no Webpack, apenas no Babel.

Alguém tem ideias neste espaço?

Estou enfrentando um problema semelhante. Sou novo no nextjs e não consigo fazer o exemplo "with-external-scoped-css" funcionar corretamente. Às vezes, meu css está carregado e às vezes não. Não sei se é o mesmo assunto de que você está falando.

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

Resolvidos problemas de estilos externos com este carregador https://github.com/coox/styled-jsx-css-loader

@ilionic Eu verifiquei sua solução. É ótimo! Obrigado :)

@arefaslani Não creio que este assunto esteja encerrado.

A partir do HTTP v1 ainda é uma taxa de desempenho horrível para carregar toneladas de CSS, aumenta drasticamente o tempo para desenhar pela primeira vez.

O suporte de estilo externo adequado permitiria a importação de CSS e resultaria em um não é um inline