Live data from Hacker News

JSDev: Executable comments (by Douglas Crockford)

github.com

11–18 of 18 posts

Re: JSDev: Executable comments (by Douglas Crockford)

#12
post #11

No wonder Crockford is so smart. HE LIVES IN THE FUTURE! /* jsdev.c Douglas Crockford 2012-01-05 Committed 2012-01-04T15:19:34-08:00

He didn't specify a time zone in his comment but the commit sure as hell has a time zone. The date in the comment could be UTC.

Re: JSDev: Executable comments (by Douglas Crockford)

#14

we've been doing this for about a year now, though we just use stuff like: // debug: something %s, here compiling to: console.debug('something %s, here) etc, along with some for profiling etc

though I should note I now mostly use https://github.com/visionmedia/debug because when a noop function invokes millions of times a second who cares :D

Re: JSDev: Executable comments (by Douglas Crockford)

#16
Edit: It seems backticks (``) don't indicate code, so the following is shown as `/test/`:

    `/*test*/`
(End edit.)

I personally prefer something like

    // In some entry point, sticking DEBUG on the global object or outermost scope
    var DEBUG = true; // Somehow don't minify this

    if (DEBUG) {
        // arbitrary JavaScript
    }
with `sed s/DEBUG/false/g` (simplified) or inserting `var DEBUG = false;` somewhere* to strip debug blocks from the source when compiling minified/release versions. Dead code elimination throws away debug blocks, and this method doesn't require you to pass your code through a tool every time you develop (so line numbers, etc. always match).

Yes, it's not robust, and I realize this solution is. But modifying something like Uglify or Google Closure Compiler to replace DEBUG's value wouldn't be a bad idea, I think, if you really care about strings and such not being replaced.

Something similar can be accomplished (though it's a bit more limiting) if you replace special comment tokens. For example:

    /*DEBUG*/ {
        // Debug code here
    }
I would see the use if this tool did more than replacement magic. For example, I could specify `/profile/` somewhere inside a function and it would automatically be instrumented for profiling. Or, `/count/` could increment some global variable (unique to each `/count/` instance) easily accessible and useable from a JavaScript console (perhaps based upon the containing function's name or line number?), or `/count-print/` could do the same but printing every second or every 100 calls. But even for these cases, I see myself manually instrumenting these instead of configuring a tool and sticking it in my development workflow.

*Sometimes, `var` statements (even with a constant) are not inlined by Google Closure Compiler (only minifier I am aware of which performs inlining).

Re: JSDev: Executable comments (by Douglas Crockford)

#17
post #16

Edit: It seems backticks (``) don't indicate code, so the following is shown as `/ test /`: `/*test*/` (End edit.) I personally prefer something like // In some entry point, sticking DEBUG on the global object or outermost scope var DEBUG = true; // Somehow don't minify this if (DEBUG) { // arbitrary JavaScript } with `sed s/DEBUG/false/g` (simplified) or inserting `var DEBUG = false;` somewhere* to strip debug block…

schmerg and I added support for this in UglifyJS about a year ago. Use the define parameter to define values for constants, e.g.

    uglify --define DEBUG=true
It will then replace all uses of the DEBUG symbol to true. And when you set it to false, it will even strip away dead code like:

    if (DEBUG) ...
We even added support for define-from-module which allows you to specify and use the exported symbols from a nodejs module instead of defining them on the command line. I tend to have dev.js and prod.js setup for this purpose.

Hope these features address your requirements. Apologies if we didn't make the feature visible enough. It's documented on the UglifyJS frontpage...

Re: JSDev: Executable comments (by Douglas Crockford)

#18
I'm concerned that this will facilitate testing of private implementation details; I do believe that the public API is the only thing that should ever be tested. If you need to test the implementation details of your unit, then that should be pulled out into another unit which is in some way included in this main unit, and tested in that context.
Post reply on HN