Webpack 4 - Ошибка разбора модуля: неожиданный символ '@' - PullRequest
0 голосов
/ 31 мая 2018

Я недавно обновился с Webpack 3 до 4. Теперь выдает ошибку:

Ошибка синтаксического анализа модуля: непредвиденный символ '@' Вам может потребоваться соответствующий загрузчик для обработки этого типа файлов.|@import './scss/variables.scss';||* {@ ./src/index.js 1: 0-22

В моем файле styles.scss я делаю следующее:

@import 'scss/variables.scss';

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

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

В моем индексе.js файл, я делаю только следующее:

import './style.scss';

В моем webpack.dev.js все, что я изменил, было добавлением режима: 'development':

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()
    ]
};

Iне знаю, какое изменение вызвало эта ошибка с Webpack 3 на 4.

Проблема, с которой я столкнулся, очень похожа на проблему, опубликованную здесь: Ошибка разбора модуля Webpack 4: неожиданный символ '@'(1: 0)

Я прошел через все вопросы, связанные со стековым потоком, и ни один из них не помог.

Вот соответствующие зависимости в моем 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"

Вот соответствующие скрипты в моем файле package.json, для справки в комментариях:

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

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Проблема была в том, что скрипт, который я использовал для запуска Webpack, не указал файл конфигурации.Вот как это должно выглядеть:

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

Я полагаю, что это вызвало проблему @import, потому что он не загружал загрузчик css, так как без указания файла конфигурации, как указано выше, он использует разработку Webpack по умолчаниюконфиг, который не включает css-загрузчик.

0 голосов
/ 31 мая 2018

Как я уже упоминал в комментарии к вашему вопросу, существует открытая проблема совместимости с Webpack 4: https://github.com/webpack-contrib/extract-text-webpack-plugin/issues/701

На данный момент исправление заключается в установке альфа-версии библиотеки.Я только что сделал небольшую настройку, чтобы проверить это, и она работает с веб-пакетом 4.

Установите альфа-версию npm i -D extract-text-webpack-plugin@next --save.Затем установите css-loader, sass-loader и node-sass.

Затем в конфигурационном файле веб-пакета:

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'),
]

Это правильно работает для меня, а также объединяет несколько файлов scss, которые былис использованием @import операторов.

В файле package.json он должен выглядеть следующим образом:

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

Редактировать: Так же, как примечание, очевидно, mini-css-extract-plugin отлично работает с webpack 4.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...