rabbit-slide-unasuke-omotesandorb-51 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rabbit +1 -0
- data/README.md +24 -0
- data/Rakefile +17 -0
- data/config.yaml +21 -0
- data/img/blog-pullreq-149.png +0 -0
- data/img/chrome-version.png +0 -0
- data/img/icon_raw.jpg +0 -0
- data/img/perfiemance-eager.png +0 -0
- data/img/performance-img.png +0 -0
- data/img/performance-lazy.png +0 -0
- data/img/performance-result.png +0 -0
- data/pdf/omotesandorb-51-slide.pdf +0 -0
- data/slide.md +193 -0
- metadata +69 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0fdb99c91b2683e70c9f6cab7262437c1891f47219954951d9aba7564bba8b34
|
4
|
+
data.tar.gz: bf3e9b3b614bad26b679b0239d286e34a8ef639be5fd195ac98c4f4c1f6033ae
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 954f3bdff37e8d59742308cef9033a23fc6c0fd4518154d61c81a325e3f66b03f0a27f1c20d70b66477d43a65a7db71c547e3db3cc2a16207604b0a4df776afc
|
7
|
+
data.tar.gz: 0b7d661be659d6ebf78028d1ea2122c1a18042ebb2d5de1aba8e4d6cb4f2cc14dc123d7078156e9c4f7133f1406e0062b5237a91b60c7b254429eeb05450b909
|
data/.rabbit
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
slide.md
|
data/README.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# omotesandorb #51
|
2
|
+
|
3
|
+
https://omotesandorb.connpass.com/event/149080/
|
4
|
+
|
5
|
+
## 作者向け
|
6
|
+
|
7
|
+
### 表示
|
8
|
+
|
9
|
+
rake
|
10
|
+
|
11
|
+
### 公開
|
12
|
+
|
13
|
+
rake publish
|
14
|
+
|
15
|
+
## 閲覧者向け
|
16
|
+
|
17
|
+
### インストール
|
18
|
+
|
19
|
+
gem install rabbit-slide-unasuke-omotesandorb-51
|
20
|
+
|
21
|
+
### 表示
|
22
|
+
|
23
|
+
rabbit rabbit-slide-unasuke-omotesandorb-51.gem
|
24
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require "rabbit/task/slide"
|
2
|
+
|
3
|
+
# Edit ./config.yaml to customize meta data
|
4
|
+
|
5
|
+
spec = nil
|
6
|
+
Rabbit::Task::Slide.new do |task|
|
7
|
+
spec = task.spec
|
8
|
+
# spec.files += Dir.glob("doc/**/*.*")
|
9
|
+
# spec.files -= Dir.glob("private/**/*.*")
|
10
|
+
# spec.add_runtime_dependency("rabbit-theme-YOUR-THEME")
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Tag #{spec.version}"
|
14
|
+
task :tag do
|
15
|
+
sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
|
16
|
+
sh("git", "push", "--tags")
|
17
|
+
end
|
data/config.yaml
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
---
|
2
|
+
id: omotesandorb-51
|
3
|
+
base_name: slide
|
4
|
+
tags: ['ruby', 'markdown', 'html']
|
5
|
+
presentation_date: 2019-10-03
|
6
|
+
presentation_start_time:
|
7
|
+
presentation_end_time:
|
8
|
+
version: 1.0.0
|
9
|
+
licenses: []
|
10
|
+
slideshare_id:
|
11
|
+
speaker_deck_id:
|
12
|
+
ustream_id:
|
13
|
+
vimeo_id:
|
14
|
+
youtube_id:
|
15
|
+
author:
|
16
|
+
markup_language: :markdown
|
17
|
+
name: unasuke
|
18
|
+
email: yusuke1994525@gmail.com
|
19
|
+
rubygems_user: unasuke
|
20
|
+
slideshare_user:
|
21
|
+
speaker_deck_user:
|
Binary file
|
Binary file
|
data/img/icon_raw.jpg
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/slide.md
ADDED
@@ -0,0 +1,193 @@
|
|
1
|
+
# Markdownで\\nLazy image loading
|
2
|
+
subtitle
|
3
|
+
: 2019-10-03
|
4
|
+
|
5
|
+
subtitle
|
6
|
+
: 表参道.rb #51
|
7
|
+
|
8
|
+
author
|
9
|
+
: うなすけ
|
10
|
+
|
11
|
+
theme
|
12
|
+
: unasuke-white
|
13
|
+
|
14
|
+
|
15
|
+
# 自己紹介
|
16
|
+
- 名前 : うなすけ
|
17
|
+
- 仕事 : 株式会社バンク (エンジニア)
|
18
|
+
- インフラ寄りサーバーサイドエンジニア
|
19
|
+
- Ruby, Rails, Kubernetes...
|
20
|
+
|
21
|
+
- {::tag name="x-small"}GitHub [@unasuke](https://github.com/unasuke){:/tag}
|
22
|
+
- {::tag name="x-small"}Mastodon [@unasuke@mstdn.unasuke.com](https://mstdn.unasuke.com/@unasuke){:/tag}
|
23
|
+
- {::tag name="x-small"}Twitter [@yu\_suke1994](https://twitter.com/yu_suke1994){:/tag}
|
24
|
+
|
25
|
+
![](img/icon_raw.jpg){:relative_width="24" align="right" relative_margin_right="-10" relative_margin_top="42"}
|
26
|
+
|
27
|
+
# はじめに
|
28
|
+
See your [chrome://settings/help](chrome://settings/help)
|
29
|
+
|
30
|
+
![](img/chrome-version.png){:relative_width="100"}
|
31
|
+
|
32
|
+
# Native lazy-loading from Chrome 75!
|
33
|
+
- [Native lazy-loading for the web \| web.dev](https://web.dev/native-lazy-loading)
|
34
|
+
- [AddyOsmani.com - Native image lazy-loading for the web!](https://addyosmani.com/blog/lazy-loading/)
|
35
|
+
- [遂に来る! Chrome 75にてLazyLoadが正式に実装されるようです🎉 \| フロントエンドBlog \| ミツエーリンクス](https://www.mitsue.co.jp/knowledge/blog/frontend/201904/08_0854.html)
|
36
|
+
|
37
|
+
# loading="lazy"
|
38
|
+
Slimの場合
|
39
|
+
|
40
|
+
```slim
|
41
|
+
img(src="https://example.org/image.png" loading="lazy")
|
42
|
+
```
|
43
|
+
|
44
|
+
Hamlの場合
|
45
|
+
|
46
|
+
```haml
|
47
|
+
%img{src:"https://example.org/image.png", loading: "lazy"}
|
48
|
+
```
|
49
|
+
|
50
|
+
# loading="lazy"
|
51
|
+
Markdownの場合
|
52
|
+
|
53
|
+
```markdown
|
54
|
+
<img src="https://example.org/image.png" loading="lazy" />
|
55
|
+
```
|
56
|
+
|
57
|
+
……いやいやいや
|
58
|
+
|
59
|
+
# Markdownの場合の理想
|
60
|
+
こう書いたら
|
61
|
+
|
62
|
+
```markdown
|
63
|
+
![](https://example.org/image.png)
|
64
|
+
```
|
65
|
+
|
66
|
+
こうなってほしい
|
67
|
+
|
68
|
+
```html
|
69
|
+
<img src="https://example.org/image.png" loading="lazy" />
|
70
|
+
```
|
71
|
+
|
72
|
+
# Markdownの場合の理想
|
73
|
+
|
74
|
+
{:.center}
|
75
|
+
{::tag name="x-large"}なぜそんなことを気にしているのか{:/tag}
|
76
|
+
|
77
|
+
# blog.unasuke.comの事情
|
78
|
+
- Middlemanと、blogプラグインによって生成されている
|
79
|
+
- 記事自体はMarkdownで書かれている
|
80
|
+
- 画像が重いというご意見がある
|
81
|
+
|
82
|
+
# 画像が重いというご意見
|
83
|
+
<https://github.com/unasuke/blog/pull/149>
|
84
|
+
|
85
|
+
![](img/blog-pullreq-149.png){:relative_width="100"}
|
86
|
+
|
87
|
+
# つまりこういうこと
|
88
|
+
- blog.unasuke.comは画像が重いことに定評がある
|
89
|
+
- img に `loading="lazy"`を付けられたらいいかも?
|
90
|
+
- いやでもMarkdownやんけ…‥
|
91
|
+
|
92
|
+
# どういう手順で進めるか
|
93
|
+
理想
|
94
|
+
|
95
|
+
1. `loading="lazy"` で本当に早くなるのか計測
|
96
|
+
1. Markdownの変換結果になんとかして `loading="lazy"`をつける
|
97
|
+
|
98
|
+
実際
|
99
|
+
|
100
|
+
1. Markdownの変換結果になんとかして `loading="lazy"`をつける
|
101
|
+
1. 本当に早くなるのか計測
|
102
|
+
|
103
|
+
# なぜ計測ファーストでないか
|
104
|
+
- 変換結果に介入できることが検証できなければ、早くなることが確認できても実現できないため
|
105
|
+
- gemを作りたいという気持ちのほうが先にあった
|
106
|
+
- うっかり
|
107
|
+
|
108
|
+
# 実装やっていきましょう
|
109
|
+
- blog.unasuke.comではRedcarpetを使っている
|
110
|
+
- <https://github.com/vmg/redcarpet>
|
111
|
+
- RedcarpetにはCustom Rendererを指定できる
|
112
|
+
- Custom Rendererで `image(link, title, alt_text)` の返り値をいじればできそう
|
113
|
+
|
114
|
+
see also
|
115
|
+
[Railsでカスタムmarkdownを実装する - k0kubun's blog](https://k0kubun.hatenablog.com/entry/2013/09/19/223400)
|
116
|
+
|
117
|
+
# Minimum code
|
118
|
+
```ruby
|
119
|
+
class CustomRenderer < ::Redcarpet::Render::HTML
|
120
|
+
def image(link, title, alt_text)
|
121
|
+
"<img loading=\"lazy\" src=\"#{link}\" alt=\"#{alt_text}\" />"
|
122
|
+
end
|
123
|
+
end
|
124
|
+
```
|
125
|
+
|
126
|
+
これでやりたいことは実現できる
|
127
|
+
|
128
|
+
# gemができました
|
129
|
+
<https://github.com/unasuke/redcarpet-render-html_lazy_img>
|
130
|
+
|
131
|
+
![便利QRコード](https://i.imgur.com/QU9gYu8.png){:relative_width="40"}
|
132
|
+
|
133
|
+
# gemができました
|
134
|
+
|
135
|
+
```ruby
|
136
|
+
markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTMLLazyImg::Lazy)
|
137
|
+
markdown.render('![example image](https://example.com/img.png)')
|
138
|
+
# => '<p><img loading="lazy" src="https://example.com/img.png" alt="example image" /></p>'
|
139
|
+
|
140
|
+
markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTMLLazyImg::Auto)
|
141
|
+
markdown.render('![example image](https://example.com/img.png)')
|
142
|
+
# => '<p><img loading="auto" src="https://example.com/img.png" alt="example image" /></p>'
|
143
|
+
|
144
|
+
markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTMLLazyImg::Eager)
|
145
|
+
markdown.render('![example image](https://example.com/img.png)')
|
146
|
+
# => '<p><img loading="eager" src="https://example.com/img.png" alt="example image" /></p>'
|
147
|
+
```
|
148
|
+
|
149
|
+
`loading` attributeの他の値にも対応
|
150
|
+
(auto, eager)
|
151
|
+
|
152
|
+
# Middlemanで使用するには
|
153
|
+
`config.rb`にこのように書けばOK
|
154
|
+
|
155
|
+
```ruby
|
156
|
+
set :markdown, renderer: Redcarpet::Render::HTMLLazyImg::Lazy
|
157
|
+
```
|
158
|
+
|
159
|
+
# では計測しましょう
|
160
|
+
使用するのは僕のブログ記事でも大量に画像を使用しているこの記事!
|
161
|
+
|
162
|
+
[TEX Yoda Trackpoint Keyboardを買った \| うなすけとあれこれ](https://blog.unasuke.com/2015/tex-yoda-trackpoint-keyboard-assembly/)
|
163
|
+
|
164
|
+
![](https://i.imgur.com/wu0yM2j.png){:relative_width="30"}
|
165
|
+
|
166
|
+
# 計測方法
|
167
|
+
1. 上記記事をhtmlとしてローカルに保存
|
168
|
+
1. `<img>` に何もなし、`loading="lazy"`, `loading="eager"`を指定したものの3つを用意
|
169
|
+
1. `chrome://flags/#enable-lazy-image-loading` を Enabledに
|
170
|
+
1. Chrome Developer toolsでloadingやperformanceを見る
|
171
|
+
|
172
|
+
※ もちろん Disable cacheの状態で
|
173
|
+
|
174
|
+
# 結果 (6回計測)
|
175
|
+
Load eventが発火するまでの時間
|
176
|
+
|
177
|
+
| | 最悪値 | 最速値 | 平均値 |
|
178
|
+
| -- | -- | -- | -- |
|
179
|
+
| pure img | 8.33 | 5.42 | 6.25 |
|
180
|
+
| lazy | 6.89 | 4.96 | 5.63 |
|
181
|
+
| eager | 7.83 | 4.97 | 6.47 |
|
182
|
+
|
183
|
+
Load eventはページ内の要素が全て読み込まれたら発火するのであまり意味のない計測だったかな……
|
184
|
+
|
185
|
+
# 結果 (1回のみ取得)
|
186
|
+
Performanceの結果
|
187
|
+
|
188
|
+
![](img/performance-result.png){:relative_width="100"}
|
189
|
+
|
190
|
+
# まとめ
|
191
|
+
- Loadingにかかる時間が削減されておりよさそう
|
192
|
+
- 画像のサイズは変わらないが、ページ自体は軽くなったのでは(サイズの話ではない)
|
193
|
+
- Webの最新技術を使うのは楽しい!!!
|
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rabbit-slide-unasuke-omotesandorb-51
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- unasuke
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-10-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rabbit
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.0.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.0.2
|
27
|
+
description: https://omotesandorb.connpass.com/event/149080/
|
28
|
+
email:
|
29
|
+
- yusuke1994525@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".rabbit"
|
35
|
+
- README.md
|
36
|
+
- Rakefile
|
37
|
+
- config.yaml
|
38
|
+
- img/blog-pullreq-149.png
|
39
|
+
- img/chrome-version.png
|
40
|
+
- img/icon_raw.jpg
|
41
|
+
- img/perfiemance-eager.png
|
42
|
+
- img/performance-img.png
|
43
|
+
- img/performance-lazy.png
|
44
|
+
- img/performance-result.png
|
45
|
+
- pdf/omotesandorb-51-slide.pdf
|
46
|
+
- slide.md
|
47
|
+
homepage: https://slide.rabbit-shocker.org/authors/unasuke/omotesandorb-51/
|
48
|
+
licenses: []
|
49
|
+
metadata: {}
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options: []
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
requirements: []
|
65
|
+
rubygems_version: 3.0.3
|
66
|
+
signing_key:
|
67
|
+
specification_version: 4
|
68
|
+
summary: 'omotesandorb #51'
|
69
|
+
test_files: []
|