不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" •...

100
by @tonytonyjan @ RubyConf Taiwan, 2015 1

Transcript of 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" •...

Page 1: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��������by#@tonytonyjan

@"RubyConf"Taiwan,"2015 1

Page 2: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

�������@"RubyConf"Taiwan,"2015 2

Page 3: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

@"RubyConf"Taiwan,"2015 3

Page 4: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

�����

tonytonyjan@"RubyConf"Taiwan,"2015 4

Page 5: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��!@tonytonyjan

• ���"#"Ziltag

• ���"#"����

• �"#"Ruby"on"Rails"����

• �"#"jaro_winkler,"exif,"xdite"gem,"etc

• "#"ConFoo"2015

• "#"Ruby"Kaigi"2014

@"RubyConf"Taiwan,"2015 5

Page 6: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��

• C

• Ruby

• Rails

• C+Extension

• JavaScript

• CSS

@"RubyConf"Taiwan,"2015 6

Page 7: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��@"RubyConf"Taiwan,"2015 7

Page 8: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

������������

• � �

• �"Rails"�������

• ��"JS"�����"Rails"���

@"RubyConf"Taiwan,"2015 8

Page 9: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��������

@"RubyConf"Taiwan,"2015 9

Page 10: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

�������!(1/4)

<head> <link rel="stylesheet" href="aaa.css"> <link rel="stylesheet" href="bbb.css"> <link rel="stylesheet" href="ccc.css"> <script src="aaa.js"></script> <script src="bbb.js"></script> <script src="ccc.js"></script></head>

@"RubyConf"Taiwan,"2015 10

Page 11: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

HTTP$����@"RubyConf"Taiwan,"2015 11

Page 12: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

�������!(2/4)Conca&na&on

ex.$cat *.js

<head> <link rel="stylesheet" href="all.css"> <script src="all.js"></script></head>

@"RubyConf"Taiwan,"2015 12

Page 13: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

����@"RubyConf"Taiwan,"2015 13

Page 14: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

�������!(3/4)Compression

ex.$YUI$Compressor

<head> <link rel="stylesheet" href="all.min.css"> <script src="all.min.js"></script></head>

@"RubyConf"Taiwan,"2015 14

Page 15: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

�����@"RubyConf"Taiwan,"2015 15

Page 16: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

�������!(4/4)��������

<head> <link rel="stylesheet" href="all.min.css?v2"> <script src="all.min.js?v3"></script></head>

@"RubyConf"Taiwan,"2015 16

Page 17: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��!debug@"RubyConf"Taiwan,"2015 17

Page 18: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

������!Source!Map!��

@"RubyConf"Taiwan,"2015 18

Page 19: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

@"RubyConf"Taiwan,"2015 19

Page 20: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

@"RubyConf"Taiwan,"2015 20

Page 21: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

QQ@"RubyConf"Taiwan,"2015 21

Page 22: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��������2011$���

@"RubyConf"Taiwan,"2015 22

Page 23: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

���������

@"RubyConf"Taiwan,"2015 23

Page 24: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

����@"RubyConf"Taiwan,"2015 24

Page 25: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

Rails&3.1���!Assets!Pipeline@"RubyConf"Taiwan,"2015 25

Page 26: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

Sprockets@"RubyConf"Taiwan,"2015 26

Page 27: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

Sprockets*�����*(1/4)Transform

@"RubyConf"Taiwan,"2015 27

Page 28: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

Sprockets*�����*(2/4)Concat'&'Compress

@"RubyConf"Taiwan,"2015 28

Page 29: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

Sprockets*�����*(3/4)Digest

@"RubyConf"Taiwan,"2015 29

Page 30: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

Sprockets*�����*(4/4)Javascript*Templa/ng

<!-- templates/hello.jst.ejs --><div>Hello, <span><%= name %></span>!</div>

// application.js//= require templates/hello$("#hello").html(JST["templates/hello"]({ name: "Sam" }));

@"RubyConf"Taiwan,"2015 30

Page 31: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

@"RubyConf"Taiwan,"2015 31

Page 32: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

�����@"RubyConf"Taiwan,"2015 32

Page 33: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

������@"RubyConf"Taiwan,"2015 33

Page 34: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��������

@"RubyConf"Taiwan,"2015 34

Page 35: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

������• �"TypeScript"��"CoffeeScript

• �"LESS"��"SASS

• ��"ReactJS"�"Polymer" �"JST

• ��"bower"�����������"gem

• ����"Mocha�Jasmine"���

@"RubyConf"Taiwan,"2015 35

Page 36: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

�����!gem!�����

@"RubyConf"Taiwan,"2015 36

Page 37: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

TypeScript*+>*typescript+rails

LESS$%>$less%rails

ReactJS()>(react)rails

@"RubyConf"Taiwan,"2015 37

Page 38: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

rails&assets.org@"RubyConf"Taiwan,"2015 38

Page 39: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

Gemfile

source 'https://rails-assets.org' do # gem "rails-assets-#{BOWER_PKG_NAME}" gem 'rails-assets-bootstrap' gem 'rails-assets-angular' gem 'rails-assets-leaflet'end

@"RubyConf"Taiwan,"2015 39

Page 40: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

����!gem�@"RubyConf"Taiwan,"2015 40

Page 41: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

�����!vendor/assets/

@"RubyConf"Taiwan,"2015 41

Page 42: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��!gem!���bootstrap(gem(�(3(���

@"RubyConf"Taiwan,"2015 42

Page 43: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��!gem!����!gem!��@"RubyConf"Taiwan,"2015 43

Page 44: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

���������!vendor/assets

���!Gemfile

@"RubyConf"Taiwan,"2015 44

Page 45: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

������@"RubyConf"Taiwan,"2015 45

Page 46: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��������• ����"JST"��

• ��"sprockets"manifest"system"��• ���� �������

• �������"Ruby"����"JS"���

@"RubyConf"Taiwan,"2015 46

Page 47: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

�����

@"RubyConf"Taiwan,"2015 47

Page 48: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

���� ������Bower,'Gulp,'npm,'Grunt,'...

@"RubyConf"Taiwan,"2015 48

Page 49: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

���!Rails�����

@"RubyConf"Taiwan,"2015 49

Page 50: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

QQ@"RubyConf"Taiwan,"2015 50

Page 51: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

Rails&+&Bower@"RubyConf"Taiwan,"2015 51

Page 52: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

�����rails&assets.org@"RubyConf"Taiwan,"2015 52

Page 53: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

������!Gem!���@"RubyConf"Taiwan,"2015 53

Page 54: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

.bowerrc

{ "directory": "vendor/assets/components"}

{ "directory": "public/components"}

@"RubyConf"Taiwan,"2015 54

Page 55: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

assets.rb

Rails.application.config.assets.paths.concnat [ 'vendor/assets/components']

@"RubyConf"Taiwan,"2015 55

Page 56: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

applica&on.scss

@import 'material-design-lite/src/material-design-lite'

applica&on.js

//= require jquery//= require jquery_ujs//= require turbolinks//= require material-design-lite/material

@"RubyConf"Taiwan,"2015 56

Page 57: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

����@"RubyConf"Taiwan,"2015 57

Page 58: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

���������• ���"CSS"��"assets"�• � ������������

• Autoprefixer

• BrowserSync

• JSHint

• etc

@"RubyConf"Taiwan,"2015 58

Page 59: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

����!assets!���!bootstrap!���

@font-face { font-family: 'Glyphicons Halflings'; src: url('../fonts/glyphicons-halflings-regular.eot');}

@"RubyConf"Taiwan,"2015 59

Page 60: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

bower&install&bootstrap.sass

������ ��!sprockets!�������

@import 'bootstrap-sass/.../bootstrap-sprockets';@import 'bootstrap-sass/.../bootstrap';

����!bower!package!����!sass!��

@"RubyConf"Taiwan,"2015 60

Page 61: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

�����������Autoprefixer�BrowserSync�JSHint�etc�

@"RubyConf"Taiwan,"2015 61

Page 62: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

���!Rails������@"RubyConf"Taiwan,"2015 62

Page 63: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��������@"RubyConf"Taiwan,"2015 63

Page 64: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

Rails&+&Bower&+&gulp

@"RubyConf"Taiwan,"2015 64

Page 65: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

�������@"RubyConf"Taiwan,"2015 65

Page 66: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

@"RubyConf"Taiwan,"2015 66

Page 67: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

Dan$�����

@"RubyConf"Taiwan,"2015 67

Page 68: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

������1.�������� �

2.������$gulp_asset_path$�$helper

3. public$����������

@"RubyConf"Taiwan,"2015 68

Page 69: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

@"RubyConf"Taiwan,"2015 69

Page 70: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

katryo'����• gulp&ugify

• gulp&css&minify

• gulp&concat

• gulp&rev

• gulp&rev&rails&manifest

@"RubyConf"Taiwan,"2015 70

Page 71: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

������1.����#sprockets!��#gem#���#assets

2.���#asset_path#���� ��#etag#string

3.��#browserfy! ����������

@"RubyConf"Taiwan,"2015 71

Page 72: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��������

@"RubyConf"Taiwan,"2015 72

Page 73: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

����@"RubyConf"Taiwan,"2015 73

Page 74: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��������

@"RubyConf"Taiwan,"2015 74

Page 75: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

�������@"RubyConf"Taiwan,"2015 75

Page 76: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

�������!Sprockets@"RubyConf"Taiwan,"2015 76

Page 77: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

�����!sprockets

1.�#assets#gem#��#sprockets#�#direc1ve#processor

2.� �#compression�diges1on#�����

@"RubyConf"Taiwan,"2015 77

Page 78: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

�����!bowergulpnpm!���

@"RubyConf"Taiwan,"2015 78

Page 79: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

���!rails!�������

@"RubyConf"Taiwan,"2015 79

Page 80: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

����!gem!����

@"RubyConf"Taiwan,"2015 80

Page 81: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

����!JS!����

@"RubyConf"Taiwan,"2015 81

Page 82: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��������sprockets)�����

@"RubyConf"Taiwan,"2015 82

Page 83: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��������

@"RubyConf"Taiwan,"2015 83

Page 84: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��������

@"RubyConf"Taiwan,"2015 84

Page 85: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

���!gem@"RubyConf"Taiwan,"2015 85

Page 86: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

����• gulp&rev

• gulp&ugilfy

• gulp&css&minify

• gulp&rev&rails&manifest

��!sprockets!��@"RubyConf"Taiwan,"2015 86

Page 87: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

����@"RubyConf"Taiwan,"2015 87

Page 88: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

���!code!������

@"RubyConf"Taiwan,"2015 88

Page 89: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

gulp application.js

gulp.task 'application.js', -> gulp.src [ 'app/assets/javascripts/application/manifest.js' 'bower_components/bootstrap/dist/js/bootstrap.js' 'bower_components/material-design-lite/material.js' 'app/assets/javascripts/application/**/*.{coffee,js}' ] .pipe $.if(/\.coffee$/, $.coffee()) # ��� pipe ��� ���� .pipe $.concat('application.js') .pipe gulp.dest 'app/assets/javascripts'

@"RubyConf"Taiwan,"2015 89

Page 90: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

glup serve

browserSync = require('browser-sync').create()

gulp.task 'serve', -> browserSync.init proxy: 'localhost:3000'

@"RubyConf"Taiwan,"2015 90

Page 91: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��!font!��������

@"RubyConf"Taiwan,"2015 91

Page 92: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��!CSS

.logo { background-image: url(logo.png)}

sprockets)SCSS)helper

.logo { background-image: asset-url("logo.png")}

@"RubyConf"Taiwan,"2015 92

Page 93: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��!ERB

.logo { background-image: url("<%= asset_path 'logo.png' %>")}

����!JS!�����!assets!�� ���

@"RubyConf"Taiwan,"2015 93

Page 94: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��!assets!��config/ini(alizers/assets.rb

Rails.application.config.assets.paths << 'vendor/assets/components'Rails.application.config.assets.paths.concat Dir['vendor/assets/components/**/*/fonts']Rails.application.config.assets.precompile += %w[*.eot *.woff2 *.woff *.ttf *.svg]

@"RubyConf"Taiwan,"2015 94

Page 95: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��!assets!��Rails.applica)on.assets.paths

/.../hello/app/assets/images/.../hello/app/assets/javascripts/.../hello/app/assets/stylesheets/.../hello/vendor/assets/components/.../hello/vendor/assets/javascripts/.../hello/vendor/assets/stylesheets/.../gems/turbolinks-2.5.3/lib/assets/javascripts/.../gems/jquery-rails-4.0.4/vendor/assets/javascripts/.../gems/coffee-rails-4.1.0/lib/assets/javascripts/.../hello/vendor/assets/components/.../hello/vendor/assets/components/bootstrap-sass/assets/fonts */.../hello/vendor/assets/components/font-awesome-sass/assets/fonts *

@"RubyConf"Taiwan,"2015 95

Page 96: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��!assets!������

url(path/to/fonts/foo.svg) -> url("<%= asset_path 'foo.svg' %>")url(../fonts/bar.eot) -> url("<%= asset_path 'bar.eot' %>")url(fonts/buz.woff2) -> url("<%= asset_path 'buz.woff2' %>")

@"RubyConf"Taiwan,"2015 96

Page 97: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��!assets!����!bootstrap)sass!����!Mincer

@function twbs-font-path($path) { // do something like following // from "path/to/font.ext#suffix" to "<%- asset_path(path/to/font.ext)) + #suffix %>" // from "path/to/font.ext?#suffix" to "<%- asset_path(path/to/font.ext)) + ?#suffix %>" // or from "path/to/font.ext" just "<%- asset_path(path/to/font.ext)) %>" @return "<%- asset_path('#{$path}'.replace(/[#?].*$/, '')) + '#{$path}'.replace(/(^[^#?]*)([#?]?.*$)/, '$2') %>";}

@"RubyConf"Taiwan,"2015 97

Page 98: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

��!assets!��gulp%replace

$ = require('gulp-load-plugins')()gulp.task 'application.css', -> gulp.src [ 'app/assets/stylesheets/application.scss' 'app/assets/stylesheets/application/**/*.{css,scss,sass}' ] .pipe $.concat 'application' .pipe $.sass includePaths: ['vendor/assets/components'] .pipe $.replace /url\((['"]?)[^\1)]*fonts\/([^\1)]+)\1\)/g, "url('<%= asset_path '$2' %>')" .pipe $.rename 'application.css.erb' .pipe gulp.dest 'app/assets/stylesheets'

@"RubyConf"Taiwan,"2015 98

Page 99: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

����https://github.com/tonytonyjan/rails_gulp_bower

@"RubyConf"Taiwan,"2015 99

Page 100: 不歸錄 · !@tonytonyjan • "#"Ziltag "#"Ruby"on"Rails" • "#"jaro_winkler,"exif,"xdite"gem,"etc • "#"ConFoo"2015 • "#"Ruby"Kaigi"2014 @"RubyConf"Taiwan,"2015 5 • C

����@"RubyConf"Taiwan,"2015 100