[英]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.