簡體   English   中英

CoffeeScript / UglifyJS中的條件編譯

[英]Conditional compilation in CoffeeScript/UglifyJS

使用Coffeescript我需要經歷一個構建腳本來更新我的.js文件,我有兩個,一個用於調試,一個用於生產(一個使用Uglify來最小化文件,一個不使用)。 因此我認為使用一些條件編譯也很方便,代碼只能進入調試版本。

實現這一目標的最簡單方法是什么?理想情況下,我可以通過簡單的命令行開關來控制咖啡或uglify?

如果您正在編寫構建腳本,則可以向其添加預處理器步驟。 由於CoffeeScript使用#來表示注釋,因此C預處理器似乎是一個不錯的選擇。 您可以使用#ifdef s表示調試代碼:

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

然后,您可以使用cpp -E -Xpreprocessor -DDEBUG <filename> -o <outfile>預處理調試版本,並使用CoffeeScript編譯<outfile> 同樣,使用cpp -E <filename> -o <outfile>預處理生產版本。

編輯:這個很難,因為這意味着任何沒有縮進的CoffeeScript注釋都會破壞預處理步驟。 不確定這對你有多大問題。 例如,

code...
#comment about the code

會破壞構建,但是

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

將正常工作,因為除非第一個字符是#否則預處理器不會查看行。

聽起來像你說你有兩個構建腳本? 對於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()

C預處理器的替代方案是M4宏處理器( Wikipedia intro )。 我自己沒有使用它,所以我無法復習它,我知道它應該有點痛苦,但它會解決你的問題。 它也像C預處理器一樣,可以運行在每個操作系統上。

我使用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
#...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM