
ã¯ããã«
ããã«ã¡ã¯ãCrowdWorks ã®ã¸ã£ã³ããã¼ã ã®ã¨ã³ã¸ã㢠bugfire ã§ãã
CrowdWorks ã¯æ´å²ã®ãããµã¼ãã¹ã§ CoffeeScript ãå©ç¨ããã¦ããç®æã大éã«ããã¾ãã å ·ä½çã«ã¯411ãã¡ã¤ã«ããã¾ããã1
ãã¾ã¨ãªã£ã¦ã¯ CoffeeScript ãå©ç¨ããã³ã¼ããæ°ãã«æ¸ããã¨ãå°ãªããªããæ¹åããã¨ãã« TypeScript ã§æ¸ãç´ããããã¨ãå¤ããªã£ã¦ãã¾ãããããããåå¥ã«å¤æããã¨æéãæãã£ã¦ãã¾ããããã¾ã¨ãã¦æ©æ¢°çã«å¤æãããã¨ã«ãã¾ããï¼
3è¡ã¾ã¨ã
- CoffeeScript ãã TypeScript ã®æ¹ã«è¨è¿°ãç§»ãã¦ããããã
- å©ç¨ãã¦ãã Sprockets ã® CoffeeScript 夿ã³ã¼ããåç¨ãã¦å ¨ãã¡ã¤ã«ã夿ãã¾ããã
- 確èªã¯å¤æåå¾ã®åºå JavaScript ã³ã¼ãã®å®å ¨ä¸è´ã§è¡ãã¾ããã
æé
Minify è¨å®
Production ã§ã¯ Minify ãã¦ãã¾ããæå ã®éçºç°å¢ã§å®é¨ããã¨ãã Minify ãè¡ãæ¹ãåç¾åº¦ãé«ãã§ãããããã夿使¥ä¸ã«å·®åãçºçããåå ã追æ±ããã¨ã㯠Minify ããªãæ¹ãå·®åãè¦ãããã¦è¯ãã§ãã
è¨å®ã¯ config.assets.js_compressor ã§è¡ãã¾ãã
ä»åã¯ã夿å½å㯠Minify ãªãã§è¡ããå¤æã«æ £ãã¦ããæ®µéã§ Minify ããã«å¤æ´ãã¾ããã
差忤åºã®ããã®ã¹ãããã·ã§ããã¹ã¯ãªãã
Sprockets ã®ã¢ã»ããã®ãã«ãã§ public/assets 以ä¸ã«åºåããããã«ãã¦ãã¾ãã
ãã®ãããªã¹ã¯ãªãããç¨ãåºåããã JavaScript ã®ã¿ã®ã¹ãããã·ã§ãããåãããã«ãã¾ããã
#!/bin/bash DATE=`date "+%Y-%m-%d-%H-%M-%S"` OUTPUT=DECAFE/$DATE # public/assets å ã«ãã js ã®ãªã¹ããä½ã FILES=`find public/assets -name "*.js"` echo "creating... $OUTPUT" mkdir -p $OUTPUT # ãã¡ã¤ã«ä¸è¦§ãæ¸ãè¾¼ã echo "$FILES" > $OUTPUT/list.txt tar cf - $FILES | ( cd $OUTPUT; tar xvf - ) # å·®åãè¦ãããããã«fileåã®64æåã®hashãåãé¤ã for i in `find $OUTPUT -type f`; do NEW_FILENAME=`echo $i | sed -e 's/-[0-9A-z]\{64\}\.js/.js/g'` if [ "$i" != "$NEW_FILENAME" ]; then mv $i $NEW_FILENAME fi done
diff ã§å·®åãåããããããã«ãã¡ã¤ã«åãã hash ãåãé¤ã㦠JavaScript ãã¡ã¤ã«ãå
¨ã¦ã³ãã¼ãã¦ãã¾ãã
æ¯è¼å¯¾è±¡ã¨ãªã使¥åã®ãªãªã¸ãã«ã®ã¹ãããã·ã§ããã®ãã£ã¬ã¯ããªåã¯ãã¿ã¤ã ã¹ã¿ã³ãããããããããååã«ãªãã¼ã ãã¦ããã¾ãã
大ããªå¤æããããªã£ãã¨ãã«å·®åãåºãã¨ä¿®æ£ãé£ãããªãã¾ã (require_tree ãªã©è¡ã£ã¦ããé¨åã¯ç¹ã«)ãã¢ã»ããã®ãã«ãã«æéãããã大å¤ã§ããããã¾ãã«ã¢ã»ããã®ãã«ãã¨ãªãªã¸ãã«ã¨ã®å·®åã®ãã§ãã¯ãè¡ãã¾ããã
夿ãã¡ã¤ã«ãåºåããã¢ã³ãã¼ããã
Sprockets ã§å¤æããé¨åãã¢ã³ãã¼ããããã¦ãã¡ã¤ã«ã«åºåãã¾ãã幸ãããã¡ã¤ã«åä½ã§å¤æãã¦ãã徿®µã§ä¸ã¤ã®ãã¡ã¤ã«ã«ã¾ã¨ã㦠Minify ããããªã£ã¦ããã®ã§ããã¡ã¤ã«åä½ã®å¤æé¨åãã¢ã³ãã¼ãããã§ãã¾ãã
å©ç¨ãã¦ãã Sprockets ã®ãã¼ã¸ã§ã³ã«ä¾åãã¦ããã®ã§ã夿ãè¡ããã¦ããã³ã¼ã (https://github.com/rails/sprockets/blob/main/lib/sprockets/coffee_script_processor.rb) ãè¦ãªãã使¥ããã®ãè¯ãã§ãããã
# CoffeeScript ã®ã³ã³ãã¤ã«ææç©ããã¡ã¤ã«ã«åºåãã # å®å ¨ã«å¤æã§ããããªãã®ã¯ __decafe__ ã¨ãã suffix # ä½ããã®ç®è¦ç¢ºèªãå¿ è¦ãªãã®ã¯ __decafe_check_me__ ã¨ãã suffix ãã¤ãã¾ã # ããã¯ãåç´ãªå¤æã§å®å ¨ã«å¤æã§ãããã©ãããåºå¥ãã¦ãã¾ã module SpyCoffeeBuild def call(input) output = super coffee_filename = input[:filename] # .js.coffee 㨠.coffee ãããã®ã§ã䏿¦ .js ãããã°å¤ãã¦ããä»å ãã¾ã js_filename = File.dirname(coffeeFilename) + '/' + File.basename(File.basename(coffee_filename, '.coffee'), '.js') + '.js' input_text = File.read(coffee_filename) # requireæãããã夿å¾ã¯åé¤ãããã®ã§ç®è¦ç¢ºèª has_require = input_text.include?('#= require') || input_text.include?('#=require') # ã³ã¡ã³ãçµç«¯æååãããããã¡ã¤ã«æ«å°¾ã«ã³ã¡ã³ãã§è¿½å ããã®ã§ç°å¸¸ãªã³ã¼ãã«ãªããç®è¦ç¢ºèª has_comment = input_text.include?('*/') # 夿å¾ã®ãã¡ã¤ã«åã¨åããã¡ã¤ã«ããããç®è¦ç¢ºèª has_conflict_file = File.exist?(js_filename) suffix = (has_require || has_comment || has_conflict_file) ? ".__decafe_check_me__" : ".__decafe__" File.write("#{coffee_filename}#{suffix}", output + "\n/*\n#{input_text}*/\n") output end end Sprockets::CoffeeScriptProcessor.singleton_class.prepend(SpyCoffeeBuild)
夿å¾ã¯ã空è¡ãã³ã¡ã³ãã¯åé¤ãããã®ã§ãããã¤ãã®å·¥å¤«ããã¦ãã¾ãã
空è¡ãã³ã¡ã³ãã®åé¤å¯¾çã§ã夿æã¯ JavaScript ãã¡ã¤ã«æ«å°¾ã« /* ... */ ã³ã¡ã³ãã§å
ã® CoffeeScript ã½ã¼ã¹ãæ·»ä»ãã¾ãã
以ä¸ã¯ç®è¦ç¢ºèªãå¿
è¦ãªã±ã¼ã¹ã§ããã¡ã¤ã«æ«å°¾ã« __decafe_check_me__ ã® suffix ãã¤ãã¾ãã
ãããã®ã±ã¼ã¹ã«å½ã¦ã¯ã¾ããªãã¨ãã¯ãå®å
¨ã«å¤æã§ããã¨ã㦠__decafe__ ã® suffix ãã¤ãã¾ãã
- 夿æã«åé¤ããã require ã³ã¡ã³ããåå¨ããã
- CoffeeScript ã½ã¼ã¹ã«
*/ãå«ã¾ãã¦ãããåºåã¯ç°å¸¸ãªãã¡ã¤ã«ã¨ãªãã2 - åºåå ã®ãã¡ã¤ã«ã¨åãååã®ãã¡ã¤ã«ãããã3
夿ãããã³ã¼ããã git ã® commit ã使
ç®è¦ç¢ºèªãä¸è¦ãªèªå夿ããããã¡ã¤ã«ã commit ããããã®ã¹ã¯ãªããã§ãã
ãã¡ã¤ã«ã®ãªãã¼ã ã¨å å®¹ã®æ´æ°ãåæã«è¡ãªã£ãå ´åããã¡ã¤ã«ã®å䏿§ã®ç¶æã«å¤±æãããã¨ãããã¾ãããã®ãããªãã¼ã ã¨æ´æ°ã®2åã«ãã㦠commit ãã¾ããã
git mv ã¹ã¯ãªãã
git mv ããã ãã§ãã
åä½ãããå¾ã¯ git commit ãã¾ãã
#!/bin/bash FILES=`find . -name "*.coffee.__decafe__"` for i in $FILES; do COFFEE_FILE=${i%.__decafe__} JS_FILE=${COFFEE_FILE%.coffee} # .jsæ¡å¼µåãããå ´åã¨ãªãå ´åããã JS_FILE=${JS_FILE%.js}.js git mv $COFFEE_FILE $JS_FILE done
git add ã¹ã¯ãªãã
夿ããããã®ãã³ãã¼ã㦠git add ããã ãã§ãã
åä½ãããå¾ã¯ git commit ãã¾ãã
#!/bin/bash FILES=`find . -name "*.coffee.__decafe__"` for i in $FILES; do JS_FILE=${i%.coffee.__decafe__} # .jsæ¡å¼µåãããå ´åã¨ãªãå ´åããã JS_FILE=${JS_FILE%.js}.js cp $i $JS_FILE git add $JS_FILE rm $i done
æå夿
èªå夿ããã CoffeeScript ãã¡ã¤ã«ããã¼ã¹ã«ã
- å
ãã¡ã¤ã«ã®
#= requireã//= requireå½¢å¼ã«æ¸ãç´ãã¦è¿½å ãã - ãã¡ã¤ã«ãå°ãããã°ãæéã«ãªããªãã®ã§èªã¿ãããæ´å½¢ããã®çµæãå ã½ã¼ã¹ãä¸è¦ã§ããã°åé¤ã
- ã³ã¡ã³ãé¨å㯠JavaScript ã¨ãã¦ç ´ç¶»ããªãããã«ä¿®æ£
ãªã©ãè¡ããã¢ã»ããã®ãªãã«ãããã¾ãã«ãããªããå·®åãè¦ãªãã夿ãã¾ããã
ãã©ãã
ã³ã¡ã³ãããåå¨ããªããããªãã¡ã¤ã«ã§ããCoffeeScript ã¨ãã¦å¤æãããå ´åã«ã
(function() { }).call(this);
ã®ãããªãã¡ã¤ã«ãåºåãããåºåããããã¡ã¤ã«å ã«å ¥ãè¾¼ã¿ã¾ãã ããã³ã¡ã³ã以å¤ã«ä¸è¡ãè¨è¿°ããªãã£ãã¨ãã¦ãããã®è¨è¿°ããªãå ´åã¯åºå JavaScript ã«å·®åãã§ã¾ãã®ã§ãä¾å¤ã¯ä½ããã«å¤æãããã³ã¼ããå©ç¨ãã¾ãã
æçµç¢ºèª
æå ã®éçºç°å¢ã§ã¯å·®åããªããã¨ã確èªããªãã使¥ãã¦ãã¾ãããæå¾ã¯å¿µã®çºã¹ãã¼ã¸ã³ã°ç°å¢ã§ãã夿宿½åã»å®æ½å¾ã®ãã¡ã¤ã«ãæ¯è¼ãã¦å¤æ´ããªãã確èªãã¾ããã
å
·ä½çã«ã¯ãSprockets ã®åºåãã Manifest ãã¡ã¤ã« public/assets/.sprockets-manifest-*.json ãæ¯è¼ãã¾ãããæ¯è¼æã«è¦ãããããã« jq ãªã©ã§ JSON ãæ´å½¢ãã¦ãããdiff ã§æ¯è¼ãåå¾ãã¾ããã
Hash ä¸ã®å·®åã¯ãªã mtime (æçµæ´æ°æå») ã ãã«å·®åããããã¨ããã¼ã ã§ç¢ºèªãã¾ãã
ä»åãããªãã£ããã¨
èªã¿ãããã³ã¼ãã¸ã®å¤æ
- åºåãå¤ãããªãé¨å
- åé¤ãããã³ã¡ã³ãã»ç©ºè¡ã®å復ã
- åºåã夿´ãããé¨å
- ç¡æå³ãª
returnæãletã使ããªãããã®é¢æ°ã¹ã³ã¼ããã空ã®é¢æ°å®ç¾©ã®åé¤ã
- ç¡æå³ãª
åè ã¯å¤æã®å®è£ é度ã®ãããå¾è ã¯å䏿§ãä¿è¨¼ãããããããããã¾ããã ã³ã¼ãã®åéãå¤ããããæ» å¤ã«å¤æ´ãããªãã¨ã¯ããã³ã³ããªã¯ããé¿ãããã£ãããã§ãã
åºåçµæãç°ãªããããªå¤æããç¾ããæ´ãããã¨ã¯å¥ã®æ©ä¼ã«è¡ãã¾ãããã
æå¾ã«
ã¯ã©ã¦ãã¯ã¼ã¯ã¹ã§ã¯ããã³ãã¨ã³ãã好ããªã¨ã³ã¸ãã¢ããããã¯ã¨ã³ãã好ããªã¨ã³ã¸ãã¢ãåéãã¦ãã¾ãï¼
-
JavaScriptã¯247ãã¡ã¤ã«ãTypeScriptã¯331ãã¡ã¤ã«ãStorybookã¯395ãã¡ã¤ã«ãVue.jsã¯440ãã¡ã¤ã«ã§ãã↩
-
CoffeeScript ã«å¤æåã® JavaScript (!) ãå«ã¾ãã¦ããã(æ´å²ã§ãã)ãæ£è¦è¡¨ç¾ã®ä¸é¨ã§åºç¾ãã¦ãã¾ããã↩
-
xxxx.js 㨠xxxx.js.coffee ã両æ¹åå¨ãã¦ãã¾ãããæ´å²ã§ããã↩