turbolinks 2.1.0 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +18 -1
- data/lib/assets/javascripts/turbolinks.js.coffee +51 -27
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3d08c4d35026032ba9df71e06412e39e6e2808b
|
4
|
+
data.tar.gz: bee4e26fe03db79826e124bb1f756f65a067e315
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9af7fec4638b55c127964a05d8ad8c9d79db475578656e4b41f5d79c5556023ef635b6c6fc201c3c4dd8a0154715d1ccc434d64764458f68c43fb70701134af1
|
7
|
+
data.tar.gz: 4671935850cac59c3f809661847a46dd8d98a5acc6b5a782f32f351e55eb8daaf804ed3ee6b71eaffda503f0b1319addee9086b8d1d05c8b91a5866aa96a9936
|
data/README.md
CHANGED
@@ -64,6 +64,22 @@ To implement a client-side spinner, you could listen for `page:fetch` to start i
|
|
64
64
|
|
65
65
|
DOM transformations that are idempotent are best. If you have transformations that are not, hook them to happen only on `page:load` instead of `page:change` (as that would run them again on the cached pages).
|
66
66
|
|
67
|
+
Transition Cache: A Speed Boost
|
68
|
+
-------------------------------
|
69
|
+
|
70
|
+
Transition Cache, added in v2.2.0, makes loading cached pages instantaneous. Once a user has visited a page, returning later to the page results in an instant load.
|
71
|
+
|
72
|
+
For example, if Page A is already cached by Turbolinks and you are on Page B, clicking a link to Page A will *immediately* display the cached copy of Page A. Turbolinks will then fetch Page A from the server and replace the cached page once the new copy is returned.
|
73
|
+
|
74
|
+
To enable Transition Cache, include the following in your javascript:
|
75
|
+
```javascript
|
76
|
+
Turbolinks.enableTransitionCache();
|
77
|
+
```
|
78
|
+
|
79
|
+
The one drawback is that dramatic differences in appearence between a cached copy and new copy may lead to a jarring affect for the end-user. This will be especially true for pages that have many moving parts (expandable sections, sortable tables, infinite scrolling, etc.).
|
80
|
+
|
81
|
+
If you find that a page is causing problems, you can have Turbolinks skip displaying the cached copy by adding `data-no-transition-cache` to any DOM element on the offending page.
|
82
|
+
|
67
83
|
Initialization
|
68
84
|
--------------
|
69
85
|
|
@@ -170,7 +186,7 @@ Installation
|
|
170
186
|
|
171
187
|
1. Add `gem 'turbolinks'` to your Gemfile.
|
172
188
|
1. Run `bundle install`.
|
173
|
-
1. Add `//= require turbolinks` to your Javascript manifest file (usually found at `app/assets/javascripts/application.js`).
|
189
|
+
1. Add `//= require turbolinks` to your Javascript manifest file (usually found at `app/assets/javascripts/application.js`). If your manifest requires both turbolinks and jQuery, make sure turbolinks is listed *after* jQuery.
|
174
190
|
1. Restart your server and you're now using turbolinks!
|
175
191
|
|
176
192
|
Language Ports
|
@@ -180,6 +196,7 @@ Language Ports
|
|
180
196
|
|
181
197
|
* [Flask Turbolinks](https://github.com/lepture/flask-turbolinks) (Python Flask)
|
182
198
|
* [ASP.NET MVC Turbolinks](https://github.com/kazimanzurrashid/aspnetmvcturbolinks)
|
199
|
+
* [PHP Turbolinks Component](https://github.com/helthe/Turbolinks) (Symfony Component)
|
183
200
|
|
184
201
|
Credits
|
185
202
|
-------
|
@@ -1,18 +1,36 @@
|
|
1
|
-
pageCache
|
2
|
-
cacheSize
|
3
|
-
|
4
|
-
loadedAssets = null
|
5
|
-
htmlExtensions = ['html']
|
1
|
+
pageCache = {}
|
2
|
+
cacheSize = 10
|
3
|
+
transitionCacheEnabled = false
|
6
4
|
|
7
|
-
|
5
|
+
currentState = null
|
6
|
+
loadedAssets = null
|
7
|
+
htmlExtensions = ['html']
|
8
8
|
|
9
|
-
|
10
|
-
xhr = null
|
9
|
+
referer = null
|
11
10
|
|
11
|
+
createDocument = null
|
12
|
+
xhr = null
|
12
13
|
|
13
|
-
|
14
|
+
|
15
|
+
fetch = (url) ->
|
14
16
|
rememberReferer()
|
15
17
|
cacheCurrentPage()
|
18
|
+
reflectNewUrl url
|
19
|
+
|
20
|
+
if transitionCacheEnabled and cachedPage = transitionCacheFor(url)
|
21
|
+
fetchHistory cachedPage
|
22
|
+
fetchReplacement url
|
23
|
+
else
|
24
|
+
fetchReplacement url, resetScrollPosition
|
25
|
+
|
26
|
+
transitionCacheFor = (url) ->
|
27
|
+
cachedPage = pageCache[url]
|
28
|
+
cachedPage if cachedPage and !cachedPage.transitionCacheDisabled
|
29
|
+
|
30
|
+
enableTransitionCache = (enable = true) ->
|
31
|
+
transitionCacheEnabled = enable
|
32
|
+
|
33
|
+
fetchReplacement = (url, onLoadFunction = =>) ->
|
16
34
|
triggerEvent 'page:fetch', url: url
|
17
35
|
|
18
36
|
xhr?.abort()
|
@@ -25,22 +43,19 @@ fetchReplacement = (url) ->
|
|
25
43
|
triggerEvent 'page:receive'
|
26
44
|
|
27
45
|
if doc = processResponse()
|
28
|
-
reflectNewUrl url
|
29
46
|
changePage extractTitleAndBody(doc)...
|
30
47
|
reflectRedirectedUrl()
|
31
|
-
|
48
|
+
onLoadFunction()
|
32
49
|
triggerEvent 'page:load'
|
33
50
|
else
|
34
51
|
document.location.href = url
|
35
52
|
|
36
53
|
xhr.onloadend = -> xhr = null
|
37
|
-
xhr.onabort = -> rememberCurrentUrl()
|
38
54
|
xhr.onerror = -> document.location.href = url
|
39
55
|
|
40
56
|
xhr.send()
|
41
57
|
|
42
58
|
fetchHistory = (cachedPage) ->
|
43
|
-
cacheCurrentPage()
|
44
59
|
xhr?.abort()
|
45
60
|
changePage cachedPage.title, cachedPage.body
|
46
61
|
recallScrollPosition cachedPage
|
@@ -48,12 +63,14 @@ fetchHistory = (cachedPage) ->
|
|
48
63
|
|
49
64
|
|
50
65
|
cacheCurrentPage = ->
|
51
|
-
pageCache[currentState.
|
52
|
-
url:
|
53
|
-
body:
|
54
|
-
title:
|
55
|
-
positionY:
|
56
|
-
positionX:
|
66
|
+
pageCache[currentState.url] =
|
67
|
+
url: document.location.href,
|
68
|
+
body: document.body,
|
69
|
+
title: document.title,
|
70
|
+
positionY: window.pageYOffset,
|
71
|
+
positionX: window.pageXOffset,
|
72
|
+
cachedAt: new Date().getTime(),
|
73
|
+
transitionCacheDisabled: document.querySelector('[data-no-transition-cache]')?
|
57
74
|
|
58
75
|
constrainPageCacheTo cacheSize
|
59
76
|
|
@@ -61,10 +78,15 @@ pagesCached = (size = cacheSize) ->
|
|
61
78
|
cacheSize = parseInt(size) if /^[\d]+$/.test size
|
62
79
|
|
63
80
|
constrainPageCacheTo = (limit) ->
|
64
|
-
|
81
|
+
pageCacheKeys = Object.keys pageCache
|
82
|
+
|
83
|
+
cacheTimesRecentFirst = pageCacheKeys.map (url) ->
|
84
|
+
pageCache[url].cachedAt
|
85
|
+
.sort (a, b) -> b - a
|
86
|
+
|
87
|
+
for key in pageCacheKeys when pageCache[key].cachedAt <= cacheTimesRecentFirst[limit]
|
65
88
|
triggerEvent 'page:expire', pageCache[key]
|
66
|
-
pageCache[key]
|
67
|
-
return
|
89
|
+
delete pageCache[key]
|
68
90
|
|
69
91
|
changePage = (title, body, csrfToken, runScripts) ->
|
70
92
|
document.title = title
|
@@ -92,7 +114,7 @@ removeNoscriptTags = (node) ->
|
|
92
114
|
|
93
115
|
reflectNewUrl = (url) ->
|
94
116
|
if url isnt referer
|
95
|
-
window.history.pushState { turbolinks: true,
|
117
|
+
window.history.pushState { turbolinks: true, url: url }, '', url
|
96
118
|
|
97
119
|
reflectRedirectedUrl = ->
|
98
120
|
if location = xhr.getResponseHeader 'X-XHR-Redirected-To'
|
@@ -103,7 +125,7 @@ rememberReferer = ->
|
|
103
125
|
referer = document.location.href
|
104
126
|
|
105
127
|
rememberCurrentUrl = ->
|
106
|
-
window.history.replaceState { turbolinks: true,
|
128
|
+
window.history.replaceState { turbolinks: true, url: document.location.href }, '', document.location.href
|
107
129
|
|
108
130
|
rememberCurrentState = ->
|
109
131
|
currentState = window.history.state
|
@@ -282,7 +304,8 @@ installJqueryAjaxSuccessPageUpdateTrigger = ->
|
|
282
304
|
|
283
305
|
installHistoryChangeHandler = (event) ->
|
284
306
|
if event.state?.turbolinks
|
285
|
-
if cachedPage = pageCache[event.state.
|
307
|
+
if cachedPage = pageCache[event.state.url]
|
308
|
+
cacheCurrentPage()
|
286
309
|
fetchHistory cachedPage
|
287
310
|
else
|
288
311
|
visit event.target.location.href
|
@@ -318,7 +341,7 @@ if browserSupportsCustomEvents
|
|
318
341
|
installJqueryAjaxSuccessPageUpdateTrigger()
|
319
342
|
|
320
343
|
if browserSupportsTurbolinks
|
321
|
-
visit =
|
344
|
+
visit = fetch
|
322
345
|
initializeTurbolinks()
|
323
346
|
else
|
324
347
|
visit = (url) -> document.location.href = url
|
@@ -327,6 +350,7 @@ else
|
|
327
350
|
# Turbolinks.visit(url)
|
328
351
|
# Turbolinks.pagesCached()
|
329
352
|
# Turbolinks.pagesCached(20)
|
353
|
+
# Turbolinks.enableTransitionCache()
|
330
354
|
# Turbolinks.allowLinkExtensions('md')
|
331
355
|
# Turbolinks.supported
|
332
|
-
@Turbolinks = { visit, pagesCached, allowLinkExtensions, supported: browserSupportsTurbolinks }
|
356
|
+
@Turbolinks = { visit, pagesCached, enableTransitionCache, allowLinkExtensions, supported: browserSupportsTurbolinks }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: turbolinks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-01-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: coffee-rails
|
@@ -61,9 +61,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
61
61
|
version: '0'
|
62
62
|
requirements: []
|
63
63
|
rubyforge_project:
|
64
|
-
rubygems_version: 2.0.
|
64
|
+
rubygems_version: 2.0.3
|
65
65
|
signing_key:
|
66
66
|
specification_version: 4
|
67
67
|
summary: Turbolinks makes following links in your web application faster (use with
|
68
68
|
Rails Asset Pipeline)
|
69
69
|
test_files: []
|
70
|
+
has_rdoc:
|