Je crée un projet avec react, redux et next.js, et je souhaite importer des fichiers CSS dans js.
J'ai suivi les instructions dans next.js/# css et next-css , mais je constate que les styles CSS ne fonctionnent pas.
Mon code est le suivant:
pages/index.js:
import React from 'react'
import "../style.css"
class Index extends React.Component {
render() {
return (
<div className="example">Hello World!</div>
);
}
}
export default Index
next.config.js:
const withCSS = require('@zeit/next-css')
module.exports = withCSS()
style.css:
.example {
font-size: 50px;
color: blue;
}
package.json:
{
"name": "my-app",
"version": "0.1.0",
"private": true,
"dependencies": {
"@zeit/next-css": "^0.1.5",
"next": "^6.0.0",
"react": "^16.3.2",
"react-dom": "^16.3.2",
"react-redux": "^5.0.7",
"react-scripts": "1.1.4",
"redux": "^4.0.0",
"redux-devtools": "^3.4.1"
},
"scripts": {
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject",
"dev": "next",
"build": "next build",
"start": "next start"
}
}
Questions :
1. Il y a une "Uncaught SyntaxError" dans Chrome, mais cela ne semble pas affecter le rendu de la page. Mais je me demande toujours la raison et la solution. erreur index.js dans chrome is below img
2. Comme indiqué dans Chrome, il n'y a pas de classe "exemple", ce qui signifie que le fichier style.css n'est pas chargé. Suis-je en train de manquer quelque chose? aucun fichier CSS en chrome
Merci d'avance.
EDIT: à partir de Next.js 7 , tout ce que vous avez à faire pour prendre en charge l'importation de fichiers .css est d'enregistrer le avecCSS plugin dans votre next.config.js. Commencez par installer le plugin:
npm install --save @zeit/next-css
Créez ensuite le next.config.js
fichier dans la racine de votre projet et ajoutez ce qui suit:
// next.config.js
const withCSS = require('@zeit/next-css')
module.exports = withCSS({/* my next config */})
Vous pouvez tester que cela fonctionne en créant une page simple et en important du CSS. Commencez par créer un fichier CSS:
// ./index.css
div {
color: tomato;
}
Créez ensuite le dossier pages
avec un index.js
fichier. Ensuite, vous pouvez faire des choses comme ça dans vos composants:
// ./pages/index.js
import "../index.css"
export default () => <div>Welcome to next.js 7!</div>
Vous pouvez également utiliser des modules CSS avec quelques lignes de configuration. Pour en savoir plus, consultez la documentation sur nextjs.org/docs/#css .
Obsolète: Next.js <7:
Vous devrez également créer un _document.js
fichier dans votre dossier pages
et lien vers le fichier CSS compilé. Essayez-le avec le contenu suivant:
// ./pages/_document.js
import Document, { Head, Main, NextScript } from 'next/document'
export default class MyDocument extends Document {
render() {
return (
<html>
<Head>
<link rel="stylesheet" href="/_next/static/style.css" />
</Head>
<body>
<Main />
<NextScript />
</body>
</html>
)
}
}
La feuille de style est compilée en .next/static/style.css
ce qui signifie que le fichier CSS est servi à partir de /_next/static/style.css
, qui est la valeur de l'attribut href
dans la balise link
dans le code ci-dessus.
Quant à la première question, c'est probablement Chrome ne comprenant pas la syntaxe d'importation. Essayez d'activer l'indicateur Experimental Web Platform dans chrome:flags
et voyez si cela le résout.
vous devez créer un fichier _ document.js personnalisé.
Le document personnalisé lors de l'ajout de css ressemblera à:
import React from "react";
import Document, { Head, Main, NextScript } from "next/document";
export default class MyDocument extends Document {
render() {
const { buildManifest } = this.props;
const { css } = buildManifest;
return (
<html lang="fa" dir="rtl">
<Head>
{css.map(file => (
<link rel="stylesheet" href={`/_next/${file}`} key={file} />
))}
</Head>
<body>
<Main />
<NextScript />
</body>
</html>
);
}
}
Si vous utilisez next.js, faites-le.
créer next.config.js dans les projets racine
const withCSS = require('@zeit/next-css');
function HACK_removeMinimizeOptionFromCssLoaders(config) {
console.warn(
'HACK: Removing `minimize` option from `css-loader` entries in Webpack config',
);
config.module.rules.forEach(rule => {
if (Array.isArray(rule.use)) {
rule.use.forEach(u => {
if (u.loader === 'css-loader' && u.options) {
delete u.options.minimize;
}
});
}
});
}
module.exports = withCSS({
webpack(config) {
HACK_removeMinimizeOptionFromCssLoaders(config);
return config;
},
});
N'oubliez pas de redémarrer le serveur
Comme Zeit a dit:
import Head from 'next/head'
function IndexPage() {
return (
<div>
<Head>
<title>My page title</title>
<meta name="viewport" content="initial-scale=1.0, width=device-width" />
</Head>
<p>Hello world!</p>
</div>
)
}
export default IndexPage
Et c'est tout, de cette façon Next.js devrait afficher la balise de lien dans la tête de la page et le navigateur téléchargera le CSS et l'appliquera.
Merci Sergiodxa à Github pour cette solution claire.