繁体   English   中英

如何在编译/缩小过程中摆脱JavaScript中不必要的调试代码?

[英]How to get rid of unnecessary debugging code in JavaScript during the compilation/minification process?

我曾经在JavaScript应用程序中编写过很多调试代码,而我正在寻找一种技术,该技术可以在编译/缩小过程中消除调试代码。

JavaScript World中是否有与C / C ++等效的编译指令?

在C / C ++中,它看起来像这样:

#ifdef _DEBUG
counter++;
#endif

PS。 目前,我用口水

我认为您可以使用任务运行器(例如gruntgulp执行您要尝试的操作。 这两个工具都是一个任务运行程序,可以使用插件转换您的代码以执行这种操作。

这种所谓的“插件”就是gulp-preprocess 这个插件可以满足您的要求:)

要进一步了解gulp,可以访问gulp网站或在网络上找到一些不错的教程...

条调试

从JavaScript代码中删除控制台,警报和调试器语句

对于确保您没有在生产代码中保留任何日志非常有用。

也可以作为gulp / grunt / broccoli插件使用。

用法

$ npm install --save strip-debug

var stripDebug = require('strip-debug');

stripDebug('function foo(){console.log("foo");alert("foo");debugger;}').toString();
//=> function foo(){void 0;void 0;}   

gulp的用法

var gulp = require('gulp');
var stripDebug = require('gulp-strip-debug');

gulp.task('default', function () {
    return gulp.src('src/app.js')
        .pipe(stripDebug())
        .pipe(gulp.dest('dist'));
});  

有关更多详细信息,请检查this: link ,并将其与gulp: link一起使用

可能是学术性的,但这是一个纯JavaScript的答案。 您可以使用类似的方法从代码中完全剥离某些功能,并且根据您的编译器,它们将编译为空。

/** @const */
var NDEBUG = false; // change to true for production
var assert = (() => NDEBUG ? () => {}: test => console.assert(test(), test.toString()))();

如果NDEBUG == true则assert成为一个空函数: () => {} ,否则,如果NDEBUG == false ,它将一个函数作为参数,调用该函数并测试结果。

用法:

var divideByResult = function (a, b) {
    assert (() => b() !== 0);
    return a() / b();
}

这就像一个C风格的断言。 仅当NDEBUG == false才会调用assert中的函数。 我们传递一个函数来断言而不是表达式。 如果我们传递一个表达式,则表达式b() !== 0可能会有副作用,并且将被求值。 这样,我们保证断言中的表达式永远不会在生产代码中求值,并且优化的编译器可以安全地将断言删除为无效代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM