「フロントエンドで普及が進むビルドツールたち」 インフラエンジニアの祭典「July Tech Festa 2014」でフロントエンドの自動化の話をしてきました。(まだ6月だけど) http://2014.techfesta.jp/
! facebook.com/cognitomՏଜϑϩϯτΤϯυͰීٴ͕ਐΉϏϧυπʔϧͨͪ(SVOUɺHVMQ΄͔
View Slide
+ + ৭ʑ
ओʹɺΧϑΣͷϚελʔͰ͢ɻ執筆/教育マスター デザイン開発成分表
ϑϧελοΫͳΤϯδχΞʹͳΔ͘ɺ
ࡊ͡Ί·ͨ͠ɻ
͢Έ·ͤΜɺΓ͗͢·ͨ͠ɻ
ଟॏԽɾԽΛࢹʹ
ͱΓ͋͑ͣɺൃժΛ͍ͬͯ·͢ɻ
ຊͰ͢ɻ
ΠϯϑϥΤϯδχΞͷͨΊͷڭཆՊ
wϑϩϯτΤϯυ੍࡞ͷʮࠓʯwϏϧυπʔϧͷมભwαʔόɺΫϥΠΞϯτɺͦͯ͠ୈࡾۃϑϩϯτΤϯυͰීٴ͕ਐΉϏϧυπʔϧͨͪ
ϑϩϯτΤϯυπʔϧͷʮࠓʯ
σϞ
HVMQ
#SPXTXF4ZODͷσϞ
*MMVTUSBUPSϑΝΠϧࢹͷσϞ
(SVOUհʮάϥϯτ HSⓟOUʯͱൃԻɻϑϩϯτΤϯυ੍࡞Ͱඞཁʹͳͬͨɺ͋Ε͜ΕͷࣗಈԽΛ͢ΔͨΊͷɺλεΫϥϯφʔɻ͋Δ͍ɺϏϧυπʔϧɻϑϩϯτΤϯυͷࣗಈԽͷཱऀɻ
(SVOUͷΠϯετʔϧͱ࣮ߦ$ grunt!$ grunt task_nameϓϩδΣΫτͷσΟϨΫτϦͰʜ$ npm install -g gulp-cli/PEFKT͕ඞཁɻάϩʔόϧʹΠϯετʔϧɻ
gulp.task 'sass', ->gulp.src 'app/styles/**/*.scss'.pipe sass().pipe autoprefixer 'last 1 version'.pipe gulp.dest ‘dist/styles'!gulp.task 'default', ['sass'] ->gulp.watch 'app/styles/**/*.scss', ['sass']grunt.initConfigsass:dist:files: [cwd: 'app/styles'src: '**/*.scss'dest: '../.tmp/styles'expand: trueext: '.css']autoprefixer:options: ['last 1 version']dist:files: [expand: truecwd: '.tmp/styles'src: '{,*/}*.css'dest: 'dist/styles]watch:styles:files: ['app/styles/{,*/}*.scss']tasks: ['sass:dist', ‘autoprefixer:dist']!grunt.registerTask 'default', ['styles', 'watch']
8FC'VOEBNFOUBMTCZ(PPHMF! ϚϧνσόΠεରԠͷ ελʔλʔΩοτ λεΫϥϯφʔʹHVMQΛ࠾༻
͜Ε͔Β࢝ΊΔͳΒɺHVMQͰ৽͠ͷϓϩδΣΫτHVMQΛ࠾༻ JO(JU)VCطଘϓϩδΣΫτҠߦ͕࢝·͍ͬͯΔ!˞ͨͩ͠ɺϫʔΫϑϩʔ͕ݻ·ͬͯ͠·ͬͨɹ੍࡞ݱͰɺࠓޙ໘(SVOU͕ΘΕΔ
HVMQೖʮΨϧϓ HⓟMQʯͱൃԻɻϑϩϯτΤϯυ੍࡞Ͱඞཁʹͳͬͨɺ͋Ε͜ΕͷࣗಈԽΛ͢ΔͨΊͷɺλεΫϥϯφʔɻ͋Δ͍ɺϏϧυπʔϧɻ
HVMQͷΠϯετʔϧ$ npm install -g gulp/PEFKT͕ඞཁɻάϩʔόϧʹΠϯετʔϧɻ
QBDLBHFKTPO
HVMQpMFDPGGFF
HVMQͷ࣮ߦ$ gulp!$ gulp task_name!$ gulp task1 task2 task3 …ϓϩδΣΫτͷσΟϨΫτϦͰʜ
uglifycoffeegulp.destgulp.srcgulp = require 'gulp'coffee = require 'gulp-coffee'uglify = require 'gulp-uglify'gulp.task 'js', ->gulp.src './js/src/*.coffee'.pipe coffee().pipe uglify().pipe gulp.dest ‘./js/‘gulp.task 'watch', ->gulp.watch './js/src/*.coffee', ['js']Single Dest & Watchग़ྗઌͭࢹ
ग़ྗઌ͕ෳgulp.destautoprexierminify-cssrenamegulp.destgulp.srcgulp = require 'gulp'autoprefixer = require 'gulp-autoprefixer'minifyCss = require 'gulp-minify-css'rename = require 'gulp-rename'gulp.task 'css', ->gulp.src './css/src/style.css'.pipe autoprefixer 'last 2 versions'.pipe gulp.dest ‘./css/‘.pipe minifyCss().pipe rename extname: '.min.css'.pipe gulp.dest ‘./css/‘Multi Dest
มߋՕॴΛݟͯϏϧυcacheduglifyconcatremembergulp.destgulp.srcgulp = require 'gulp'cached = require 'gulp-cached'uglify = require 'gulp-uglify'remember = require 'gulp-remember'concat = require 'gulp-concat'gulp.task ‘script’, ->gulp.src './js/src/*.js'.pipe cached().pipe uglify().pipe remember().pipe concat 'app.js'.pipe gulp.dest ‘./js/‘Incremental Rebuildingchanged uglify gulp.destgulp.srcgulp = require 'gulp'changed = require 'gulp-changed'uglify = require 'gulp-uglify'gulp.task 'script', ->gulp.src './src/*.js'.pipe changed './dist/'.pipe uglify().pipe gulp.dest './dist/'Only Changed
data =apple:title: 'Apple Cake'attrs: some_dataorange:title: 'Orange Cookie'attrs: some_datagulp.task 'page', ->es.concat.apply null,for name, options of datagulp.src './templates/a.html'.pipe consolidate 'lodash',title: options.titleattrs: options.attrs.pipe renamebasename: nameextname: '.html'.pipe gulp.dest './html/'renameconsolidategulp.destgulp.srcrenameconsolidategulp.destgulp.srcrenameconsolidategulp.destgulp.srces.concatStream Arraygulp = require 'gulp'es = require 'event-stream'consolidate = require 'gulp-consolidate'rename = require 'gulp-rename'Serial Joinlesscssimportgulp.srcautoprexiergulp.destgulp.srcconcatminify-cssstreamqueuegulp = require 'gulp'streamqueue = require 'streamqueue'less = require 'gulp-less'cssimport = require 'gulp-cssimport'autoprefixer = require 'gulp-autoprefixer'concat = require 'gulp-concat'minifyCss = require 'gulp-minify-css'gulp.task 'css', ->streamqueue objectMode: true,gulp.src './css/src/first.less'.pipe less()gulp.src './css/src/second.css'.pipe cssimport().pipe autoprefixer 'last 2 versions'.pipe concat 'app.css'.pipe minifyCss().pipe gulp.dest './css/'Async Streamsgulp = require 'gulp'merge = require 'merge-stream'less = require 'gulp-less'autoprefixer = require 'gulp-autoprefixer'gulp.task 'css', ->merge(gulp.src './css/src/first.less'.pipe less().pipe gulp.dest './css/'gulp.src './css/src/second.css'.pipe autoprefixer 'last 2 versions'.pipe gulp.dest './css/')lessgulp.destgulp.srcautoprexiergulp.destgulp.srcmerge
ԿΛࣗಈԽ͢Δͷ
ࣗಈԽΛඞཁͱ͢ΔλεΫͨͪ-&44 4BTT 4UZMVT$44ͷ࠷దԽ$P⒎FF4DSJQU 5ZQF4DSJQU -JWF4DSJQU#SPXTFSJGZ 3FRVJSFKTελΠϧΨΠυεϥΠεͷΓग़͠ը૾ͷ࠷దԽϑΥϯτͷࣗಈੜ੩తαΠτੜ
-&44 4BTT 4UZMVTίϯύΠϧ͢Δͱ$44ʹͳΔͷHVMQMFTTHVMQSVCZTBTTHVMQTUZMVT
$44࠷దԽ!JNQPSUͷຒΊࠐΈɺϕϯμʔϓϦϑΟΫεϛχϑΝΠɺܰྔԽHVMQDTTJNQPSUHVMQBVUPQSFpYFSHVMQDTTP HVMQNJOJGZDTTHVMQVODTT
$PGGFF4DSJQU 5ZQF4DSJQU -JWF4DSJQU΄͔ίϯύΠϧ͢Δͱ+BWB4DSJQUʹͳΔͷHVMQDP⒎FFHVMQUZQFTDSJQUHVMQMJWFTDSJQU
#SPXTFSJGZ 3FRVJSFKT6HMJGZ+BWB4DSJQUͷϥΠϒϥϦґଘΛղܾ͢ΔͷɻಡԽɾѹॖ͢Δͷɻ
ελΠϧΨΠυελΠϧͷ༷ॻతͳΞϨɻHVMQTUZMFEPDDP
ը૾ͷ࠷దԽεϥΠεͷΓग़͠ख࡞ۀͱ͔ɺ͏͋Γ͑ͳ͍ͷͰɻHVMQCBTFHVMQJNBHFNJOHVMQTLFUDI!TLFUDIUPPM 4MJDZ΄͔
ϑΥϯτͷࣗಈੜ47(͔ΒΞΠίϯϑΥϯτΛੜHVMQJDPOGPOUHVMQTLFUDI
ࣗಈԽͳΜͷͨΊ
ࣗಈԽͳΜͷͨΊָ͢ΔͨΊɻͱಉ͡࡞ۀΛ͠ͳ͍ίϯύΠϧɺࣗಈੜςετɺιʔείʔυͷݕূϦΞϧλΠϜԽ -JWF3FMPBE #SPXTFS4ZODʮඵͰ͖ͯΔʯͱʮͰͰ͖Δʯશ͘ผϞϊ
Ϗϧυπʔϧͷมભ
Ϗϧυπʔϧͷੴث࣌γΣϧεΫϦϓτ"QQMF4DSJQU"EPCF+BWB4DSJQU
Ϗϧυπʔϧͷதੈ.BLFγΣϧͷԆ3BLF3VCZͰ+BLF+BWB4DSJQUͰ'BCSJD1ZUIPOͰ"OU+BWBͰ8BUDINBO'BDFCPPLۘͷϑΝΠϧࢹπʔϧ
Ϗϧυπʔϧͷۙ(VBSEϑΝΠϧͷߋ৽ࢹ8BUDISಉ͘͡ ͨͩ͠ɺݱࡏσΟείϯࢀߟ.JEEMFNBO αʔόαΠυൃͷ44(
ϏϧυπʔϧͷݱHVMQҰ൪׆ൃɻγϯϓϧͳઃఆɺ࣮ߦʹఆධ(SVOUϓϥάΠϯ࠷ଟɻ͜ͷͷύΠΦχΞ#SVODIςϯϓϨʔτͱ#PXFS࿈ܞ͕ڧΈ#SPDDPMJʮϑΝΠϧπϦʔʯΛՃ
Ϗϧυπʔϧͷฏߦੈք$PEF,JU#PXFSͷ(6*ͱͯ͠ػೳ1SFQSPT.BD8JO྆ରԠ)BNNFS$BDUVT
αʔόɺΫϥΠΞϯτͦͯ͠ୈࡾۃ
αʔόWTϒϥβαʔόαΠυɾϓϩάϥϛϯάΫϥΠΞϯταΠυɾϓϩάϥϛϯά
σβΠϯͷݱ͔ΒͷཁΥʔλʔϑΥʔϧํ๏ͷ่յϨεϙϯγϒ8FCσβΠϯΠϯϒϥβσβΠϯσβΠϯ ςετϑΝʔετɺ$*
ਤͷσβΠϯը૾ͷΓग़͠શମͷσβΠϯσΟςʔϧͱΓ͋͑ͣஔϨεϙϯγϒௐ͖ͬͪΓஔόϥϯεͷௐΑ͋͘Δ8FCσβΠϯͷϑϩʔϑϥοτσβΠϯͷϑϩʔΞΠίϯͷσβΠϯͱ͔ؔੑͷσβΠϯ৭ຯɾొཁૉɾ০)5.-ͷߏ༏ઌແݶϧʔϓ
1$5BCMFU1IPOF
σβΠφࣗಈԽ)5.-$44ͰࣗಈԽϑϩϯτΤϯυͷ+BWB4DSJQU։ൃͰࣗಈԽ੍࡞ͷ֤ྖҬͰࣗಈԽ͕ඞཁʹͱ͍͏͔ɺ୯७λεΫଟ͗͢ɻ
μϝɺ͍ͥͬͨ1$্ͷ୯७ͳ෮λεΫΛਓ͕͍͚ͬͯͳ͍
͋ΒͨΊͯɺࣗಈԽ (6*ΞϓϦ͔ΒͷาΈدΓ4LFUDI΄͔ ֤ྖҬͷࣗಈԽ࿈ܞ͢Δඞཁ͕͋Δ ྫը૾࠷దԽˠ$44Ͱ#"4&Τϯίʔυº৬ਓ࡞ۀɹˠɹ˓ࣗಈԽίʔυͷνϡʔχϯάͦͷͨΊͷڞ௨ϓϥοτϑΥʔϜ/PEFKT˞3VCZ4IFMM4DSJQUམͱ͠Ͳ͜ΖʹͳΒͳ͍
ͳͥɺࠓʹͳͬͯʜ
ϑϩϯτΤϯυ։ൃ͕ΜʹͳͬͯɺϓϩάϥϚ͕ɺ͜ͷྖҬʹೖΓ͔ͩͨ͠Βɻ
αʔόɺϒϥβɺୈࡾۃ
ͱ͍͏Θ͚Ͱɺ
͓ݟΓஔ͖ΛɻHVMQͰͨ͠ɻͱͦͷؒͨͪ
5IBOLZPV! facebook.com/cognitom