【问题标题】:Webpack 4 - Module parse failed: Unexpected character '@'Webpack 4 - 模块解析失败:意外字符'@'
【发布时间】:2018-11-10 09:19:20
【问题描述】:

我最近从 Webpack 3 升级到 4。它现在抛出一个错误:

模块解析失败:意外字符“@”您可能需要一个 适当的加载器来处理这种文件类型。 | @进口 './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 Module parse failed: Unexpected character '@' (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 文件中的相关脚本,供 cmets 参考:

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

【问题讨论】:

  • 感谢您的评论,但我已经解决了所有相关的 stackoverflow 问题,但没有一个对我有帮助:(。
  • 我建议先尝试加载程序style-loadercss-loadersass-loader,看看问题是否出在ExtractTextPlugin。
  • 你升级 sass 加载器到最新版本了吗?
  • 嗨@sdgluck 我刚刚尝试过,不幸的是我仍然遇到同样的问题,不过感谢您的建议。

标签: javascript webpack


【解决方案1】:

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

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

我相信这会产生@import 问题,因为它没有加载 css-loader,因为它没有像上面那样指定配置文件,它使用不包含 css-loader 的默认 Webpack 开发配置。

【讨论】:

    【解决方案2】:

    正如我在对您的问题的评论中提到的,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 以及复制你所做的一切,但它仍然产生同样的问题。
    • 你使用的 webpack-cli 是什么版本的?另外,您如何运行捆绑包?您是否尝试过使用 rules 而不是 loaders 并删除其他插件?
    • "webpack-cli": "^2.1.4" - 我现在使用的是规则而不是加载器。
    • 奇怪。我有webpack-cli: 2.1.3。我刚刚尝试使用-p 进行生产,但仍然有效。你是如何运行捆绑包的?如果它直接来自 cmd 行,则可能与全局安装的 npm 版本有关。尝试使用包 json 中的脚本
    • 感谢您的帮助,我会试一试的。
    【解决方案3】:

    这对我有用:将您的 webpack 样式配置替换为以下代码

     module: {
            rules: [
              {
                test: /\.(css|sass|scss)$/,
                use: [
                  {
                    loader: 'style-loader'
                  },
                  {
                    loader: 'css-loader'
                  },
                  {
                    loader: 'sass-loader'
                  }
                ]
              }
            ]
          }
    

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

    【讨论】:

      猜你喜欢
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 2019-03-31
      • 2018-03-29
      • 2019-06-03
      • 2019-10-11
      • 1970-01-01
      相关资源
      最近更新 更多