備忘録

忘れそうなこと色々

Windows gulp環境構築メモ

ざっくり初期設定

・rubyインストール

・node.jsインストール

・npm install -g gulp -> グローバルにgulpインストール

・workディレクトリ移動

・npm init -> package.json作成

あとはpackage.jsonとgulpfile.js置いたり編集したりして

npm install

gulp

でオッケー

rubyもnodeもインストーラでインストールして、最初はパスも通ってたのに再起動したら環境変数が消えてハマった。

手作業で設定しなおすはめに・・・

ユーザ環境変数

NODE_PATH : node.exeがあるディレクトリを指定

システム環境変数のPath

・node.exeがあるディレクトリ

・rubyインストールしたディレクトリ¥bin

・ユーザ¥ユーザ名¥AppData¥Roaming¥npm

設定ファイルは最終的にこんな感じ

package.json

{
	"name": "chorolling",
	"version": "1.0.0",
	"description": "chorolling",
	"dependencies": {},
	"devDependencies": {
		"babel-loader": "^6.2.5",
		"babel-preset-es2015": "^6.13.2",
		"babel-preset-es2015-loose": "^7.0.0",
		"babel-preset-react": "^6.11.1",
		"gulp": "^3.9.1",
		"gulp-autoprefixer": "^3.1.1",
		"gulp-notify": "^2.2.0",
		"gulp-plumber": "^1.1.0",
		"gulp-pug": "^3.0.4",
		"gulp-stylus": "^2.5.0",
		"gulp-watch": "^4.3.9",
		"gulp-webpack": "^1.5.0"
	}
}

gulpfile.js

var conf = require('./config.js');
var gulp = require('gulp');
var watch = require('gulp-watch');
var pug = require('gulp-pug');
var stylus = require('gulp-stylus');
var nib = require('nib');
var autoprefixer = require('gulp-autoprefixer');
var webpack = require('gulp-webpack');
var notify = require('gulp-notify');
var plumber = require('gulp-plumber');
var fs = require('fs');
var path = require('path');


// ----------------------------------------- PUG
gulp.task('pug', () => {
	gulp.src([
		conf.path.src+'[^_]*.pug',
		conf.path.src+'[^_]**/[^_]*.pug',
		conf.path.src+'[^_]**/[^_]**/[^_]*.pug',
		conf.path.src+'[^_]**/[^_]**/[^_]**/[^_]*.pug'
	])
	.pipe(plumber({
	errorrrorHandler: notify.onError("Error: <%= error.message %>")
	}))
	.pipe(pug({
		pretty: true
	}))
	.pipe(gulp.dest(conf.path.dest))
	.pipe(notify('Complete: <%= file.relative %>'))
});

// ----------------------------------------- STYLUS
gulp.task('stylus', () => {
	gulp.src([
		conf.path.src+'[^_]*.styl',
		conf.path.src+'[^_]**/[^_]*.styl',
		conf.path.src+'[^_]**/[^_]**/[^_]*.styl',
		conf.path.src+'[^_]**/[^_]**/[^_]**/[^_]*.styl'
	])
	.pipe(plumber({
		errorHandler: notify.onError("Error: <%= error.message %>")
	}))
	.pipe(stylus({
		use: [nib()],
		compress: true,
		linenos: false
	}))
	.pipe(autoprefixer({
		browsers: [
			'last 2 versions',
			'ie >= 9',
			'iOS >= 7',
			'Android >= 2'
		],
		cascade: false
	}))
	.pipe(gulp.dest(conf.path.dest))
	.pipe(notify('Complete: <%= file.relative %>'))
});

// ----------------------------------------- WEBPACK

(() => {
	var webpack_conf = {
		cache: true,
		entry: {},
		output: {
			'filename': '[name]'
		},
		resolve: {
			extensions: ['', '.js'],
		root: [
			path.resolve(conf.path.src + '**/js/class/'),
		],
		modulesDirectories: ['node_modules'],
			alias: {
				'node': path.resolve('node_modules/')
			}
		},
		module: {
			loaders: [{
				test: /.js$/,
				exclude: /(node_modules|bower_components)/,
				loader: path.resolve('node_modules/babel-loader'),
				query:{
					presets: [path.resolve('node_modules/babel-preset-react'), 
					path.resolve('node_modules/babel-preset-es2015'), 
					path.resolve('node_modules/babel-preset-es2015-loose')]
				}
			}]
		}
	};

	setEntryPoint(conf.path.src, webpack_conf['entry'], conf.path.src);

	gulp.task('webpack', function() {
		gulp.src([
			conf.path.src+'[^_]*.js',
			conf.path.src+'[^_]**/[^_]*.js',
			conf.path.src+'[^_]**/[^_]**/[^_]*.js',
			conf.path.src+'[^_]**/[^_]**/[^_]**/[^_]*.js'
		])
		.pipe(plumber({
			errorHandler: notify.onError("Error: <%= error.message %>")
		}))
		.pipe(webpack(webpack_conf))
		.pipe(gulp.dest(conf.path.dest))
		.pipe(notify('Complete: <%= file.relative %>'))
	});
})();

function setEntryPoint(_path, _arr, _work) {
	fs.readdir(_path, function(e, f) {
		if (e) {
			throw e;
		}
		for (var key in f) {
			if (fs.statSync(_path + f[key]).isDirectory() && 
				!f[key].match(/class/) && !f[key].match(/_data/)) {
				setEntryPoint(_path + f[key] + '/', _arr, _work);
			} else if(f[key].match(/.js$/)) {
				_arr[(_path + f[key]).replace(_work, '')] = _path + f[key];
			}
		}
	});
}


gulp.task('watch', () => {
	watch(conf.path.src+'[^_]**/[^_]*.styl', () => {
		gulp.start(['stylus']);
	});

	watch(conf.path.src+'[^_]**/[^_]*.pug', () => {
		gulp.start(['pug']);
	});

	watch(conf.path.src+'[^_]**/[^_]*.js', () => {
		gulp.start(['webpack']);
	});
})

gulp.task('default', ['watch']);


config.js

module.exports = {
	'path': {
		'src': './_src/',
		'dest': '../'
	}
}

本当はtaskごとにjsファイル分けて読み込んだほうが管理しやすいんだろうけど、一刻もはやく始めたかったのでベタ書き。

webpackの設定ももうちょっと良い書き方があると思うけど一旦待機。一応動くし。

せめてconfigくらいは分けようと思って別ファイル用意したけど結局パスしか書いてない。えへへ。

あとワイルドカードが苦手すぎてsrcがめちゃくちゃダサいんだけどいい書き方ないだろうか・・・イケてる書き方あったら教えてください・・・