web-dev-qa-db-fra.com

Webpack 4 - Echec de l'analyse du module: caractère inattendu '@'

Je suis récemment passé de Webpack 3 à la version 4. Cela génère maintenant une erreur:

Echec de l'analyse du module: Caractère inattendu '@' Vous aurez peut-être besoin d'un chargeur approprié pour gérer ce type de fichier. | @importation './scss/variables.scss'; | | * {@ ./src/index.js 1: 0-22

Dans mon fichier styles.scss, je procède comme suit:

@import 'scss/variables.scss';

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    font-family: Arial, Helvetica, sans-serif;
}

Dans mon fichier index.js, je ne fais que ce qui suit:

import './style.scss';

Dans mon webpack.dev.js, tout ce que j'ai changé était un ajout de mode: 'développement':

const StyleLintPlugin = require('stylelint-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const Dotenv = require('dotenv-webpack');

module.exports = {
    mode: 'development',
    entry: './src/index.js',
    output: {
        filename: 'public/bundle.js'
    },
    module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /node_modules/,
                loader: ['babel-loader', 'eslint-loader']
            },
            {
                test: /\.scss$/,
                loader: ExtractTextPlugin.extract(['css-loader', 'sass-loader'])
            }
        ]
    },
    plugins: [
        new StyleLintPlugin({
            configFile: '.stylelintrc',
            context: 'src',
            files: '**/*.scss',
            failOnError: false,
            quiet: false,
            syntax: 'scss'
        }),
        new ExtractTextPlugin('public/style.css'),
        new Dotenv()
    ]
};

Je ne sais pas quel changement de Webpack 3 à 4 a causé cette erreur.

Le problème que je rencontre est très similaire au problème publié ici: Echec de l'analyse du module Webpack 4: caractère inattendu '@' (1: 0)

J'ai parcouru toutes les questions liées au stackoverflow et aucune d'entre elles n'a été utile.

Voici les dépendances pertinentes dans mon package.json:

"babel-loader": "^7.1.4",
"css-loader": "^0.28.11",
"eslint-loader": "^1.9.0",
"extract-text-webpack-plugin": "^4.0.0-beta.0",
"node-sass": "^4.9.0",
"sass-loader": "^6.0.7",
"style-loader": "^0.20.3",
"stylelint-webpack-plugin": "^0.10.5",
"uglifyjs-webpack-plugin": "^1.2.5",
"webpack": "^4.8.3",
"webpack-cli": "^2.1.4"

Voici les scripts pertinents de mon fichier package.json, à titre de référence dans les commentaires:

"scripts": {
    "watch": "./node_modules/.bin/webpack --mode development --watch --progress",
    "build": "./node_modules/.bin/webpack --mode production"
},
5
Edward

Le problème était que le script que j'utilisais pour exécuter Webpack ne spécifiait pas le fichier de configuration. Voici à quoi cela devrait ressembler:

"scripts": {
  "watch": "./node_modules/.bin/webpack --watch --config webpack.dev.js",
},

Je crois que cela générait le problème @import car il ne chargeait pas css-loader car, sans spécifier le fichier de configuration comme ci-dessus, il utilise une configuration de développement Webpack par défaut qui n'inclut pas le chargeur css.

3
Edward

Comme je l'ai mentionné dans un commentaire sur votre question, la compatibilité de Webpack 4 pose un problème: https://github.com/webpack-contrib/extract-text-webpack-plugin/issues/701

Un correctif pour l'instant consiste à installer la version alpha de la bibliothèque. Je viens de faire une petite configuration pour tester cela et cela fonctionne avec webpack 4.

Installez la version alpha npm i -D extract-text-webpack-plugin@next --save. Installez ensuite css-loader, sass-loader et node-sass.

Puis dans le fichier de configuration webpack:

const ExtractTextPlugin = require('extract-text-webpack-plugin');

...

module: {
    rules: [
        {
            test: /\.(js|jsx)$/,
            use: {
                loader: 'babel-loader'
            },
            exclude: /node_modules/,
            include: path.join(__dirname, 'src')
        },
        {
            test: /\.scss$/,
            loader: ExtractTextPlugin.extract(['css-loader', 'sass-loader'])
        }
    ]
},

plugins: [
    new ExtractTextPlugin('bundle.css'),
]

Cela a fonctionné correctement pour moi et a également concaténé plusieurs fichiers scss utilisant des instructions @import.

Dans package.json cela devrait ressembler à

"extract-text-webpack-plugin": "^4.0.0-beta.0",
"webpack": "^4.8.3"

Edit: Juste comme note latérale, apparemment mini-css-extract-plugin fonctionne bien avec webpack 4.

1
Raul Rene