11

使用 Coffeescript 无论如何我都需要通过构建脚本来更新我的 .js 文件,我有两个,一个用于调试,一个用于生产(一个使用 Uglify 来最小化文件,一个不使用)。所以我在想,也可以方便地进行一些条件编译,代码只进入调试版本。

实现这一目标的最简单方法是什么,理想情况下由一个简单的命令行开关控制,我可以给咖啡或丑陋的东西?

4

4 回答 4

7

如果您正在编写构建脚本,您可以向其中添加预处理器步骤。由于 CoffeeScript 用于#表示注释,因此 C 预处理器似乎是一个不错的选择。您可以用 s 表示调试代码#ifdef

some code...
#ifdef DEBUG
debug code...
#endif

然后,您可以使用 CoffeeScript预处理调试版本cpp -E -Xpreprocessor -DDEBUG <filename> -o <outfile>并进行编译。<outfile>同样,使用cpp -E <filename> -o <outfile>.

编辑:这很难,因为这意味着任何未缩进的 CoffeeScript 注释都会破坏预处理步骤。不知道这对你有多大的问题。例如,

code...
#comment about the code

会破坏构建,但是

code...
  indented code...
  #indented comment

可以正常工作,因为预处理器不会查看行,除非它们的第一个字符是#.

于 2012-03-14T14:31:02.043 回答
2

这听起来像你说你有两个构建脚本?对于string.js,我只是使用 Cakefile 来实现你我认为你想要的。本质上,如果源文件发生变化,它会生成一个常规的 JS 文件,然后是一个 uglified 文件。

这是Cakefile的相关部分:

 task 'watch', 'Watch src/ for changes', ->
    browserTestFile = path.join(process.cwd(), 'test_browser', 'string.test.js')

    coffee = spawn 'coffee', ['-w', '-c', '-o', 'lib', 'src']
    coffee.stderr.on 'data', (data) -> 'ERR: ' + process.stderr.write data.toString()
    coffee.stdout.on 'data', (data) ->
      d = data.toString()
      if d.indexOf('compiled') > 0
        #invoke 'test'

        fsw = fs.createWriteStream(browserTestFile, flags: 'w', encoding: 'utf8', mode: 0666)
        coffee_test = spawn 'coffee', ['-c', '-p', 'test/string.test.coffee']
        coffee_test.stdout.pipe(fsw, end: false)

        uglify = spawn 'uglifyjs', ['lib/string.js']
        uglify.stdout.pipe(fs.createWriteStream('lib/string.min.js'))

      else
        growl(d, title: 'Error', image: './resources/error.png')

      process.stdout.write data.toString()
于 2012-03-14T02:58:52.650 回答
1

C 预处理器的替代方案是M4 宏处理器(维基百科介绍)。我自己没有使用过它,所以我无法查看它,我知道它应该有点痛苦,但它会解决你的问题。此外,它与 C 预处理器一样,可以在任何可以想象的操作系统上运行。

于 2012-03-15T08:29:47.657 回答
0

我对这种事情使用https://github.com/jsoverson/grunt-preprocess 。它完全符合我正在尝试做的事情:

detect_ennemy_collision: (ennemies) ->

# @ifdef DEBUG 
    expect(ennemies).to.be.an 'array'
    expect(ennemies.length).to.be.ok

    for ennemy in ennemies
        (expect ennemy).to.be.an.instanceof Character

# @endif
#...
于 2016-07-02T18:45:29.473 回答