Webpack 4 - 模块解析失败:意外字符 '@'

21

我最近从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;
}

在我的index.js文件中,我只做了以下操作:

import './style.scss';
在我的webpack.dev.js文件中,我所做的唯一更改就是添加了mode: '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()
    ]
};

我不知道从Webpack 3到4的哪个变化导致了这个错误。

我遇到的问题与此处发布的问题非常相似:Webpack 4模块解析失败:意外字符'@'(1:0)

我已经查阅了所有相关的stackoverflow问题,但没有一个能够帮助我。

这是我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"
},

可能有帮助:https://dev59.com/D6bja4cB1Zd3GeqPlcbG - Fusseldieb
1
我建议先尝试仅使用style-loadercss-loadersass-loader加载器,以确定问题是否出在ExtractTextPlugin上。 - sdgluck
你是否升级了最新版本的Sass Loader? - Stefano Vuerich
@StefanoVuerich 我删除了 node_modules 并重新运行了 npm install,但现在它甚至无法运行。在测试你的修复程序 Raul Rene 之前,我必须先解决这个问题。 - user8826104
我已经让它运行了,现在正在尝试Raul的修复。 - user8826104
显示剩余6条评论
3个回答

9
问题是我使用的运行Webpack的脚本没有指定配置文件。正确的脚本应该是这样的:

这是一个示例:

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

我认为这是导致@import问题的原因,因为它没有加载css-loader。如果不像上面那样指定配置文件,则使用默认的Webpack开发配置,该配置不包括css-loader。


4
如我在您的问题评论中提到的,Webpack 4 兼容性存在一个未解决的问题:https://github.com/webpack-contrib/extract-text-webpack-plugin/issues/701
现在的解决方法是安装该库的 alpha 版本。我刚刚进行了一次小型设置来测试这个版本,它可以与 webpack 4 兼容。
安装 alpha 版本 npm i -D extract-text-webpack-plugin@next --save。然后安装 css-loadersass-loadernode-sass
接下来在 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'),
]

这个方法对我来说是有效的,而且还可以合并多个使用了@import语句的scss文件。

在package.json中应该像这样:

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

编辑:值得一提的是,显然mini-css-extract-plugin与webpack 4兼容良好。


很不幸,这对我也不起作用。我尝试将webpack降级到4.8.3,并复制你所做的一切,但仍然出现相同的问题。 - user8826104
1
奇怪,我有webpack-cli: 2.1.3版本。我刚试着用 -p 参数运行,仍然可以正常工作。你是如何运行 bundle 的?如果是直接在命令行中运行,可能与全局安装的 npm 版本有关。尝试从 package json 中使用脚本来运行。 - Raul Rene
我已经更新了我的问题,包括我正在使用的脚本。我正在运行 npm run watch - user8826104
抱歉,伙计,我没有其他的想法。请再次检查node_modules中正确的提取插件版本,并确保您已安装alpha版本。 尝试使用仅包含索引文件、webpack和2个scss文件的小型演示设置,看看是否有效。然后逐一找出是哪个出了问题。我的最小示例运行良好。您可以尝试使用mini-css-extract插件。 - Raul Rene
1
谢谢你的帮助,我会试一下的。 - user8826104
显示剩余4条评论

1
这对我很有帮助:将你的webpack样式配置替换为以下代码。
 module: {
        rules: [
          {
            test: /\.(css|sass|scss)$/,
            use: [
              {
                loader: 'style-loader'
              },
              {
                loader: 'css-loader'
              },
              {
                loader: 'sass-loader'
              }
            ]
          }
        ]
      }

我希望这能解决您的问题,谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接