【问题标题】:How to debug CSS bundled by Webpack?如何调试 Webpack 捆绑的 CSS?
【发布时间】:2017-04-02 04:30:59
【问题描述】:

我已不再以老式方式包含样式表:

<link rel="stylesheet" href="./../css/main.css">

到 Webpack 方法:

var css = require('./../css/main.css');

它可以工作,但我不喜欢它从这个文件中提取 css 到内联标记中,因为这样在开发工具中调试它就更难了。例如,我不知道这些属性来自哪个文件和行:

如何将其移动到单独的文件或生成将我指向源文件的源映射?所以当我检查它的开发工具时,它看起来像这样:

我的webpack.config.js

var autoprefixer = require('autoprefixer');

module.exports = {
    devtool: "css-loader?sourceMap",
    module:  {
        loaders: [
            {test: /\.(png|woff|woff2|eot|ttf|svg)$/, loader: 'url-loader?limit=100000'},
            {
                test:   /\.css$/,
                loader: "style-loader!css-loader!postcss-loader"
            }
        ]
    },
    entry:   [
        './static/js/app.js'
    ],
    output:  {
        filename: './static/js/bundle.js'
    },
    watch:   false,
    postcss: function () {
        return [autoprefixer];
    }
};

我的app.js

var $ = require('jquery');
window.jQuery = $;
window.$ = $;
require('bootstrap-loader');

module.exports = (function () {
    alert('IT WORKS!');
});

window.app = module.exports;
var css = require('./../css/main.css');

【问题讨论】:

    标签: css webpack postcss webpack-style-loader css-loader


    【解决方案1】:

    要将您的样式从包中提取到外部样式表,您需要使用extract text plugin

    一般的 webpack 配置如下所示:

    var ExtractTextPlugin = require('extract-text-webpack-plugin');
    
    module.exports = {
        devtool: "source-map",
        entry: 'path/to/entry.js',
        output:  {
            path: 'path/to/bundle'
            filename: 'bundle.js'
        },
        module:  {
            loaders: [
                {
                    test:   /\.css$/,
                    loader: ExtracTextPlugin.extract('css-loader?sourceMap')
                }
            ]
        },
        plugins: [
             new ExtractTextPlugin('styles.css')
        ]
    };
    

    您应该注意的部分是使用devtool: "source-map" 进行调试部分以及使用插件提供加载程序作为提取插件方法的参数:

    loaders: [
        {
            test:   /\.css$/,
            loader: ExtracTextPlugin.extract('css-loader?sourceMap')
        }
    ]
    

    如果您也需要 sass-loader,也可以在这里链接加载程序:

    loaders: [
        {
            test:   /\.scss$/,
            loader: ExtracTextPlugin.extract('css-loader?sourceMap!sass-loader?sourceMap')
        }
    ]
    

    您不再需要样式加载器,但您也可以将其作为后备加载器提供给插件:

    loaders: [
        { 
            test: /\.css$/,
            loader: ExtractTextPlugin.extract({
                fallbackLoader: "style-loader",
                loader: "css-loader?sourceMap"
            })
        }
    ]
    

    然后在你的 plugins 数组中实例化插件并为外部样式表提供你想要的名称:

    plugins: [
         new ExtractTextPlugin('styles.css')
    ]
    

    如果您有多个入口点并且每个入口都有一个样式表,您也可以使用[name] 占位符。

    【讨论】:

    • 谢谢,文件已生成,但现在我还得通过&lt;link&gt; 标签将这个styles.css 包含到模板中?
    • 这个映射没有意义——它指向的是 scss 文件,而是由 ExtractTextPlugin 生成的文件,而不是真正的源文件。因此,如果我将 2 个 scss 捆绑在一起,则映射将指向捆绑包,而不是这 2 个文件中的 1 个。
    • 我的错,我是提取到 scss,而不是 css。但还是I cannot get those mappings right
    • @van_folmert:正如您已经注意到的,您也必须在加载器本身上使用 sourceMap 查询。关于第一个问题,您可以使用html webpack plugin 基于模板生成一个 html 文件,并在每次构建时自动将您的包插入其中。
    • 插件:[ new HtmlWebpackPlugin({ template: 'src/index.html' }), new ExtractTextPlugin('styles.css') ]
    猜你喜欢
    • 2020-06-29
    • 2020-01-10
    • 2017-09-19
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 2017-10-26
    • 1970-01-01
    相关资源
    最近更新 更多