Introduction to Grunt.js on Taiwan JavaScript Conference

Bo-Yi Wu
Bo-Yi WuFull Stack & DevOps Engineer at MediaTek
你不可不知的前端開發工具
2013 JavaScript Conference 5/18,19
2013 JSDC 2
Who am I
Bo-Yi Wu
@appleboy
http://blog.wu-boy.com
https://github.com/appleboy
任職於瑞昱半導體RealTek(IC Design House)
- TV 多媒體部門
- Backbone.js, CodeIgniter, Larvel Node.js, MongoDB, Mariadb
MySQL, Twitter Bootstrap, Handlebars.js, HAProxy for load
balancer, Galera Cluster for MySQL ...
2013 JSDC 3
工欲善其事 , 必先利其器
2013 JSDC 4
昨天 UP Chen 講了七的工具
2013 JSDC 5
今天來聊聊程式相關套件工具
2013 JSDC 6
寫後端程式不再是
PHP,Ruby,Pyhton.. 等專屬
我們可以用我們可以用 Node.jsNode.js 取而代之取而代之
2013 JSDC 7
Node.js 發行速度快 API 常常更新
2013 JSDC 8
該如何管理該如何管理 Node.jsNode.js 版本
2013 JSDC 9
Node Version Manager: nvmnvm
https://github.com/creationix/nvm
2013 JSDC 10
How to use?
2013 JSDC 11
How to use
●
nvm install 0.10.5
●
nvm ls
●
nvm ls-remote
●
nvm use 0.10.5
●
nvm install stable (support from my github)
●
nvm install latest (support from my github)
https://github.com/appleboy/nvm
2013 JSDC 12
前端工程師會接觸到
JS,CSS,htmlJS,CSS,html
2013 JSDC 13
先來看看一般專案首頁
index.html
2013 JSDC 14
2013 JSDC 15
看看 header 載入哪些檔案
2013 JSDC 16
Popular Open Source
Normalize.css
2013 JSDC 17
升級套件版本很頭痛
2013 JSDC 18
如果載入了 10 個套件
就必須手動更新 10 次
2013 JSDC 19
引入套件管理程式
2013 JSDC 20
package manager for the web: BowerBower
http://bower.io/
2013 JSDC 21
定義下載路徑設定: .bowerrc
2013 JSDC 22
{
'directory': 'assets/vendor',
'json': 'component.json'
}
2013 JSDC 23
定義專案套件需求: component.json
$ bower install <pkg>#<version>
2013 JSDC 24
{
"name": "html5-template-engine",
"version": "1.0.0",
"dependencies": {
"jquery": "~1.9.1",
"normalize-scss": "~2.1.1",
"modernizr": "~2.6.2",
"requirejs": "~2.1.5"
}
}
2013 JSDC 25
以後不必擔心套件版本問題
2013 JSDC 26
JavaScript 產生器:CoffeeScript
2013 JSDC 27
為什麼要使用 CoffeeScript
2013 JSDC 28
Why Use CoffeeScript?
●
解決 JavaScript Coding Style 問題
– 讓 Javascript 看起來像是同一個人寫的
●
通過 Javascript Lint 測試
– http://www.javascriptlint.com/
2013 JSDC 29
不用再宣告 var 變數
CoffeeScript
# Assignment:
number = 42
opposite = true
JavaScript
var number, opposite;
number = 42;
opposite = true;
2013 JSDC 30
不用再使用任何括號
CoffeeScript
# Conditions:
number = -42 if opposite
# Functions:
square = (x) -> x * x
JavaScript
if (opposite) {
number = -42;
}
square = function(x) {
return x * x;
};
2013 JSDC 31
coffee -b -w -c -o assets/js assets/coffee
2013 JSDC 32
CSS 產生器 :Compass
2013 JSDC 33
為什麼要使用 compass
2013 JSDC 34
Why Use Compass?
●
解決跨瀏覽器 CSS Hack
– IE 瀏覽器還是要手動 Hack
●
支援 CSS Sprite
– 不需要靠 designer 合併圖檔 , 減少 network
request
●
撰寫 CSS3 非常容易
– Box, Shadow, Border Radius, Text Shadow.. etc
●
可自行定義 function, Variable … etc.
2013 JSDC 35
SCSS/SASS 選擇
Scss 跟 CSS 長的一樣
Sass 對於設計師而言很難學
2013 JSDC 36
無痛轉移原有 CSS 架構
Sass-convert -F css -T scss your.css new.css
Sass-convert -F css -R css_folder_path
2013 JSDC 37
隨時監控 scss 狀態
compass watch scss_folder_path
2013 JSDC 38
Make CSS3 so Easy
2013 JSDC 39
Border radius
SCSS
#border-radius {
@include border-radius(25px);
}
CSS
#border-radius {
-webkit-border-radius: 25px;
-moz-border-radius: 25px;
-ms-border-radius: 25px;
-o-border-radius: 25px;
border-radius: 25px;
}
2013 JSDC 40
Box-shadow
SCSS
#box-shadow-default {
@include single-box-shadow;
}
CSS
#box-shadow-default {
-webkit-box-shadow: 0px
0px 5px #333333;
-moz-box-shadow: 0px 0px
5px #333333;
box-shadow: 0px 0px 5px
#333333;
}
2013 JSDC 41
Compass Assets 設定
config.rb
2013 JSDC 42
background-image
2013 JSDC 43
config.rb: images path
SCSS
#logo {
backgroung-image: image-
url('logo.png');
}
CSS
http_path = "/"
relative_assets = true
#logo {
backgroung-image:
url('../images/logo.png?
1293690212');
}
2013 JSDC 44
config.rb: images path
SCSS
#logo {
backgroung-image: image-
url('logo.png');
}
CSS
http_path = "/"
relative_assets = false
#logo {
backgroung-image:
url('/images/logo.png?
1293690212');
}
2013 JSDC 45
inline-image
2013 JSDC 46
config.rb: images path
SCSS
#logo {
backgroung-image: inline-
image('logo.png');
}
CSS
#logo {
backgroung-image:
url('data:image/png;base64,xx
xxxxxxxx');
}
2013 JSDC 47
Image-Sprites
Ref: google sprites
2013 JSDC 48
Image-Sprites
SCSS
@import "my-icons/*.png";
@include all-my-icons-sprites;
CSS
.my-icons-sprite,my-icons-
edit, .my-icons-save
{ background: url('/images/my-
icons-s34fe0604ab.png') no-
repeat; }
.my-icons-edit { background-
position: 0 0; }
.my-icons-save { background-
position: 0 -32px; }
2013 JSDC 49
JavaScritp模組工具:RequireJS
2013 JSDC 50
為什麼要使用 RequireJS
2013 JSDC 51
2013 JSDC 52
網站 include 超多外部套件
2013 JSDC 53
每個套件都有相依性問題
2013 JSDC 54
RequireJS 解決相依性問題
2013 JSDC 55
main.js
2013 JSDC 56
app.js
2013 JSDC 57
<script data-main="js/main" src="js/require.js"></script>
取代全部 javascript tag
2013 JSDC 58
index.html
2013 JSDC 59
RequireJS 只有這樣而已?
2013 JSDC 60
作者另外開發的編譯工具:r.js
https://github.com/jrburke/r.js/
2013 JSDC 61
使用前
2013 JSDC 62
使用後
r.js -o build/app.build.js
2013 JSDC 63
前端必備工具 : Livereload
http://livereload.com/
2013 JSDC 64
雙螢幕寫程式必備工具
2013 JSDC 65
每天按 Ctrl+F5 至少 100 次
保守估計
2013 JSDC 66
Guardfile 設定檔
2013 JSDC 67
# A sample Guardfile
# More info at
https://github.com/guard/guard#readme
guard 'livereload' do
watch(%r{app/.+.(html|htm)$})
watch(%r{app/assets/css/.+.css})
watch(%r{app/assets/js/.+.js})
watch(%r{app/assets/templates/.+.handlebars})
end
2013 JSDC 68
簡易Web Server: Node Express
http://expressjs.com/
2013 JSDC 69
不需要安裝Apache,Nginx,lighttpd
http://expressjs.com/
2013 JSDC 70
var app, express, fs, port;
fs = require('fs');
express = require('express');
app = express();
port = 4000;
app.use(express["static"](__dirname + '/'));
app.use(express.directory(__dirname + '/'));
app.use(express.errorHandler());
app.use(function(req, res, next) {
console.log('%s %s', req.method, req.url);
return next();
});
app.use(app.router);
app.listen(port);
console.log('Server listening on http://localhost:' + port);
2013 JSDC 71
上述工具重點整理
2013 JSDC 72
Bower, Compass ...
●
bower install
●
compass watch .
●
coffee -b -w -c -o js/ coffeescript/
●
r.js -o build/app.build.js
●
node build/server.js
●
guard start
2013 JSDC 73
指令有點多有點雜
2013 JSDC 74
寫成 Makefile 執行
2013 JSDC 75
build:
r.js -o build/app.build.js
compass:
compass watch .
coffee:
coffee -b -w -c -o js/ coffeescript/
livereload:
guard start
all: compass coffee livereload
2013 JSDC 76
好像有好一點?
2013 JSDC 77
但是對 Windows 開發環境 ?
2013 JSDC 78
2013 JSDC 79
What is Fucking Makefile?
WTF
2013 JSDC 80
為了解決環境相容問題
2013 JSDC 81
JavaScript Task Runner
Grunt.js
2013 JSDC 82
Why Use Grunt.js
●
Define Task Runner
– Initial Project
– Deploy Project
– Unit Test Project
●
Designer Don't learning command line
●
Many Available Grunt plugins
– CoffeeScript, Compass, Jade, Require.js
– Twitter Bower, JSHint, CSSMin, Livereload
2013 JSDC 83
Grunt 0.4.x requires Node.js version >= 0.8.0.
npm uninstall -g grunt
npm install -g grunt-cli
Grunt 0.4.x requires Node.js version >= 0.8.0.
2013 JSDC 84
How the Grunt CLI works?
2013 JSDC 85
package.json && Gruntfile.js
2013 JSDC 86
package.json
npm init建立此檔案
npm install grunt-cli --save-dev
npm init建立此檔案
2013 JSDC 87
Gruntfile.js or Gruntfile.coffee
grunt.js for 0.3.x versions of Grunt.
2013 JSDC 88
Gruntfile.js 包含底下項目
●
The "wrapper" function
●
Project and task configuration
– compass, require.js, bower, shell …. etc.
●
Loading grunt plugins and tasks
●
Custom tasks
– Deploy, Clean, Build project … etc.
2013 JSDC 89
開始撰寫 Gruntfile.js
2013 JSDC 90
The "wrapper" function
2013 JSDC 91
module.exports = function(grunt) {
// Do grunt-related things in here
};
2013 JSDC 92
Project and task configuration
2013 JSDC 93
grunt.initConfig({
pkg: project_config,
shell: {
bower: {
command: 'node node_modules/.bin/bower install',
options: {
stdout: true,
stderr: true,
callback: function(err, stdout, stderr, cb) {
console.log('Install bower package compeletely.');
return cb();
}
}
}
}
});
2013 JSDC 94
Loading grunt plugins and tasks
2013 JSDC 95
grunt.loadNpmTasks('grunt-shell');
2013 JSDC 96
Custom tasks
2013 JSDC 97
// Default task(s).
grunt.registerTask('default', ['connect', 'watch']);
// Deploy task(s).
grunt.registerTask('release', ['htmlmin', 'cssmin']);
2013 JSDC 98
Working with an existing grunt project
2013 JSDC 99
An existing grunt project
●
Change to the project's root directory.
●
Install project dependencies with npm
install.
●
Run Grunt with grunt.
2013 JSDC 100
用 Grunt 整合今日介紹工具
2013 JSDC 101
package manager: BowerBower
http://bower.io/
https://github.com/yatskevich/grunt-bower-task
2013 JSDC 102
Bower 只會在專案初始化執行
2013 JSDC 103
bower: {
install: {
options: {
cleanup: false,
install: true,
verbose: true,
copy: false
}
}
}
2013 JSDC 104
bower: {
cleanup: {
options: {
cleanup: true,
install: false,
verbose: true,
copy: false
}
}
}
2013 JSDC 105
$ grunt bower:install
$ grunt bower:cleanup
2013 JSDC 106
JavaScript 產生器:CoffeeScript
https://github.com/gruntjs/grunt-contrib-coffee
2013 JSDC 107
coffee: {
dev: {
expand: true,
cwd: 'app/assets/coffee/',
src: ['**/*.coffee'],
dest: 'app/assets/js/',
ext: '.js',
options: {
bare: true
}
}
}
2013 JSDC 108
$ grunt coffee:dev
2013 JSDC 109
CSS 產生器 :Compass
2013 JSDC 110
不需要 config.rb 設定檔
2013 JSDC 111
compass: {
dev: {
options: {
sassDir: 'app/assets/sass',
cssDir: 'app/assets/css',
imagesDir: 'app/assets/images',
javascriptsDir: 'app/assets/js',
outputStyle: 'nested',
relativeAssets: true,
noLineComments: true,
environment: 'development'
}
}
}
2013 JSDC 112
$grunt compass:dev
2013 JSDC 113
前端必備工具 : Livereload
http://livereload.com/
https://github.com/gruntjs/grunt-contrib-livereload
2013 JSDC 114
Setup Server
https://github.com/gruntjs/grunt-contrib-connect
2013 JSDC 115
connect: {
livereload: {
options: {
hostname: '0.0.0.0',
port: 3000,
base: '.'
}
}
}
2013 JSDC 116
Run tasks whenever watched files change.
https://github.com/gruntjs/grunt-contrib-livereload
2013 JSDC 117
regarde: {
html: {
files: ['app/**/*.{html,htm}'],
tasks: ['livereload']
},
scss: {
files: ['app/**/*.scss'],
tasks: ['compass:dev']
},
css: {
files: ['app/**/*.css'],
tasks: ['livereload']
},
js: {
files: 'app/**/*.js',
tasks: ['livereload']
},
coffee: {
files: '**/*.coffee',
tasks: ['coffee']
}
}
2013 JSDC 118
grunt.registerTask('init', ['livereload-start', 'connect', 'regarde'])
$ grunt init
2013 JSDC 119
2013 JSDC 120
專案開發環境講完
2013 JSDC 121
Deploy Your Project
2013 JSDC 122
這不是後端工程師該做的嘛?
2013 JSDC 123
很抱歉台灣老闆不是這樣想
2013 JSDC 124
Ref: http://goo.gl/PKIr4
2013 JSDC 125
Before Deploying Project
●
JavaScript Minify and Combine (requirejs)
●
CSS Minify (cssmin)
●
Html Minify (htmlmin)
●
Remove unnecessary files (clean)
●
Copy files (copy)
2013 JSDC 126
JavaScript Minify and Combine
https://github.com/asciidisco/grunt-requirejs
2013 JSDC 127
requirejs: {
  release: {
    options: {
      appDir: "app/",
      baseUrl: "assets/js/",
      dir: "public",
      name: "main",
      mainConfigFile: 'app/assets/js/main.js',
      preserveLicenseComments: false,
      fileExclusionRegExp: /^(.|node_modules)/,
      paths: {
        jquery: '../vendor/jquery/jquery'
      }
    }
  }
}
2013 JSDC 128
$ grunt requirejs:release
2013 JSDC 129
CSS Minify
https://github.com/gruntjs/grunt-contrib-cssmin
2013 JSDC 130
cssmin: {
release: {
report: 'gzip',
expand: true,
cwd: 'app/assets/css',
src: ['*.css'],
dest: 'app/assets/css'
}
}
2013 JSDC 131
$ grunt cssmin:release
2013 JSDC 132
Html Minify
https://github.com/gruntjs/grunt-contrib-htmlmin
2013 JSDC 133
htmlmin: {
options: {
removeComments: true,
collapseWhitespace: true
},
release: {
files: {
'public/index.html': 'app/index.html'
}
}
}
2013 JSDC 134
$ grunt htmlmin:release
2013 JSDC 135
Remove unnecessary files
https://github.com/gruntjs/grunt-contrib-clean
2013 JSDC 136
clean: {
options: {
force: true
},
release: ['app/assets/coffee',
'app/.sass-cache']
}
2013 JSDC 137
$ grunt clean:release
2013 JSDC 138
Copy files
https://github.com/gruntjs/grunt-contrib-copy
2013 JSDC 139
copy: {
release: {
files: [
{
src: 'app/js/main-built.js',
dest: 'public/js/20130519.js'
}
]
}
}
2013 JSDC 140
$ grunt copy:release
2013 JSDC 141
今日所有整合都在 Github
https://github.com/appleboy/html5-template-engine
2013 JSDC 142
Html5 Template Engine
https://github.com/appleboy/html5-template-engine
2013 JSDC 143
Features
●
The latest html5boilerplate.com source code
●
Includes Normalize.scss v2.1.x and v1.1.x.
●
The latest jQuery and Modernizr.
●
Support CoffeeScript, RequireJS, Compass
●
A lightweight web server listen to 3000 port
●
Support JavaScript Task Runner GruntJS
●
Support JavaScript test framework Mocha
2013 JSDC 144
歡迎Fork 打造自己的開發環境
https://github.com/appleboy/html5-template-engine
2013 JSDC 145
另外有 Backbone 開發環境
https://github.com/appleboy/backbone-template-engine
2013 JSDC 146
兩個 Repository 差異在哪?
https://github.com/appleboy/backbone-template-engine
2013 JSDC 147
Backbone.js+Handlebar.js
https://github.com/appleboy/backbone-template-engine
2013 JSDC 148
或者你只需要minify html css javascript
2013 JSDC 149
可以參考Shell Script: Minify tool
https://github.com/appleboy/minify-tool
2013 JSDC 150
Features
●
JavaScript compressor: UglifyJS
●
CSS compressor: Sqwish
●
Html compressor: htmlcompressor
●
Optimize images: image_optim
2013 JSDC 151
$ minify (folder|file)_path
2013 JSDC 152
Live Demo
2013 JSDC 153
謝謝大家及工作團隊
1 of 153

Recommended

How to integrate front end tool via gruntjs by
How to integrate front end tool via gruntjsHow to integrate front end tool via gruntjs
How to integrate front end tool via gruntjsBo-Yi Wu
4.8K views104 slides
Gearman work queue in php by
Gearman work queue in phpGearman work queue in php
Gearman work queue in phpBo-Yi Wu
8.6K views102 slides
Frontend JS workflow - Gulp 4 and the like by
Frontend JS workflow - Gulp 4 and the likeFrontend JS workflow - Gulp 4 and the like
Frontend JS workflow - Gulp 4 and the likeDamien Seguin
1.9K views52 slides
Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp by
Optimising Your Front End Workflow With Symfony, Twig, Bower and GulpOptimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Optimising Your Front End Workflow With Symfony, Twig, Bower and GulpMatthew Davis
52.6K views144 slides
Automating your workflow with Gulp.js by
Automating your workflow with Gulp.jsAutomating your workflow with Gulp.js
Automating your workflow with Gulp.jsBo-Yi Wu
10.9K views94 slides
Grunt & Front-end Workflow by
Grunt & Front-end WorkflowGrunt & Front-end Workflow
Grunt & Front-end WorkflowPagepro
739 views58 slides

More Related Content

What's hot

Automating Large Applications on Modular and Structured Form with Gulp by
Automating Large Applications on Modular and Structured Form with GulpAutomating Large Applications on Modular and Structured Form with Gulp
Automating Large Applications on Modular and Structured Form with GulpAnderson Aguiar
5.7K views73 slides
JCConf 2015 workshop 動手玩 Java 專案建置工具 by
JCConf 2015 workshop 動手玩 Java 專案建置工具JCConf 2015 workshop 動手玩 Java 專案建置工具
JCConf 2015 workshop 動手玩 Java 專案建置工具謝 宗穎
2.8K views38 slides
Live deployment, ci, drupal by
Live deployment, ci, drupalLive deployment, ci, drupal
Live deployment, ci, drupalAndrii Podanenko
3.4K views20 slides
"How to Use Bazel to Manage Monorepos: The Grammarly Front-End Team’s Experie... by
"How to Use Bazel to Manage Monorepos: The Grammarly Front-End Team’s Experie..."How to Use Bazel to Manage Monorepos: The Grammarly Front-End Team’s Experie...
"How to Use Bazel to Manage Monorepos: The Grammarly Front-End Team’s Experie...Fwdays
445 views54 slides
When Web meet Native App by
When Web meet Native AppWhen Web meet Native App
When Web meet Native AppYu-Wei Chuang
14.6K views44 slides
Automated acceptance test by
Automated acceptance testAutomated acceptance test
Automated acceptance testBryan Liu
1.2K views51 slides

What's hot(20)

Automating Large Applications on Modular and Structured Form with Gulp by Anderson Aguiar
Automating Large Applications on Modular and Structured Form with GulpAutomating Large Applications on Modular and Structured Form with Gulp
Automating Large Applications on Modular and Structured Form with Gulp
Anderson Aguiar5.7K views
JCConf 2015 workshop 動手玩 Java 專案建置工具 by 謝 宗穎
JCConf 2015 workshop 動手玩 Java 專案建置工具JCConf 2015 workshop 動手玩 Java 專案建置工具
JCConf 2015 workshop 動手玩 Java 專案建置工具
謝 宗穎2.8K views
"How to Use Bazel to Manage Monorepos: The Grammarly Front-End Team’s Experie... by Fwdays
"How to Use Bazel to Manage Monorepos: The Grammarly Front-End Team’s Experie..."How to Use Bazel to Manage Monorepos: The Grammarly Front-End Team’s Experie...
"How to Use Bazel to Manage Monorepos: The Grammarly Front-End Team’s Experie...
Fwdays445 views
When Web meet Native App by Yu-Wei Chuang
When Web meet Native AppWhen Web meet Native App
When Web meet Native App
Yu-Wei Chuang14.6K views
Automated acceptance test by Bryan Liu
Automated acceptance testAutomated acceptance test
Automated acceptance test
Bryan Liu1.2K views
60分鐘完送百萬edm,背後雲端ci/cd實戰大公開 by KAI CHU CHUNG
60分鐘完送百萬edm,背後雲端ci/cd實戰大公開60分鐘完送百萬edm,背後雲端ci/cd實戰大公開
60分鐘完送百萬edm,背後雲端ci/cd實戰大公開
KAI CHU CHUNG2.5K views
Automate Your Automation | DrupalCon Vienna by Pantheon
Automate Your Automation | DrupalCon ViennaAutomate Your Automation | DrupalCon Vienna
Automate Your Automation | DrupalCon Vienna
Pantheon479 views
React Native in Production by Seokjun Kim
React Native in ProductionReact Native in Production
React Native in Production
Seokjun Kim1.4K views
JHipster Conf 2018 : Connect your JHipster apps to the world of APIs with Ope... by chbornet
JHipster Conf 2018 : Connect your JHipster apps to the world of APIs with Ope...JHipster Conf 2018 : Connect your JHipster apps to the world of APIs with Ope...
JHipster Conf 2018 : Connect your JHipster apps to the world of APIs with Ope...
chbornet2.1K views
行動應用開發實務 - Gradle 介紹 by Kyle Lin
行動應用開發實務 - Gradle 介紹行動應用開發實務 - Gradle 介紹
行動應用開發實務 - Gradle 介紹
Kyle Lin1K views
Bower & Grunt - A practical workflow by Riccardo Coppola
Bower & Grunt - A practical workflowBower & Grunt - A practical workflow
Bower & Grunt - A practical workflow
Riccardo Coppola5.8K views
Deploying 3 times a day without a downtime @ Rocket Tech Summit in Berlin by Alessandro Nadalin
Deploying 3 times a day without a downtime @ Rocket Tech Summit in BerlinDeploying 3 times a day without a downtime @ Rocket Tech Summit in Berlin
Deploying 3 times a day without a downtime @ Rocket Tech Summit in Berlin
Grunt.js and Yeoman, Continous Integration by David Amend
Grunt.js and Yeoman, Continous IntegrationGrunt.js and Yeoman, Continous Integration
Grunt.js and Yeoman, Continous Integration
David Amend30.8K views
How we maintain 200+ Drupal sites in Georgetown University by Ovadiah Myrgorod
How we maintain 200+ Drupal sites in Georgetown UniversityHow we maintain 200+ Drupal sites in Georgetown University
How we maintain 200+ Drupal sites in Georgetown University
Ovadiah Myrgorod2.5K views
Gradle - time for a new build by Igor Khotin
Gradle - time for a new buildGradle - time for a new build
Gradle - time for a new build
Igor Khotin6.2K views

Viewers also liked

PHP & JavaScript & CSS Coding style by
PHP & JavaScript & CSS Coding stylePHP & JavaScript & CSS Coding style
PHP & JavaScript & CSS Coding styleBo-Yi Wu
8.3K views102 slides
Write microservice in golang by
Write microservice in golangWrite microservice in golang
Write microservice in golangBo-Yi Wu
14.8K views126 slides
Introduction to MVC of CodeIgniter 2.1.x by
Introduction to MVC of CodeIgniter 2.1.xIntroduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.xBo-Yi Wu
11.1K views80 slides
Git flow 與團隊合作 by
Git flow 與團隊合作Git flow 與團隊合作
Git flow 與團隊合作Bo-Yi Wu
11.2K views52 slides
Why to choose laravel framework by
Why to choose laravel frameworkWhy to choose laravel framework
Why to choose laravel frameworkBo-Yi Wu
8.4K views34 slides
用 Docker 改善團隊合作模式 by
用 Docker 改善團隊合作模式用 Docker 改善團隊合作模式
用 Docker 改善團隊合作模式Bo-Yi Wu
7.2K views71 slides

Viewers also liked(20)

PHP & JavaScript & CSS Coding style by Bo-Yi Wu
PHP & JavaScript & CSS Coding stylePHP & JavaScript & CSS Coding style
PHP & JavaScript & CSS Coding style
Bo-Yi Wu8.3K views
Write microservice in golang by Bo-Yi Wu
Write microservice in golangWrite microservice in golang
Write microservice in golang
Bo-Yi Wu14.8K views
Introduction to MVC of CodeIgniter 2.1.x by Bo-Yi Wu
Introduction to MVC of CodeIgniter 2.1.xIntroduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.x
Bo-Yi Wu11.1K views
Git flow 與團隊合作 by Bo-Yi Wu
Git flow 與團隊合作Git flow 與團隊合作
Git flow 與團隊合作
Bo-Yi Wu11.2K views
Why to choose laravel framework by Bo-Yi Wu
Why to choose laravel frameworkWhy to choose laravel framework
Why to choose laravel framework
Bo-Yi Wu8.4K views
用 Docker 改善團隊合作模式 by Bo-Yi Wu
用 Docker 改善團隊合作模式用 Docker 改善團隊合作模式
用 Docker 改善團隊合作模式
Bo-Yi Wu7.2K views
advanced introduction to codeigniter by Bo-Yi Wu
advanced introduction to codeigniteradvanced introduction to codeigniter
advanced introduction to codeigniter
Bo-Yi Wu3.6K views
Git Flow and JavaScript Coding Style by Bo-Yi Wu
Git Flow and JavaScript Coding StyleGit Flow and JavaScript Coding Style
Git Flow and JavaScript Coding Style
Bo-Yi Wu5.2K views
Phpconf 2011 introduction_to_codeigniter by Bo-Yi Wu
Phpconf 2011 introduction_to_codeigniterPhpconf 2011 introduction_to_codeigniter
Phpconf 2011 introduction_to_codeigniter
Bo-Yi Wu4.4K views
Introduction to git by Bo-Yi Wu
Introduction to gitIntroduction to git
Introduction to git
Bo-Yi Wu19.5K views
How to choose web framework by Bo-Yi Wu
How to choose web frameworkHow to choose web framework
How to choose web framework
Bo-Yi Wu11.4K views
2014 OSDC Talk: Introduction to Percona XtraDB Cluster and HAProxy by Bo-Yi Wu
2014 OSDC Talk: Introduction to Percona XtraDB Cluster and HAProxy2014 OSDC Talk: Introduction to Percona XtraDB Cluster and HAProxy
2014 OSDC Talk: Introduction to Percona XtraDB Cluster and HAProxy
Bo-Yi Wu3K views
You must know about CodeIgniter Popular Library by Bo-Yi Wu
You must know about CodeIgniter Popular LibraryYou must know about CodeIgniter Popular Library
You must know about CodeIgniter Popular Library
Bo-Yi Wu8.1K views
Npm 套件管理 & 常用開發工具介紹 by wantingj
Npm 套件管理 & 常用開發工具介紹Npm 套件管理 & 常用開發工具介紹
Npm 套件管理 & 常用開發工具介紹
wantingj16.9K views
RESTful API Design & Implementation with CodeIgniter PHP Framework by Bo-Yi Wu
RESTful API Design & Implementation with CodeIgniter PHP FrameworkRESTful API Design & Implementation with CodeIgniter PHP Framework
RESTful API Design & Implementation with CodeIgniter PHP Framework
Bo-Yi Wu59.7K views
Docker 基礎介紹與實戰 by Bo-Yi Wu
Docker 基礎介紹與實戰Docker 基礎介紹與實戰
Docker 基礎介紹與實戰
Bo-Yi Wu15.8K views
Maintainable PHP Source Code by Bo-Yi Wu
Maintainable PHP Source CodeMaintainable PHP Source Code
Maintainable PHP Source Code
Bo-Yi Wu28K views
Introduction to Android G Sensor I²C Driver on Android by Bo-Yi Wu
Introduction to Android G Sensor I²C Driver on AndroidIntroduction to Android G Sensor I²C Driver on Android
Introduction to Android G Sensor I²C Driver on Android
Bo-Yi Wu7K views
Golang server design pattern by 理 傅
Golang server design patternGolang server design pattern
Golang server design pattern
理 傅11K views
Come With Golang by 尚文 曾
Come With GolangCome With Golang
Come With Golang
尚文 曾765 views

Similar to Introduction to Grunt.js on Taiwan JavaScript Conference

Front End Development for Back End Java Developers - Jfokus 2020 by
Front End Development for Back End Java Developers - Jfokus 2020Front End Development for Back End Java Developers - Jfokus 2020
Front End Development for Back End Java Developers - Jfokus 2020Matt Raible
181 views112 slides
JavaScript Modules in Practice by
JavaScript Modules in PracticeJavaScript Modules in Practice
JavaScript Modules in PracticeMaghdebura
1.4K views25 slides
JavaScript Modules Past, Present and Future by
JavaScript Modules Past, Present and FutureJavaScript Modules Past, Present and Future
JavaScript Modules Past, Present and FutureIgalia
13 views64 slides
JavaScript Perfomance by
JavaScript PerfomanceJavaScript Perfomance
JavaScript PerfomanceAnatol Alizar
10.1K views49 slides
JavaScript Performance (at SFJS) by
JavaScript Performance (at SFJS)JavaScript Performance (at SFJS)
JavaScript Performance (at SFJS)Steve Souders
22.8K views49 slides
10 ways to make your code rock by
10 ways to make your code rock10 ways to make your code rock
10 ways to make your code rockmartincronje
413 views27 slides

Similar to Introduction to Grunt.js on Taiwan JavaScript Conference(20)

Front End Development for Back End Java Developers - Jfokus 2020 by Matt Raible
Front End Development for Back End Java Developers - Jfokus 2020Front End Development for Back End Java Developers - Jfokus 2020
Front End Development for Back End Java Developers - Jfokus 2020
Matt Raible181 views
JavaScript Modules in Practice by Maghdebura
JavaScript Modules in PracticeJavaScript Modules in Practice
JavaScript Modules in Practice
Maghdebura1.4K views
JavaScript Modules Past, Present and Future by Igalia
JavaScript Modules Past, Present and FutureJavaScript Modules Past, Present and Future
JavaScript Modules Past, Present and Future
Igalia13 views
JavaScript Perfomance by Anatol Alizar
JavaScript PerfomanceJavaScript Perfomance
JavaScript Perfomance
Anatol Alizar10.1K views
JavaScript Performance (at SFJS) by Steve Souders
JavaScript Performance (at SFJS)JavaScript Performance (at SFJS)
JavaScript Performance (at SFJS)
Steve Souders22.8K views
10 ways to make your code rock by martincronje
10 ways to make your code rock10 ways to make your code rock
10 ways to make your code rock
martincronje413 views
RESS – Responsive Webdesign and Server Side Components by Sven Wolfermann
RESS – Responsive Webdesign and Server Side ComponentsRESS – Responsive Webdesign and Server Side Components
RESS – Responsive Webdesign and Server Side Components
Sven Wolfermann6.1K views
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ... by tdc-globalcode
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
tdc-globalcode42 views
フロントエンドエンジニア(仮) 〜え、ちょっとフロントやること多すぎじゃない!?〜 by Koji Ishimoto
フロントエンドエンジニア(仮) 〜え、ちょっとフロントやること多すぎじゃない!?〜フロントエンドエンジニア(仮) 〜え、ちょっとフロントやること多すぎじゃない!?〜
フロントエンドエンジニア(仮) 〜え、ちょっとフロントやること多すぎじゃない!?〜
Koji Ishimoto39.2K views
Heroku pop-behind-the-sense by Ben Lin
Heroku pop-behind-the-senseHeroku pop-behind-the-sense
Heroku pop-behind-the-sense
Ben Lin778 views
Jwis2011 ruo ando by Ruo Ando
Jwis2011 ruo andoJwis2011 ruo ando
Jwis2011 ruo ando
Ruo Ando398 views
WEBPACK by home
WEBPACKWEBPACK
WEBPACK
home14 views
Analyzing the Performance of Mobile Web by Ariya Hidayat
Analyzing the Performance of Mobile WebAnalyzing the Performance of Mobile Web
Analyzing the Performance of Mobile Web
Ariya Hidayat3.5K views
The new static resources framework by marcplmer
The new static resources frameworkThe new static resources framework
The new static resources framework
marcplmer1.9K views
Single Page JavaScript WebApps... A Gradle Story by Kon Soulianidis
Single Page JavaScript WebApps... A Gradle StorySingle Page JavaScript WebApps... A Gradle Story
Single Page JavaScript WebApps... A Gradle Story
Kon Soulianidis4K views
Testable client side_mvc_apps_in_javascript by Timothy Oxley
Testable client side_mvc_apps_in_javascriptTestable client side_mvc_apps_in_javascript
Testable client side_mvc_apps_in_javascript
Timothy Oxley1.2K views
Build Better Responsive websites. Hrvoje Jurišić by MeetMagentoNY2014
Build Better Responsive websites. Hrvoje JurišićBuild Better Responsive websites. Hrvoje Jurišić
Build Better Responsive websites. Hrvoje Jurišić
MeetMagentoNY2014570 views
Module, AMD, RequireJS by 偉格 高
Module, AMD, RequireJSModule, AMD, RequireJS
Module, AMD, RequireJS
偉格 高38.5K views
[Coscup 2012] JavascriptMVC by Alive Kuo
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC
Alive Kuo1.3K views

More from Bo-Yi Wu

Drone CI/CD 自動化測試及部署 by
Drone CI/CD 自動化測試及部署Drone CI/CD 自動化測試及部署
Drone CI/CD 自動化測試及部署Bo-Yi Wu
1.5K views95 slides
用 Go 語言打造多台機器 Scale 架構 by
用 Go 語言打造多台機器 Scale 架構用 Go 語言打造多台機器 Scale 架構
用 Go 語言打造多台機器 Scale 架構Bo-Yi Wu
3.6K views64 slides
Job Queue in Golang by
Job Queue in GolangJob Queue in Golang
Job Queue in GolangBo-Yi Wu
22.3K views82 slides
Golang Project Layout and Practice by
Golang Project Layout and PracticeGolang Project Layout and Practice
Golang Project Layout and PracticeBo-Yi Wu
19.3K views94 slides
Introduction to GitHub Actions by
Introduction to GitHub ActionsIntroduction to GitHub Actions
Introduction to GitHub ActionsBo-Yi Wu
19.3K views57 slides
Drone 1.0 Feature by
Drone 1.0 FeatureDrone 1.0 Feature
Drone 1.0 FeatureBo-Yi Wu
8.2K views40 slides

More from Bo-Yi Wu(18)

Drone CI/CD 自動化測試及部署 by Bo-Yi Wu
Drone CI/CD 自動化測試及部署Drone CI/CD 自動化測試及部署
Drone CI/CD 自動化測試及部署
Bo-Yi Wu1.5K views
用 Go 語言打造多台機器 Scale 架構 by Bo-Yi Wu
用 Go 語言打造多台機器 Scale 架構用 Go 語言打造多台機器 Scale 架構
用 Go 語言打造多台機器 Scale 架構
Bo-Yi Wu3.6K views
Job Queue in Golang by Bo-Yi Wu
Job Queue in GolangJob Queue in Golang
Job Queue in Golang
Bo-Yi Wu22.3K views
Golang Project Layout and Practice by Bo-Yi Wu
Golang Project Layout and PracticeGolang Project Layout and Practice
Golang Project Layout and Practice
Bo-Yi Wu19.3K views
Introduction to GitHub Actions by Bo-Yi Wu
Introduction to GitHub ActionsIntroduction to GitHub Actions
Introduction to GitHub Actions
Bo-Yi Wu19.3K views
Drone 1.0 Feature by Bo-Yi Wu
Drone 1.0 FeatureDrone 1.0 Feature
Drone 1.0 Feature
Bo-Yi Wu8.2K views
Drone CI/CD Platform by Bo-Yi Wu
Drone CI/CD PlatformDrone CI/CD Platform
Drone CI/CD Platform
Bo-Yi Wu8.8K views
GraphQL IN Golang by Bo-Yi Wu
GraphQL IN GolangGraphQL IN Golang
GraphQL IN Golang
Bo-Yi Wu10.5K views
Go 語言基礎簡介 by Bo-Yi Wu
Go 語言基礎簡介Go 語言基礎簡介
Go 語言基礎簡介
Bo-Yi Wu11.4K views
drone continuous Integration by Bo-Yi Wu
drone continuous Integrationdrone continuous Integration
drone continuous Integration
Bo-Yi Wu7.4K views
Gorush: A push notification server written in Go by Bo-Yi Wu
Gorush: A push notification server written in GoGorush: A push notification server written in Go
Gorush: A push notification server written in Go
Bo-Yi Wu13.7K views
用 Drone 打造 輕量級容器持續交付平台 by Bo-Yi Wu
用 Drone 打造輕量級容器持續交付平台用 Drone 打造輕量級容器持續交付平台
用 Drone 打造 輕量級容器持續交付平台
Bo-Yi Wu36.2K views
用 Go 語言 打造微服務架構 by Bo-Yi Wu
用 Go 語言打造微服務架構用 Go 語言打造微服務架構
用 Go 語言 打造微服務架構
Bo-Yi Wu10.7K views
Introduction to Gitea with Drone by Bo-Yi Wu
Introduction to Gitea with DroneIntroduction to Gitea with Drone
Introduction to Gitea with Drone
Bo-Yi Wu11.9K views
運用 Docker 整合 Laravel 提升團隊開發效率 by Bo-Yi Wu
運用 Docker 整合 Laravel 提升團隊開發效率運用 Docker 整合 Laravel 提升團隊開發效率
運用 Docker 整合 Laravel 提升團隊開發效率
Bo-Yi Wu5K views
用 Go 語言實戰 Push Notification 服務 by Bo-Yi Wu
用 Go 語言實戰 Push Notification 服務用 Go 語言實戰 Push Notification 服務
用 Go 語言實戰 Push Notification 服務
Bo-Yi Wu5K views
用 Go 語言打造 DevOps Bot by Bo-Yi Wu
用 Go 語言打造 DevOps Bot用 Go 語言打造 DevOps Bot
用 Go 語言打造 DevOps Bot
Bo-Yi Wu5.2K views
A painless self-hosted Git service: Gitea by Bo-Yi Wu
A painless self-hosted Git service: GiteaA painless self-hosted Git service: Gitea
A painless self-hosted Git service: Gitea
Bo-Yi Wu15.4K views

Recently uploaded

Microsoft Power Platform.pptx by
Microsoft Power Platform.pptxMicrosoft Power Platform.pptx
Microsoft Power Platform.pptxUni Systems S.M.S.A.
52 views38 slides
ChatGPT and AI for Web Developers by
ChatGPT and AI for Web DevelopersChatGPT and AI for Web Developers
ChatGPT and AI for Web DevelopersMaximiliano Firtman
187 views82 slides
From chaos to control: Managing migrations and Microsoft 365 with ShareGate! by
From chaos to control: Managing migrations and Microsoft 365 with ShareGate!From chaos to control: Managing migrations and Microsoft 365 with ShareGate!
From chaos to control: Managing migrations and Microsoft 365 with ShareGate!sammart93
9 views39 slides
Spesifikasi Lengkap ASUS Vivobook Go 14 by
Spesifikasi Lengkap ASUS Vivobook Go 14Spesifikasi Lengkap ASUS Vivobook Go 14
Spesifikasi Lengkap ASUS Vivobook Go 14Dot Semarang
37 views1 slide
【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院 by
【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院
【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院IttrainingIttraining
41 views8 slides
Melek BEN MAHMOUD.pdf by
Melek BEN MAHMOUD.pdfMelek BEN MAHMOUD.pdf
Melek BEN MAHMOUD.pdfMelekBenMahmoud
14 views1 slide

Recently uploaded(20)

From chaos to control: Managing migrations and Microsoft 365 with ShareGate! by sammart93
From chaos to control: Managing migrations and Microsoft 365 with ShareGate!From chaos to control: Managing migrations and Microsoft 365 with ShareGate!
From chaos to control: Managing migrations and Microsoft 365 with ShareGate!
sammart939 views
Spesifikasi Lengkap ASUS Vivobook Go 14 by Dot Semarang
Spesifikasi Lengkap ASUS Vivobook Go 14Spesifikasi Lengkap ASUS Vivobook Go 14
Spesifikasi Lengkap ASUS Vivobook Go 14
Dot Semarang37 views
【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院 by IttrainingIttraining
【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院
【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院
Case Study Copenhagen Energy and Business Central.pdf by Aitana
Case Study Copenhagen Energy and Business Central.pdfCase Study Copenhagen Energy and Business Central.pdf
Case Study Copenhagen Energy and Business Central.pdf
Aitana16 views
Black and White Modern Science Presentation.pptx by maryamkhalid2916
Black and White Modern Science Presentation.pptxBlack and White Modern Science Presentation.pptx
Black and White Modern Science Presentation.pptx
maryamkhalid291616 views
Business Analyst Series 2023 - Week 3 Session 5 by DianaGray10
Business Analyst Series 2023 -  Week 3 Session 5Business Analyst Series 2023 -  Week 3 Session 5
Business Analyst Series 2023 - Week 3 Session 5
DianaGray10237 views
DALI Basics Course 2023 by Ivory Egg
DALI Basics Course  2023DALI Basics Course  2023
DALI Basics Course 2023
Ivory Egg16 views
Unit 1_Lecture 2_Physical Design of IoT.pdf by StephenTec
Unit 1_Lecture 2_Physical Design of IoT.pdfUnit 1_Lecture 2_Physical Design of IoT.pdf
Unit 1_Lecture 2_Physical Design of IoT.pdf
StephenTec12 views
Attacking IoT Devices from a Web Perspective - Linux Day by Simone Onofri
Attacking IoT Devices from a Web Perspective - Linux Day Attacking IoT Devices from a Web Perspective - Linux Day
Attacking IoT Devices from a Web Perspective - Linux Day
Simone Onofri15 views

Introduction to Grunt.js on Taiwan JavaScript Conference