Chrome 中的断点不适用于 Sourcemap

Posted

技术标签:

【中文标题】Chrome 中的断点不适用于 Sourcemap【英文标题】:Breakpoints in Chrome not working with Sourcemap 【发布时间】:2016-10-27 05:28:35 【问题描述】:

这是最烦人的问题。我遇到了this before here,但是我的 webpack 配置和 gulp 中的设置相同,我无法在 Chrome Devtools 中正确设置断点。

我已经删除了我的应用程序文件和地图,重新运行 gulp webpack,它会再次自动生成它,但它仍然不会在应用程序中我想要的位置中断:(

Webpack 配置

var webpack = require('webpack');
var PROD = JSON.parse(process.env.PROD_DEV || '0');
// https://***.com/questions/25956937/how-to-build-minified-and-uncompressed-bundle-with-webpack

module.exports = 
    entry: "./entry.js",
    devtool: "source-map",
    output: 
        devtoolLineToLine: true,
        sourceMapFilename: "tickertags.bundle.js.map",
        pathinfo: true,
        path: __dirname,
        filename: PROD ? "tickertags.bundle.min.js" : "tickertags.bundle.js"
    ,
    module: 
        loaders: [
             test: /\.css$/, loader: "style!css" 
        ]
    ,
    plugins: PROD ? [
        new webpack.optimize.UglifyJsPlugin( minimize: true )
    ] : []
;

Gulp 任务

gulp.task('webpack',['build:html-templates'],function() 
    return gulp.src('entry.js')
    .pipe(webpack( require('./webpack.config.js') ))
    .pipe(gulp.dest('app/assets/js'));
);

// Development watch /////////////////////////////////////////////////////////// ????☕️⏎→
gulp.task('watch', function() 
    gulp.watch('app/**/**/*.html', ['build:html-templates']).on('change', function(file) 
        var filePath = file.path.split(rootPath);
        process.stdout.write(gutil.colors.red(' →→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→   ' +filePath[1]+ '\n'));
    );

    gulp.watch('app/assets/imgs/*.svg').on('change', function(file) 
        var filePath = file.path.split(rootPath);
        process.stdout.write(gutil.colors.red(' →→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→   ' +filePath[1]+ '\n'));
    );

    gulp.watch('sass-smacss/sass/**/*.scss', ['app-css']).on('change', function(file) 
        var filePath = file.path.split(rootPath);
        process.stdout.write(gutil.colors.red(' →→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→   ' +filePath[1]+ '\n'));
    );

    gulp.watch(paths.scripts, ['webpack']).on('change', function(file) 
        var filePath = file.path.split(rootPath);
        process.stdout.write(gutil.colors.red(' →→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→   ' +filePath[1]+ '\n'));
    );
);

gulp.task('default', ['watch', 'webpack']);

【问题讨论】:

【参考方案1】:

据我所知,唯一的解决方案是不使用带有缩小代码的源映射。要么在不缩小的情况下编译你的代码,要么使用 chrome 开发工具的内置漂亮打印功能。问题是缩小通常将多行压缩成逗号表达式。开发工具不会将逗号表达式解释为单独的语句,这就是为什么您只能在代码块的开头放置断点的原因。 Sourcemaps 只是将缩小代码的文本表示转换回,但引擎会在缩小代码中按行执行它们。

编辑

看看禁用源地图是否有帮助,这是您在 Chrome 中找到设置的地方:

打开开发者控制台,按F1,找到下面的复选框

【讨论】:

是的,我的代码没有被缩小,它只有在我为生产 Gulp 任务运行构建时才会被缩小。这是我当前源图的结尾://# sourceMappingURL=tickertags.bundle.js.map webpack 也有可能生成错误的 sourcemap。我自己从未尝试过。 奇怪,我的设置和你的不一样 :( 我也有最新的 Chrome 您在正确的设置菜单中吗?开发工具打开时按 f1 好吧,我已经启用了...我的源地图过去可以工作,叹息...将不得不继续挖掘。【参考方案2】:

Sourcemaps 在当前版本的 Chrome 上被破坏:https://bugs.chromium.org/p/chromium/issues/detail?id=611328#c21

一旦源映射被修复(修复目前在 canary 中),那么我确信带有源映射的断点也将被修复。

编辑:最后一个链接是一个过时的错误,上面链接的是最新的。

【讨论】:

甜蜜!很高兴知道 :D 想知道为什么它们坏了,特别是因为我们有一段时间没有更新 webpack 或 gulp 并且它们还是坏了。 编辑,抱歉在我的情况下它与 Chrome 完全无关。现在发布答案。 有什么方法可以禁用源地图?【参考方案3】:

找到有问题的代码段

var alertVolumeUrl = function(ticker, term_id) 
    var url = api.alertsVolume;
    return _.isEmpty(term_id) ? url + ticker : url;
;

function alertsVolume(ticker, params)  

    var url = alertVolumeUrl(ticker, params.term_id);
    return $http.get(url, params: params).then(function(res)
        return res.data.alerts;
);

我不得不像这样重写第二个函数:

var alertVolumeUrl = function(ticker, term_id) 
    var url = '/app/api/alerts/volume/';
    return _.isEmpty(term_id) ? url + ticker : url;
;

var alertsVolume = function(ticker, params) 
    return $http.get(alertVolumeUrl(ticker, params.term_id),  params: params ).then(function(res)
        return res.data.alerts;
    );
;

注意alertVolumeUrl 现在是如何在第二个函数中使用的。

由于某种原因导致我们的断点失败。

【讨论】:

以上是关于Chrome 中的断点不适用于 Sourcemap的主要内容,如果未能解决你的问题,请参考以下文章

swfobject 不适用于 Chrome 中的 https

溢出:隐藏不适用于 Chrome 中的伪元素

CSS 过渡不适用于 chrome 45 中的 scale(0) + 硬件加速?

LayaAir2.x断点调试

内容安全策略“数据”不适用于 Chrome 28 中的 base64 图像

错误处理不适用于 Chrome 中的 HTML5 地理位置