37
Grunt で JavaScript ででで でででで2014.01.16 CTO 室 室室室

Gruntでjava script前作業の自動化!

Embed Size (px)

Citation preview

Page 1: Gruntでjava script前作業の自動化!

Gruntで JavaScript前作業の自動化!

2014.01.16CTO 室田中裕一

Page 2: Gruntでjava script前作業の自動化!

自己紹介

● 金融系 -> 組み込み系 -> SNS 系 -> ゲーム系 -> 広告系を経て DMMへ

● 得意分野はインフラからフロントエンドまで、本業は ServerSideエンジ

ニア。デザインは無理

● 大規模システムのアーキテクト、大規模データ基盤の構築周り

● DMMでは検索・リコメンド・行動解析まわりの研究開発やってます。

● 最近は java,hdfs,hive,python,nodejs,scala,erlang,spark,aerospike周りを

良く触ってます。

Page 3: Gruntでjava script前作業の自動化!

本日のお品書き1.どうして自動化するのか(10分)

● DMMで困っていた事は何か?● どこに時間を使うべきか?● 自動化のレイヤの確認● Gruntのおさらい

2.いきなり実践(30分)● Gruntの環境構築● 最初の Gruntfile.jsの作成● 複数の jsファイルを concatで結合する● jsファイルをminifyしてファイルサイズを小さくする● jsファイルをコピーして公開準備をする● yuidocを使ってリリース時に Documentを自動生成する● gjslintを使って CodeCheckを自動で行う● jsファイルの変更時に自動で処理するようにする● bower、 bower-installer、 Gruntを使って外部の jsを管理する

Page 4: Gruntでjava script前作業の自動化!

どうして自動化するのか ?

Page 5: Gruntでjava script前作業の自動化!

1.どうして自動化するのか1.どうして自動化するのか

● DMMで困っていた事は何か?● どこに時間を使うべきか?● 自動化のレイヤの確認● Gruntのおさらい

2.いきなり実践● Gruntの環境構築● 最初の Gruntfile.jsの作成● 複数の jsファイルを concatで結合する● jsファイルをminifyしてファイルサイズを小さくする● jsファイルをコピーして公開準備をする● yuidocを使ってリリース時に Documentを自動生成する● gjslintを使って CodeCheckを自動で行う● jsファイルの変更時に自動で処理するようにする● bower、 bower-installer、 Gruntを使って外部の jsを管理する

Page 6: Gruntでjava script前作業の自動化!

DMMで困ってた事は何か?

● jsファイルのminifyを忘れてリリース失敗する

● テストを作ったけど、忙しくなって誰も流さなくなる

● チェックスタイル作ったけど形骸化する

● リリース手順とかリリースする頃には忘れる

● リリース手順書が古くリリース手順通りにやったらリリース失敗する

● バグの修正5分で終わるのにリリースに 1時間かかる

リリースがリスキーで面倒 !

Page 7: Gruntでjava script前作業の自動化!

1.どうして自動化するのか1.どうして自動化するのか

● DMMで困っていた事は何か?● どこに時間を使うべきか?● 自動化のレイヤの確認● Gruntのおさらい

2.いきなり実践● Gruntの環境構築● 最初の Gruntfile.jsの作成● 複数の jsファイルを concatで結合する● jsファイルをminifyしてファイルサイズを小さくする● jsファイルをコピーして公開準備をする● yuidocを使ってリリース時に Documentを自動生成する● gjslintを使って CodeCheckを自動で行う● jsファイルの変更時に自動で処理するようにする● bower、 bower-installer、 Gruntを使って外部の jsを管理する

Page 8: Gruntでjava script前作業の自動化!

どこに時間を使うべきか?

● リリース・コンパイル等、繰り返し作業に人手を使わない

● ドキュメントの生成・コードチェック・テストは自動化

し、形骸化させない

● 特定の人しか出来ない作業を作らない

● 仕様書・手順書は最低限作り、設定ファイルをベースにす

気をつける(た)所

Page 9: Gruntでjava script前作業の自動化!

どこに時間を使うべきか?

● 1日数回のリリースも可能、しかも品質は一定

● 自動なので docs,コードチェック ,テストを意識しなくても良い

● ボタン押すだけなら誰(エンジニア以外)でも出来る

● 仕様書・手順書のメンテコストが無い

得られたメリットは何か?

機能開発・研究開発というエンジニアの本来の業務時間を作る

Page 10: Gruntでjava script前作業の自動化!

1.どうして自動化するのか1.どうして自動化するのか

● DMMで困っていた事は何か?● どこに時間を使うべきか?● 自動化のレイヤの確認● Gruntのおさらい

2.いきなり実践● Gruntの環境構築● 最初の Gruntfile.jsの作成● 複数の jsファイルを concatで結合する● jsファイルをminifyしてファイルサイズを小さくする● jsファイルをコピーして公開準備をする● yuidocを使ってリリース時に Documentを自動生成する● gjslintを使って CodeCheckを自動で行う● jsファイルの変更時に自動で処理するようにする● bower、 bower-installer、 Gruntを使って外部の jsを管理する

Page 11: Gruntでjava script前作業の自動化!

自動化レイヤの確認

● 今回の取り組み全体感

Page 12: Gruntでjava script前作業の自動化!

自動化レイヤの確認

● いろんなレイヤで自動化

● 今日の取り扱い

Page 13: Gruntでjava script前作業の自動化!

1.どうして自動化するのか1.どうして自動化するのか

● DMMで困っていた事は何か?● どこに時間を使うべきか?● 自動化のレイヤの確認● Gruntのおさらい

2.いきなり実践● Gruntの環境構築● 最初の Gruntfile.jsの作成● 複数の jsファイルを concatで結合する● jsファイルをminifyしてファイルサイズを小さくする● jsファイルをコピーして公開準備をする● yuidocを使ってリリース時に Documentを自動生成する● gjslintを使って CodeCheckを自動で行う● jsファイルの変更時に自動で処理するようにする● bower、 bower-installer、 Gruntを使って外部の jsを管理する

Page 14: Gruntでjava script前作業の自動化!

Gruntのおさらい

● jsのminify等の繰り返し作業の自動化

● Pluginを追加して機能を拡張

● Gruntを中心としたエコシステム

uglifycopy

concat

addad

d

Page 15: Gruntでjava script前作業の自動化!

いきなり実践

Page 16: Gruntでjava script前作業の自動化!

本日のお品書き1.どうして自動化するのか

● DMMで困っていた事は何か?● どこに時間を使うべきか?● 自動化のレイヤの確認● Gruntのおさらい

2.いきなり実践● Gruntの環境構築● 最初の Gruntfile.jsの作成● 複数の jsファイルを concatで結合する● jsファイルをminifyしてファイルサイズを小さくする● jsファイルをコピーして公開準備をする● yuidocを使ってリリース時に Documentを自動生成する● gjslintを使って CodeCheckを自動で行う● jsファイルの変更時に自動で処理するようにする● bower、 bower-installer、 Gruntを使って外部の jsを管理する

Page 17: Gruntでjava script前作業の自動化!

Gruntの環境構築

npm install -g grunt-climkdir hikarabo && cd hikarabonpm initnpm install grunt --save

1. grunt-cliをインストール

2. プロジェクトディレクトリを作って

3. npm initコマンドで package.jsonを作成

しています。

4. npmコマンドで gruntをインストール

※Node.jsのインストールは割愛します。

● package.json出来上がった

Page 18: Gruntでjava script前作業の自動化!

本日のお品書き1.どうして自動化するのか

● DMMで困っていた事は何か?● どこに時間を使うべきか?● 自動化のレイヤの確認● Gruntのおさらい

2.いきなり実践● Gruntの環境構築● 最初の Gruntfile.jsの作成● 複数の jsファイルを concatで結合する● jsファイルをminifyしてファイルサイズを小さくする● jsファイルをコピーして公開準備をする● yuidocを使ってリリース時に Documentを自動生成する● gjslintを使って CodeCheckを自動で行う● jsファイルの変更時に自動で処理するようにする● bower、 bower-installer、 Gruntを使って外部の jsを管理する

Page 19: Gruntでjava script前作業の自動化!

最初の Gruntfile.jsの作成今回扱うディレクトリ構造

1. build : minifyした js等、 output先2. out : Docsの吐き出し先3. public : リリース dir外部から参照される4. source : 大本になる jsファイル置き場

Page 20: Gruntでjava script前作業の自動化!

最初の Gruntfile.jsの作成module.exports = function(grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), }); grunt.registerTask('default','show logs',function(){ grunt.log.write('console log?').ok(); });};

1. Gruntfile.jsの名前で保存2. gruntコマンドで実行

Page 21: Gruntでjava script前作業の自動化!

本日のお品書き1.どうして自動化するのか

● DMMで困っていた事は何か?● どこに時間を使うべきか?● 自動化のレイヤの確認● Gruntのおさらい

2.いきなり実践● Gruntの環境構築● 最初の Gruntfile.jsの作成● 複数の jsファイルを concatで結合する● jsファイルをminifyしてファイルサイズを小さくする● jsファイルをコピーして公開準備をする● yuidocを使ってリリース時に Documentを自動生成する● gjslintを使って CodeCheckを自動で行う● jsファイルの変更時に自動で処理するようにする● bower、 bower-installer、 Gruntを使って外部の jsを管理する

Page 22: Gruntでjava script前作業の自動化!

複数の jsファイルを concatして結合する

module.exports = function(grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), concat:{ hikajs: { src: [ 'source/main.sample.js', 'source/main2.sample.js', ], dest: 'build/concat.hikarabo.js' } } }); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.registerTask('default',['concat:hikajs']); grunt.registerTask('default:concat', ['concat:hikajs']);

1. npmコマンドで pluginをインストール2. Gruntfile.jsを編集3. grunt又は grunt concatで実行

npm install grunt-contrib-concat --save

Page 23: Gruntでjava script前作業の自動化!

本日のお品書き1.どうして自動化するのか

● DMMで困っていた事は何か?● どこに時間を使うべきか?● 自動化のレイヤの確認● Gruntのおさらい

2.いきなり実践● Gruntの環境構築● 最初の Gruntfile.jsの作成● 複数の jsファイルを concatで結合する● jsファイルをminifyしてファイルサイズを小さくする● jsファイルをコピーして公開準備をする● yuidocを使ってリリース時に Documentを自動生成する● gjslintを使って CodeCheckを自動で行う● jsファイルの変更時に自動で処理するようにする● bower、 bower-installer、 Gruntを使って外部の jsを管理する

Page 24: Gruntでjava script前作業の自動化!

jsファイルをminifyしてファイルサイズを小さくする

module.exports = function(grunt) { grunt.initConfig({(略 ) uglify: { options: { banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n' }, build: { src: 'build/concat.hikarabo.js', dest: 'build/<%= pkg.name %>.min.js' } } }); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.registerTask('default',['concat:hikajs','uglify']); grunt.registerTask('default:concat', ['concat:hikajs']);

1. npmコマンドで pluginをインストール2. Gruntfile.jsを編集3. gruntで実行

npm install grunt-contrib-uglify --save

省略無しバージョン

Page 25: Gruntでjava script前作業の自動化!

本日のお品書き1.どうして自動化するのか

● DMMで困っていた事は何か?● どこに時間を使うべきか?● 自動化のレイヤの確認● Gruntのおさらい

2.いきなり実践● Gruntの環境構築● 最初の Gruntfile.jsの作成● 複数の jsファイルを concatで結合する● jsファイルをminifyしてファイルサイズを小さくする● jsファイルをコピーして公開準備をする● yuidocを使ってリリース時に Documentを自動生成する● gjslintを使って CodeCheckを自動で行う● jsファイルの変更時に自動で処理するようにする● bower、 bower-installer、 Gruntを使って外部の jsを管理する

Page 26: Gruntでjava script前作業の自動化!

jsファイルを copyして公開準備をする

module.exports = function(grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'),(略 ) copy:{ main: { src:'build/*.min.js', dest: 'public/js/' } } }); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-copy'); grunt.registerTask('default',['concat:hikajs','uglify','copy']); grunt.registerTask('default:concat', ['concat:hikajs']);};

1. npmコマンドで pluginをインストール2. Gruntfile.jsを編集3. gruntで実行

npm install grunt-contrib-copy --save

省略無しバージョン

Page 27: Gruntでjava script前作業の自動化!

本日のお品書き1.どうして自動化するのか

● DMMで困っていた事は何か?● どこに時間を使うべきか?● 自動化のレイヤの確認● Gruntのおさらい

2.いきなり実践● Gruntの環境構築● 最初の Gruntfile.jsの作成● 複数の jsファイルを concatで結合する● jsファイルをminifyしてファイルサイズを小さくする● jsファイルをコピーして公開準備をする● yuidocを使ってリリース時に Documentを自動生成する● gjslintを使って CodeCheckを自動で行う● jsファイルの変更時に自動で処理するようにする● bower、 bower-installer、 Gruntを使って外部の jsを管理する

Page 28: Gruntでjava script前作業の自動化!

yuidocを使ってリリース時に Documentを自動生成する

(略 )

yuidoc: {

compile: {

name: '<% pkg.name %>',

description: '<%= pkg.description %>',

version: '<%= pkg.version %>',

url: '<%= pkg.homepage %>',

options: {

paths: [

'source/'

],

outdir: 'out/'

}

(略 )

grunt.loadNpmTasks('grunt-contrib-yuidoc');

(略 )

grunt.registerTask('build', ['yuidoc']);

};

1. npmコマンドで yuidocをインストール

2. npmコマンドで pluginをインストール3. Gruntfile.jsを編集4. grunt buildで実行

npm install yuidocjs -gnpm install grunt-contrib-yuidoc --save

省略無しバージョン

Page 29: Gruntでjava script前作業の自動化!

本日のお品書き1.どうして自動化するのか

● DMMで困っていた事は何か?● どこに時間を使うべきか?● 自動化のレイヤの確認● Gruntのおさらい

2.いきなり実践● Gruntの環境構築● 最初の Gruntfile.jsの作成● 複数の jsファイルを concatで結合する● jsファイルをminifyしてファイルサイズを小さくする● jsファイルをコピーして公開準備をする● yuidocを使ってリリース時に Documentを自動生成する● gjslintを使って CodeCheckを自動で行う● jsファイルの変更時に自動で処理するようにする● bower、 bower-installer、 Gruntを使って外部の jsを管理する

Page 30: Gruntでjava script前作業の自動化!

gjslingを使って CodeCheckを自動で行う

(略 ) gjslint: { options: { flags: [ '--flagfile .gjslintrc' ], reporter: { name: 'console' } }, lib: { src: [ 'source/*.js' ] } }(略 )grunt.loadNpmTasks('grunt-gjslint'); grunt.registerTask('default',['gjslint','concat:hikajs','uglify','copy']);};

1. npmコマンドで pluginをインストール2. Gruntfile.jsを編集3. .gjslintrcを作成4. gruntで実行

npm install grunt-gjslint --save

省略無しバージョン

失敗時

成功時

.gjslintrc

Page 31: Gruntでjava script前作業の自動化!

本日のお品書き1.どうして自動化するのか

● DMMで困っていた事は何か?● どこに時間を使うべきか?● 自動化のレイヤの確認● Gruntのおさらい

2.いきなり実践● Gruntの環境構築● 最初の Gruntfile.jsの作成● 複数の jsファイルを concatで結合する● jsファイルをminifyしてファイルサイズを小さくする● jsファイルをコピーして公開準備をする● yuidocを使ってリリース時に Documentを自動生成する● gjslintを使って CodeCheckを自動で行う● jsファイルの変更時に自動で処理するようにする● bower、 bower-installer、 Gruntを使って外部の jsを管理する

Page 32: Gruntでjava script前作業の自動化!

jsファイルの変更時に自動で処理するようにする

(略 ) watch: { files: [ 'source/*.js', ], tasks: [ 'gjslint', 'concat:hikajs', 'uglify', 'copy', ] },(略 ) grunt.loadNpmTasks('grunt-contrib-watch');};

1. npmコマンドで pluginをインストール2. Gruntfile.jsを編集3. grunt watchを実行

npm install grunt-contrib-watch --save

省略無しバージョン

Page 33: Gruntでjava script前作業の自動化!

本日のお品書き1.どうして自動化するのか

● DMMで困っていた事は何か?● どこに時間を使うべきか?● 自動化のレイヤの確認● Gruntのおさらい

2.いきなり実践● Gruntの環境構築● 最初の Gruntfile.jsの作成● 複数の jsファイルを concatで結合する● jsファイルをminifyしてファイルサイズを小さくする● jsファイルをコピーして公開準備をする● yuidocを使ってリリース時に Documentを自動生成する● gjslintを使って CodeCheckを自動で行う● jsファイルの変更時に自動で処理するようにする● bower、 bower-installer、 Gruntを使って外部の jsを管理する

Page 34: Gruntでjava script前作業の自動化!

bower,bower-installer,gruntを使って外部の jsを管理する

● webAppは様々な framework,libraryで構成されている

● bowerはそれら packageの管理をする

● Bower+gruntで外部 packageの管理も自動化

Page 35: Gruntでjava script前作業の自動化!

Bowerの準備と jQueryのインストール

1. npmコマンドで Bowerをインストール

2. bower initを実行3. bowerで jqueryをインストール

npm install bower -gbower initbower install jqeury --save

{ "name": "hikarabo", "version": "0.0.0", "authors": [ "tanaka-yuichi <[email protected]>" ],(略)

bower.json出来上がった

Page 36: Gruntでjava script前作業の自動化!

Bower-installerの準備と公開ディレクトリへのデプロイ

1. npmコマンドで Bower-installerをインストール

2. bower.jsonに installセクションを追加3. bower-installerを実行

npm install bower-installer -g

(略)

"dependencies": { "jquery": "~2.1.3" }, "install":{ "path":{ "js":"public/js" }, "sources":{ "jquery":"bower_components/jquery/dist/jquery.min.js" } }}

jqueryのデプロイを追加した bower.json

Page 37: Gruntでjava script前作業の自動化!

以上。