ããã¯ã¬ã€ãã§ã¯ãããŸããã倧èŠæš¡ãªDjangoãããžã§ã¯ãã§ãjQueryã¹ã¯ãªããã®ããžã£ã³ã¯ãããgulpãšbrowserifyã䜿çšããŠãAngularJSäžã®è€éãªããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ã®ã¢ã»ã³ããªãšçž®å°ã«åŸã ã«åãçµãã§ããçµéšãå ±æããŠããŸãã
èæ¯
å€æ°ã®ã¬ã¬ã·ãŒã³ãŒãã10åã®äŸåé¢ä¿ãããã³å ¬åŒã®ããã³ããšã³ãéçºè ã®ããªãããŒã ãå«ã倧èŠæš¡ãªé·æDjangoãããžã§ã¯ãããããŸãã ã©ããããããç§ã¯æ¬¡ç¬¬ã«jsã«å€¢äžã«ãªããããã³ããšã³ãã«é¢ããããã«ãªããä»ã§ã¯ãã§ã«äœæ¥æéã®åå以äžãããã£ãŠããŸãã
ç§ãã¡ã®ãããžã§ã¯ãã®ããã³ããšã³ãã®æŽå²ïŒããã«å¿ããŠãjséçºè ãšããŠã®ç§ã®éçºïŒã«ã¯ã3ã€ã®å€§ããªæ®µéããããŸãã
jQueryã¯ç§ãã¡ã®ãã¹ãŠã§ã
ããã¯ãããã€ãã®jQueryã¡ãœããããã¹ã¿ãŒããã»ã¬ã¯ã¿ãŒããã¹ã¿ãŒããã¢ãã¡ãŒã·ã§ã³ã䜿çšããŠããŒãžäžã®èŠçŽ ã衚瀺/é衚瀺ã«ããããšãåŠãã æéã§ããã ãã¹ãŠã®æ°åè ã¯ãããçµéšãã誰ããã©ã®ããã«èŠããããç¥ã£ãŠããŸãïŒåæ©èœã¯åå¥ã®ãã¡ã€ã«ã§ããã倧ããªããŒãžã«ã¯å€æ°ã®ã¹ã¯ãªããæ¥ç¶ããããã·ã¹ãã ã¯ãããŸãã-åã¹ã¯ãªããã¯ããèªäœã®ããã§ããã圌ããèšãããã«ãã¹ãŠã®çµæããããŸãã ãã³ããŒã©ã€ãã©ãªãæ ŒçŽããç¹å®ã®å Žæã¯ãããŸããã§ããã次ã®åéçºè ã¯ãèªåãæãå Žæã«æ°ããã©ã€ãã©ãªãæããŸããã ç§ãèªåã§æžãããã®ãã¹ãŠã«å ããŠãç§ã®åã«æžãããããããã®å€ãã¹ã¯ãªããããããŸããã
ããã¯ã¢ãŠã+ RequireJS
管çããã«çšã«ãããè€éãªã€ã³ã¿ãŒãã§ãŒã¹ããŠã£ã¶ãŒãããã®ä»ã®ãã®ãäœæããå¿ èŠããããŸããã ãã®æç¹ã§ãjQueryã¯äžèœè¬ã§ã¯ãªããã³ãŒããäœããã®åœ¢ã§æŽçããå¿ èŠãããããšãç解ãããŸããã KnockoutãšRequireJSãå©ãã«ãªããŸããã RequireJSã§ã¯ãã³ãŒããã¢ãžã¥ãŒã«ã«åå²ããäŸåé¢ä¿ãæå®ããç°ãªãããŒãžã§ã¢ãžã¥ãŒã«ãåå©çšããåã¢ããªã±ãŒã·ã§ã³ã®éåžžã®ãã¡ã€ã«æ§é ãæ§ç¯ã§ããŸããã å°ãªããšãäœããã®ã·ã¹ãã ãç»å ŽããŸããããã¹ãŠã®ã©ã€ãã©ãªãžã®ãã¹ãæã€RequireJSã®æ§æãã¡ã€ã«ãäœæããããã¹ãŠã®ããã¯ã¢ãŠãããŒãžã§äœ¿çšããããã¹ãŠã®ãã³ããŒã©ã€ãã©ãªã1ãæã«åãŸããŸããã åé¡ã¯1ã€ã ãã§ããããã³ãã¬ãŒãã«æ¥ç¶ãããŠããã¹ã¯ãªããã¯1ã€ã ãã§ãæ®ãã®äŸåé¢ä¿ã¯RequireJSèªäœã«ãã£ãŠåŒã䌞ã°ãããã¢ãžã¥ãŒã«ãã¡ã€ã«ãéåžžã«å°ããããããµãŒããŒãžã®pingãããŠã³ããŒãæéãããé·ããªããŸããã ç§ã¯ãã°ãã°ãã®åé¡ãææããããŸããŸãªè§£æ±ºçãæ瀺ããŸããããåœå±ã®å¯Ÿå¿ã¯åžžã«åãã§ããããããã¯ç®¡çããã«ã§ãã ããã¯éèŠã§ã¯ãããŸããã ããã«æéãç¡é§ã«ããŸãããã
AngularJS + Gulp + Browserify + Uglify
æåŸã«ãæãã«ã¹ã¿ããŒãšãªã¢ã«å°éããŸãããããªãããŒãªã€ã³ã¿ãŒãã§ã€ã¹ãšUXèŠä»¶ã§ãã ã¹ã¯ãªããã®èªã¿èŸŒã¿ã®åé¡ãç¡èŠããããšã¯ãã§ã«äžå¯èœã§ããã åœæãç§ã¯ãã§ã«ããã³ããšã³ãã®ãã«ãã¹ã¯ãªããã䜿çšããŠNodeJSã§éçºããçµéšãç©ãã§ããŸãã RequireJSã®æ§æãã¡ã€ã«ãšãã³ããŒã©ã€ãã©ãªã®äœç³»çãªãã³ããæ¶ãªãã§èŠãããšãã§ããªããªããŸããã
ãããžã§ã¯ãã®äžè¬çãªä»çµã¿ã«ã€ããŠå°ã説æããŸãã ådjangoã¢ããªã±ãŒã·ã§ã³ã«ã¯ç¬èªã®éçãã©ã«ããŒããããéçºäžã«django devãµãŒããŒã¯ãããã®ãã©ã«ããŒå ã®ããŒãžã«æ¥ç¶ãããã¹ã¯ãªãããæ¢ããŸãã ãããã€ã¡ã³ãäžã«ãæ¬çªç°å¢ã§collectstaticãäœæãããŸããããã«ããã1ã€ã®ãã©ã«ããŒå ã®ãã¹ãŠã®ãã¡ã€ã«ãåéãããWebãµãŒããŒãããã¡ã€ã«ãè¿ãããŸãã ç°åžžãªããšã¯äœããããŸããã
ç§ã¯æ¬¡ã®ãã®ãæã«å ¥ãããã£ãïŒ
- ããã³ããšã³ãã®éåžžã®ããã±ãŒãžãããŒãžã£ãŒã
- åå©çšå¯èœãªã¢ãžã¥ãŒã«åœ¢åŒã®éåžžã®ã³ãŒã圢åŒã
- 1ã€ã®ãã¡ã€ã«ã®ã¢ã»ã³ããªjs-applicationãšãã®çž®å°ã
質åãçºçããŸãã-éåžžã®ã¯ãŒã¯ãããŒã劚ãããNodeJSïŒãPythonistsããŒã ã®æ°ããèšèªããšåŒã°ããïŒãšãã®ãŠãŒãã£ãªãã£ã®æ°ããäŸåé¢ä¿ã§ãã¹ãæããããªãããã«ãããããããžã§ã¯ãã«ãã蟌ãå¿ èŠããããŸããïŒ
jsã³ãŒãã䜿çšãããã¹ãŠã®æäœïŒã¢ã»ã³ããªããããã¡ã€ïŒã¯ã³ãããã®åã«è¡ãããå®æããããã±ãŒãžã¯å¯Ÿå¿ããdjangoã¢ããªã±ãŒã·ã§ã³ã®éçãã©ã«ããŒã«ã³ããŒãããããããæ¥ç¶ãããããšã«ãªããŸããã ãããã£ãŠãå±éããã»ã¹ã¯å€æŽããããå®çšŒåç°å¢ã§ã®æ°ããäŸåé¢ä¿ã¯ãããŸããã
ç§ãã¡ã¯æ¬åœã®éã«çæããŸã
ç°å¢
ãããã£ãŠãæåã«å¿ èŠãªãã®ã¯æ¬¡ã®ãšããã§ãã
- nodejs ;
- gulp-ã¢ã»ã³ããªã¿ã¹ã¯ã説æããŸãã
- npm-ã¢ã»ã³ããªã«å¿ èŠãªããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
- bower-ããã³ããšã³ãã«å¿ èŠãªããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
次ã®ããã«ãã·ã¹ãã ã«ã°ããŒãã«ã«ã€ã³ã¹ããŒã«ããå¿ èŠããããŸã ã³ã³ãœãŒã«ãŠãŒãã£ãªãã£ãå¿ èŠã§ãã 幞ããªããšã«ãVagrantã§éçºããŠããã®ã§ãé©åãªã·ã§ãã¬ã·ãã圌ã®èšå®ã«è¿œå ããŸããã ãããžã§ã¯ãã®ã«ãŒãã«ã€ã³ã¹ããŒã«ããåŸã npm initãšbower initãå®è¡ããå¿ èŠãªæå°éã®ãã©ã¡ãŒã¿ãŒãèšå®ããå¿ èŠããããŸããåºåã¯package.jsonãšbower.jsonã«ãªããŸãã ç°å¢ãæºåããæåŸã®ã¹ãããã¯ã .gitignoreã«node_modules /ããã³bower_components /ãå°å ¥ããããšã§ããããã¯ãã¢ã»ã³ããªå šäœãéçºäžã«çŽæ¥è¡ãããããã§ãã
bowerãšnpmã䜿çšããŠããã±ãŒãžãã€ã³ã¹ããŒã«ããå Žåãããã±ãŒãžæ å ±ãbower.jsonãšpackage.jsonã«ããããä¿åãããä»ã®éçºè ãnpm installãšbower installãå®è¡ããã ãã§ç°¡åã«ç°å¢ãäžããããšãã§ããããã«ã-save-devåŒæ°ã䜿çšããããšãå¿ããªãã§ãã ãããããžã§ã¯ãã®ã«ãŒãã
ãã£ã¬ã¯ããªæ§é
jsã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ã³ãŒãããããžã§ã¯ãã®ã«ãŒãã«ããå¥ã®ãã£ã¬ã¯ããªã«ä¿åããããšã«ããŸããã æåã¯ãã¢ã»ã³ããªäžã«ãã®å Žã§ãã£ã¬ã¯ããªæ§é ãåæãããã£ãã®ã§ãããé ããæ©ããããã¹ãŠã®ã¹ããŒãã¢ãã©ã€ã¶ãŒã«ã¯ãæŸèæãå¿ èŠãªã¿ã¹ã¯ããããšèãããããããããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ãèšè¿°ããæ§æãäœæããããšã«ããŸããã ãã®ããã config-spa.jsãã¡ã€ã«ããããžã§ã¯ãã®ã«ãŒãã«è¡šç€ºãããŸããã
module.exports = { apps: { 'appname': { // js- main: 'app.js', // path: './spa/dj-app/appname/', // bundle: 'appname.min.js', // dest: './dj-app/static/dj-app/js/', // django- watch: ['./spa/dj-app/appname/**/*.js'] // glob- ( ) }, ... } }
- spa / -ãã¹ãŠã®jsã¢ããªã±ãŒã·ã§ã³ãé 眮ããããã£ã¬ã¯ããª
- dj- app-ã¢ã»ã³ãã«ãããããã±ãŒãžã䜿çšãããdjangoã¢ããªã±ãŒã·ã§ã³ã®åå
ãããã£ãŠãã¹ã¯ãªãããã©ã®ã¢ããªã±ãŒã·ã§ã³ã«å±ããŠããããç°¡åã«ç解ã§ããŸãã äžè¬ã¢ãžã¥ãŒã«ã¯ãcommonãšããååã®ãã£ã¬ã¯ããªã«é 眮ãããŸãã
gulpfile.js
å°èŠæš¡ã®å Žå-ã¢ã»ã³ããªã®ã¿ã¹ã¯ã®èª¬æã¯ãã®ãŸãŸã§ãã äžè¬ã«ãçµæã¯æšæºã®gulpfileã§ãããã誰ãã«åœ¹ç«ã€ããã€ãã®ããªãã¯ããããŸãã
ã³ãã³ãã©ã€ã³åŒæ°ã®è§£æãšæåã®ããªãã¯
ããã€ãã®ã¢ããªã±ãŒã·ã§ã³ããããããã©ã®ã¢ããªã±ãŒã·ã§ã³ããã«ãããå¿ èŠãããã®ãââã瀺ããããã¹ãŠãåæ§ç¯ããå¿ èŠãããããšã瀺ãå¿ èŠããããŸããã
å¥ã®åŒæ°ã¯ããããã°äžã«éåžžã®ã¹ã¿ãã¯ãã¬ãŒã¹ã衚瀺ã§ããããã«ãã¢ããªã±ãŒã·ã§ã³ã®çž®å°ããã£ã³ã»ã«ãããã©ã°ã§ãã
ããªãã¯ã¯äœã§ããïŒ ç¬¬äžã«ãåŒæ°ãå¥ã®ã¿ã¹ã¯ãšããŠè§£æããä»ã®ã¿ã¹ã¯ã®äŸåé¢ä¿ã§ç€ºãããšãã§ãããšããäºå®ãšã第äºã«ã解æãããåŒæ°ãã°ããŒãã«å€æ°ã«æ ŒçŽããããããä»ã®ã¿ã¹ã¯ããããã€ãã®ã¿ã¹ã¯ãåŒã³åºããšãã«ãåãèšå®ã§åäœããŸãã
// , . var config = require('./config-spa'), argv = {parsed: false} gulp.task('parseArgs', function() { // prevent multiple parsing when watching if (argv.parsed) return true // check the process arguments var options = minimist(process.argv) if (_.size(options) === 1) { printArgumentsErrorAndExit() } // , var apps = [] if (options.app && config.apps[options.app]) { apps.push(options.app) } else if (options.all) { apps = _.keys(config.apps) } if (!apps.length) printArgumentsErrorAndExit() argv.apps = apps // dev - , if (options.dev) argv.dev = true argv.parsed = true }) function printArgumentsErrorAndExit() { gutil.log(gutil.colors.red('You must specify the app or'), gutil.colors.yellow('--all')) gutil.log(gutil.colors.red('Available apps:')) _.each(config.apps, function(item, i) { gutil.log(gutil.colors.yellow(' --app ' + i)) }) // break the task on error process.exit() }
ãã«ãã¢ããªã±ãŒã·ã§ã³
function bundle() { return through.obj(function(file, enc, cb) { var b = browserify({entries: file.path}) file.contents = b.bundle() this.push(file) cb() }) } gulp.task('build', ['parseArgs'], function(cb) { var prefix = gutil.colors.yellow(' ->') async.each(argv.apps, function(app, cb) { gutil.log(prefix, 'Building', gutil.colors.cyan(app), '...') var conf = config.apps[app] if (!conf) return cb(new Error('No conf for app ' + app)) gulp.src(path.join(conf.path, conf.main)) .pipe(bundle()) .pipe(gulpif(!argv.dev, streamify(uglify()))) .pipe(rename(conf.bundle)) .pipe(gulp.dest(conf.dest)) .on('end', function() { cb() }) }, function(err) { cb(err) } ) })
- function bundleïŒïŒ{...} -browserifyã®èªå·±èšè¿°ã©ãããŒã ãã©ãŠã¶ã䜿çšãã人ã¯ããã©ãŠã¶åèªäœãã¹ããªãŒã ã®æäœæ¹æ³ãç¥ã£ãŠããããšãé·ãéç¥ã£ãŠãããããgulp-browserifyããã±ãŒãžã¯é·ãé䜿çšãããŠããŸããã
- [parseArgs] -ã³ãã³ãã©ã€ã³åŒæ°ã解æããããã®ã¿ã¹ã¯ã®äŸåé¢ä¿ã§æå®ããŸãã ãããã£ãŠãargvå€æ°ã«ã¯ãã§ã«æå¹ãªèšå®ãå«ãŸããŠãããšç¢ºä¿¡ããŠããŸãã
- async.eachãcbïŒïŒ -åŒæ°ã§æå®ãããã¢ããªã±ãŒã·ã§ã³ã®åæã ã³ãŒã«ããã¯ã«åé¡ããã©ãã«ãçºçããã®ã¯ãªãã§ããïŒ å®éã«ã¯ãã¢ã»ã³ããªããã·ãŒãžã£èªäœïŒgulp.srcïŒïŒãPipeïŒïŒ...ïŒã¯éåæã§ããããã§ãŒã³å šäœãå®è¡ãããåã«ã¿ã¹ã¯ãå®äºããããšãã§ããŸããããã«ããã次ã®ããã«ãªããŸããäŸåã¿ã¹ã¯ã¯å®è¡ãæ©ãéå§ããŸãã 3ã€ã®è§£æ±ºçããããŸã-ã¿ã¹ã¯ããã®ã³ãŒã«ããã¯ãã¹ããªãŒã ã¿ã¹ã¯ããã®æ»ã-gulp.srcïŒïŒ...ãè¿ããpromiseãè¿ããŸãã ã¹ããªãŒã ãããã€ããããããããã«ã¹ããªãŒã ãè¿ãããšã¯ã§ããŸããããã®ãããã³ãŒã«ããã¯ã«æ±ºããŸããã
- .pipeïŒgulp.destïŒconf.destïŒïŒ -åéãããããã±ãŒãžã¯js application configã§æå®ãããéçãã©ã«ããŒã«ã³ããŒããããããå±éæã«collectstaticã¯è¿œå ã®ãžã§ã¹ãã£ãŒãªãã§ãžã§ããå®è¡ããŸãã
ãã¡ã€ã«ã®å€æŽæã®åã³ã³ãã€ã«
jsã¢ããªã±ãŒã·ã§ã³ãã¡ã€ã«ã®å€æŽãç£èŠããã¿ã¹ã¯ïŒ
gulp.task('watch', ['build'], function() { var targets = [] _.each(argv.apps, function(app) { var conf = config.apps[app] if (!conf) return if (conf.watch) { if (_.isArray(conf.watch)) { targets = _.union(targets, conf.watch) } else { targets.push(conf.watch) } } }) targets = _.uniq(targets) // start watching files gulp.watch(targets, ['build']) })
- ['build'] -äŸåé¢ä¿ã§ãã«ãã¿ã¹ã¯ãæå®ããŸãã ãŸããç£èŠã®éå§åã«ã¢ããªã±ãŒã·ã§ã³ãåæ§ç¯ããŸãã次ã«ããã«ããã«ãã®åã«ã³ãã³ãã©ã€ã³åŒæ°ã解æãããããšãç¥ã£ãŠããŸãã
- _.eachïŒargv.appsã...ïŒ -åŒæ°ã§æå®ãããã¢ããªã±ãŒã·ã§ã³ãå埩åŠçããæ§æã§èšå®ã確èªããã¿ãŒã²ãããåéããŠå€æŽã芳å¯ããŸãã
- gulp.watchïŒtargetsã['build']ïŒ -ç£èŠãéå§ããå€æŽæã«ãã«ãã¿ã¹ã¯ãå®è¡ãããŸãã æ¬ ç¹ã1ã€ãããŸããè€æ°ã®ã¢ããªã±ãŒã·ã§ã³ã®ç£èŠãå®è¡ãããšãå€æŽããããšãã¹ãŠãåæ§ç¯ãããŸãããå®éã«ã¯ãè€æ°ã®ã¢ããªã±ãŒã·ã§ã³ãåæã«ç£èŠããå¿ èŠã¯ãªãïŒå®éã«ã¯ãªãïŒã®ã§ãæ°ã«ããŸããã
æèšãå®æããåŸã«çž®å°ããŠåçµã¿ç«ãŠãã-2çªç®ã®ããªãã¯
éçºããã»ã¹ã¯æ¬¡ã®ããã«ãªããŸãïŒ djangoéçºãµãŒããŒãèµ·åãã gulpãŠã©ãããèµ·åããããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ãäœæ/ãããã°ããŸãã ãããã£ãŠãéçºããã»ã¹èªäœã«ãããå®éã«ã¢ã»ã³ãã«ãããã¢ããªã±ãŒã·ã§ã³ãå€æŽãšãšãã«éçãã©ã«ããŒã«ããã«è¡šç€ºãããããã«ãªããå±éäžã«è¿œå ã®æé ãäžèŠã«ãªããŸãã ããããåé¡ã¯ãéçºãéåžž--devãã©ã¡ãŒã¿ãŒïŒçž®å°ãªãïŒã§å®è¡ãããçŸåšãå ¬åã§æ°åããµã€ãºã2ã¡ã¬ãã€ãã®çž®å°ãããŠããªãããã±ãŒãžã®çç£ãã³ãããããŠããããšã§ãäœããã®ãªãã€ã³ããŒãèãåºãå¿ èŠããããšæããŸãããããè¯ãèªååã
ãã®ãããç£èŠã¿ã¹ã¯ã«æ¬¡ã®ã³ãŒããç»å ŽããŸããã
// handle Ctrl+C and build a minified version on exit process.on('SIGINT', function() { if (!argv.dev) process.exit() argv.dev = false console.log() gutil.log(gutil.colors.yellow('Building a minified version...')) gulp.stop() gulp.start('build', function() { process.exit() }) })
- CTRL + Cããã£ããããŸãã
- æèšãçž®å°ãããŠèµ·åãããå ŽåãåçŽã«ããã»ã¹ãçµäºããŸãã
- argv.dev = false-次ã®ãã«ãã§å®åçšã®ããã±ãŒãžãåéã§ããããã«ãçž®å°çŠæ¢ããã£ã³ã»ã«ããŸãã
- gulp.stopïŒïŒ -çŸåšã®ãã¹ãŠã®ã¿ã¹ã¯ãå®äºããŸãã
- gulp.startïŒ 'build'ãfunctionïŒïŒ{...}ïŒ - ãã«ãã¿ã¹ã¯ãåŒã³åºããå®äºåŸã«çµäºããŸãã ããã§éåžžã«éèŠãªã®ã¯ãåè¿°ã®ãã«ãã¿ã¹ã¯ã§ãã«ãåŸã®ã³ãŒã«ããã¯ãæ£ããåŒã³åºãããããšã§ãããããªããšãããã±ãŒãžãéçãã©ã«ããŒã«ã³ããŒãããŠããã»ã¹ãçµäºããåã«ã¿ã¹ã¯ãçµäºããŸãã startã¡ãœããã¯ãå®éã«ã¯ãã®ã¡ãœããã§ã¯ãªããããgulpã®ããã¥ã¡ã³ãã«ã¯å«ãŸããŠããŸãããOrchestratorããç¶æ¿ãããŸããã
çµæã¯æ¬¡ã®ãšããã§ããgulpwatch --app appname --devãå®è¡ããã¢ããªã±ãŒã·ã§ã³ããããã°ããCTRL + CãæŒããŠç£èŠãåæ¢ãããšã gulpã¯ããã±ãŒãžã®çž®å°ããŒãžã§ã³ãããã«åéããŸãã ç§ãã¡ã¯çç£ã«ãããåŽåã®çµæãéãã«ã³ããããã楜ããã§ããŸãã
ãŸãšã
ãããã€ã¡ã³ãããã»ã¹äžã«å€æŽãå ããããšãªããå®çšŒåç°å¢ã«æ°ãã«äŸåããããšãªããjsã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã·ã¹ãã ãæã«å ¥ããŸããã ã³ãŒããã¢ãžã¥ãŒã«ã«åå²ããåºåã§1ã€ã®ã³ã³ãã¯ããã¡ã€ã«ãååŸã§ããŸããã ããã§ãjs-linterããã¹ããªã©ãè¿œå ã§ããŸãã
åæ§ã«ãããšãã°ã¹ã¿ã€ã«ãããã€ãã®ã¹ã¿ã€ã©ã¹ã«ç°¡åã«è»¢éããããããçž®å°ããããšãã§ããŸããã人éã®çç±ãèæ ®ããŠããŸã ããããŠããŸããã
èªãã§ãã ãã£ãçããããæž èŽããããšãããããŸããã
ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã§å®å šã«Gulpfile ã