Webpack在SCSS @import SCSS上抛出错误

时间:2017-11-14 17:20:13

标签: css webpack sass webpack-2

我尝试将多个SCSS文件处理到Webpack(3.6.0)中的单个外部CSS文件中,除了我遇到有关解析@import语句的问题。

条目index.js包含:

import './styles/main.scss';

条目SCSS:

@import 'reset.scss';
@import 'global.scss';
@import 'fonts.scss';
@import 'system.scss';

当前的网络包:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');

module.exports = {
    entry: {
        app: './src/index.js'
    },
    context: path.resolve(__dirname),

    output: {
        path: path.resolve(__dirname, 'public'),
        filename: 'bundle.js',
    },

    plugins: [
        new CleanWebpackPlugin(['app']),
        new HtmlWebpackPlugin({
            title: 'Minimum-Viable',
            filename: 'index.html',
            template: './public/index.html',
        }),
    ],

    module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: [
                            'es2015',
                            'react',
                        ],
                        plugins: ['transform-class-properties'],
                    },
                },
            },
            {
                test: /\.scss$/,
                include: [
                    path.resolve(__dirname, 'styles')
                ],
                use: [
                    {loader:'style-loader'},
                    {loader:'css-loader'},
                    {loader:'sass-loader'}
                ]
            },
        ],
    },
    resolve: {
        extensions: ['.js','.scss']
    }
};

抛出的错误是:

   ./src/styles/main.scss中的错误模块解析失败:意外的字符' @' (1:0)

     

您可能需要适当的加载程序来处理此文件类型。 | @import' reset.scss';

感激地收到任何指示。

5 个答案:

答案 0 :(得分:4)

我设法重现错误,似乎来自:

include: [
    path.resolve(__dirname, 'styles')
],

路径是问题,因为加载程序会在/styles中搜索./styles,但会查看您的入口点:

entry: {
    app: './src/index.js'
},

实际应该是./src/styles所以:

include: [
    path.resolve(__dirname, 'src', 'styles')
],

答案 1 :(得分:1)

使用:

include: [
    path.resolve(__dirname, 'styles')
],

您指示webpack仅对驻留在styles文件夹中的文件使用您的加载链。

reset.scss看起来像通常存储在node_module中的节点依赖项,SASS选项将其排除在include处理之外。

尝试删除您的SASS include选项或对其进行扩展,以便包含node_folder或您的样式导入的特定模块。

答案 2 :(得分:1)

您是否尝试过提取文字网络包插件

https://github.com/webpack-contrib/extract-text-webpack-plugin

基本上它会收集你所有的样式文件(在你的代码中导入)并将其打包到捆绑的css中,然后你可以将它们链接到你的html。

答案 3 :(得分:0)

我基本上和你有相同的配置,除了两件事:

{
  test: /\.scss$/,
  exclude: /node_modules/,
  use: ["style-loader", "css-loader", "sass-loader"]
}

如果您的webpack与项目根目录位于不同的文件夹中,__dirname可能无法解决您的问题。您可能需要一起删除该语句或将其更改为process.cwd()。我可以给你另一个提示,可能是你错过了node-sass包。其次,您可能没有使用正确的语法用于webpack版本2或3,如use键所示。

答案 4 :(得分:0)

你有这样的尝试吗?

index.js:

import './styles/main.scss';
import './styles/reset.scss';
import './styles/global.scss';
import './styles/fonts.scss';
import './styles/system.scss';