Webpack source-map 不解析 sass 导入

Webpack source-map does not resolve sass imports

我将 webpack 配置为转译 scss -> css,但 webpack 生成的源映射无法解析 scss @imports.

webpack.config.js:

const path = require('path');
const ExtractTextPlugin = require('extract-text-webpack-plugin');

const outputPath = path.join(__dirname, 'dist');

module.exports = {
    devtool: 'source-map',
    entry: ['./src/main.scss'],
    target: 'web',
    output: {
        filename: 'js/[name].bundle.js',
        path: outputPath
    },
    module: {
        rules: [
            { // sass / scss loader for webpack
                test: /\.(sass|scss)$/,
                loader: ExtractTextPlugin.extract([
                    {
                        loader: 'css-loader',
                        options: {
                            url: false,
                            import: true,
                            minimize: true,
                            sourceMap: true,
                        }
                    },
                    'sass-loader'
                ])
            },
        ]
    },
    plugins: [
        new ExtractTextPlugin({ // define where to save the file
            filename: 'css/[name].bundle.css',
            allChunks: true,
        })
    ]
};

main.scss:

@import 'foo';

_foo.scss:

h1 { color: red; }

但是,在 Chrome 开发工具中,我看到了对 main.scss 的引用,我希望引用 _foo.scss - 请参见下面的屏幕截图:

编译演示:http://store.amniverse.net/webpacktest/

那里有 sass-loader,切换为:

{
   loader: 'sass-loader',
   options: {
     sourceMap: true
   }
}

这样就可以了。

当您处于开发模式时,您不应使用 extractTextPlugin。 请为开发和生产模式进行额外配置。在生产中使用 extractTextPlugin 很好,但在开发模式下则没有必要,并且可能导致其他功能无法正常工作。所以改用样式加载器。

此外 - 我不确定这是否能解决您的问题 - 尝试在 css 加载程序上使用 importLoaders 道具。在这里查看更多信息:

https://github.com/webpack-contrib/css-loader#importloaders

const path = require('path');

const outputPath = path.join(__dirname, 'dist');

module.exports = {
    devtool: 'source-map',
    entry: ['./src/main.scss'],
    target: 'web',
    output: {
        filename: 'js/[name].bundle.js',
        path: outputPath
    },
    module: {
        rules: [
            { // sass / scss loader for webpack
                test: /\.(sass|scss)$/,
                loader: [
                    {
                        loader: 'style-loader',
                        options: {
                          sourceMap: true
                        }
                    },
                    {
                        loader: 'css-loader',
                        options: {
                            url: false,
                            import: true,
                            minimize: true,
                            sourceMap: true,
                            importLoaders: 1,
                        }
                    },
                    {
                       loader: 'sass-loader',
                       options: {
                         sourceMap: true
                       }
                    }
                ]
            },
        ]
    }
};

ExtractTextPlugin 在开发模式下没有任何问题,@Omri Aharon 发布的内容是正确的。但是,您应该考虑 的是仅在开发模式下启用源映射。

要使用其默认生产设置构建 webpack(在 webpack 2.0+ 中默认使用 OccurrenceOrderPlugin 插件),运行 命令 webpack -p,然后在您的 webpack.config.js ,您可以通过以下方式确定您是否处于开发模式:

const DEBUG = !process.argv.includes('-p');

添加功能

function cssConfig(modules) {
    return {
        sourceMap: DEBUG,
        modules,
        localIdentName: DEBUG ? '[name]_[local]_[hash:base64:3]' : '[hash:base64:4]',
        minimize: !DEBUG
    };
}

在您的 webpack.config.js 中,使您的 scss 加载程序显示为:

            test: /\.(sass|scss)$/,
            loader: ExtractTextPlugin.extract({
                fallback: 'style-loader',
                use: [
                    {
                        loader: 'css-loader',
                        options: cssConfig(true)
                    },
                    {
                        loader: 'sass-loader',
                        options: { sourceMap: DEBUG }
                    }
                ]
            })
        },

我的插件部分有

new ExtractTextPlugin('[name].css?[contenthash]'),