0

I'm in the process of trying to upgrade from webpack 1 to 2 and am getting the following error for pretty much all my sass files. Can someone tell me what I'm missing here? For what it's worth this is the original webpack file I'm trying to upgrade https://github.com/davezuko/react-redux-starter-kit/blob/master/config/webpack.config.js

CoreLayout.scss Unexpected character '@' (1:0) You may need an appropriate loader to handle this file type.

CoreLayout.scss

    @import 'variables';
    .core-layout__viewport{
        position: relative;
        top:50px;

        &.noHeader{
            padding-top:0;
        }

    }

    .hasTopBanner{
        .core-layout__viewport{
            top: $topBannerHeight + $headerHeight;
        }
    }
    .isWebView{
        .core-layout__viewport{
            top:0px;
        }   

        &.hasTopBanner{
            .core-layout__viewport{
                top: $topBannerHeight;
            }   
        }
    }

webpack.config.js

        debug('Creating configuration.')
        const webpackConfig = {
            name    : 'client',
            target  : 'web',
            devtool : project.compiler_devtool,
            resolve : {

            extensions : ['', '.js', '.jsx', '.json', '.scss', 'scss']
            },
            module : {
            rules:[]
            }
        }

        webpackConfig.resolve = {
            modules: ['node_modules', 'src', project.paths.client(), path.resolve('config'), path.resolve('src/styles') ]
        }

        console.log('resolve', path.resolve('src/styles'));

        // ------------------------------------
        // Entry Points
        // ------------------------------------
        const APP_ENTRY = project.paths.client('main.js')

        webpackConfig.entry = {
            app : __DEV__
            ? [APP_ENTRY].concat(`webpack-hot-middleware/client?path=${project.compiler_public_path}__webpack_hmr`)
            : [APP_ENTRY],
            vendor : project.compiler_vendors
        }


        // ------------------------------------
        // Bundle Output
        // ------------------------------------
        webpackConfig.output = {
            filename   : `[name].[${project.compiler_hash_type}].js`,
            path       : project.paths.dist(),
            publicPath : project.compiler_public_path
        }

        // ------------------------------------
        // Externals
        // ------------------------------------
        webpackConfig.externals = {}
        webpackConfig.externals['react/lib/ExecutionEnvironment'] = true
        webpackConfig.externals['react/lib/ReactContext'] = true
        webpackConfig.externals['react/addons'] = true

        // ------------------------------------
        // Plugins
        // ------------------------------------
        webpackConfig.plugins = [
            new webpack.DefinePlugin(project.globals),
            new HtmlWebpackPlugin({
            template : project.paths.client('index.html'),
            hash     : false,
            filename : 'index.html',
            inject   : 'body',
            minify   : {
                collapseWhitespace : true
            }
            })
        ]

        // Ensure that the compiler exits on errors during testing so that
        // they do not get skipped and misreported.
        if (__TEST__ && !argv.watch) {
            webpackConfig.plugins.push(function () {
            this.plugin('done', function (stats) {
                if (stats.compilation.errors.length) {
                // Pretend no assets were generated. This prevents the tests
                // from running making it clear that there were warnings.
                throw new Error(
                    stats.compilation.errors.map(err => err.message || err)
                )
                }
            })
            })
        }

        if (__DEV__ ) {
            debug('Enabling plugins for live development (HMR, NoErrors).')
            webpackConfig.plugins.push(
            new webpack.HotModuleReplacementPlugin(),
            new webpack.NoErrorsPlugin()
            )
        } else if (__PROD__ || __STAGE__ || __REF2__ || __TRAIN__ ) {
            debug('Enabling plugins for production (OccurenceOrder, Dedupe & UglifyJS).')
            webpackConfig.plugins.push(
            new webpack.optimize.OccurrenceOrderPlugin(),
            new webpack.optimize.DedupePlugin(),
            new webpack.optimize.UglifyJsPlugin({
                compress : {
                unused    : true,
                dead_code : true,
                warnings  : false
                }
            }),
            new webpack.optimize.AggressiveMergingPlugin()
            )
        }

        // Don't split bundles during testing, since we only want import one bundle
        if (!__TEST__) {
            webpackConfig.plugins.push(
            new webpack.optimize.CommonsChunkPlugin({
                names : ['vendor']
            })
            )
        }

        // ------------------------------------
        // Loaders
        // ------------------------------------
        // JavaScript / JSON

        webpackConfig.module.rules = [{
            test    : /\.(js|jsx)$/,
            exclude : /node_modules/,
            use:{
            loader  : 'babel-loader',
            options   : {
                presets: ["es2015", "react", "stage-0"]
            }
            }
        }, {
            test   : /\.json$/,
            loader : 'json'
        }]

        // ------------------------------------
        // Style Loaders
        // ------------------------------------
        // We use cssnano with the postcss loader, so we tell
        // css-loader not to duplicate minimization.
        const BASE_CSS_LOADER = 'css-loader'//?sourceMap&-minimize'


        webpackConfig.module.rules.push({
        test: /\.scss$/,
        include: project.paths.client('styles'),
        use:[
            {
            loader: 'style-loader',
            options:{
                includePaths : project.paths.client('styles')
            }
            },
            BASE_CSS_LOADER,
            {
            loader: 'postcss-loader',
            options: cssnano({
                    autoprefixer : {
                    add      : true,
                    remove   : true,
                    browsers : ['last 2 versions']
                    },
                    discardComments : {
                    removeAll : true
                    },
                    discardUnused : false,
                    mergeIdents   : false,
                    reduceIdents  : false,
                    safe          : true,
                    sourcemap     : true
                })
            },
            {
            loader:'sass-loader',
            options:{
                sourceMap:true
            }
            }
        ]
        })

        webpackConfig.module.rules.push({
            test    : /\.css$/,
            use:[
            'style-loader',
            BASE_CSS_LOADER,
            'postcss-loader'
            ]

        })



        // File loaders
        /* eslint-disable */
        webpackConfig.module.rules.push(
            { test: /\.woff(\?.*)?$/,  loader: 'url-loader?prefix=fonts/&name=[path][name].[ext]&limit=10000&mimetype=application/font-woff' },
            { test: /\.woff2(\?.*)?$/, loader: 'url-loader?prefix=fonts/&name=[path][name].[ext]&limit=10000&mimetype=application/font-woff2' },
            { test: /\.otf(\?.*)?$/,   loader: 'file-loader?prefix=fonts/&name=[path][name].[ext]&limit=10000&mimetype=font/opentype' },
            { test: /\.ttf(\?.*)?$/,   loader: 'url-loader?prefix=fonts/&name=[path][name].[ext]&limit=10000&mimetype=application/octet-stream' },
            { test: /\.eot(\?.*)?$/,   loader: 'file-loader?prefix=fonts/&name=[path][name].[ext]' },
            { test: /\.svg(\?.*)?$/,   loader: 'url-loader?prefix=fonts/&name=[path][name].[ext]&limit=10000&mimetype=image/svg+xml' },
            { test: /\.(png|jpg)$/,    loader: 'url-loader?limit=8192' }
        )
        /* eslint-enable */



        module.exports = webpackConfig

UPDATE: I'm also getting the following error for regular CSS files as well "Unexpected token (1:0) You may need an appropriate loader to handle this file type."

.duck {
  display: block;
  width: 120px;
  margin: 1.5rem auto;
}
Dan Ramos
  • 1,092
  • 2
  • 19
  • 35

0 Answers0