react-rails-hot-loader 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/README.md +11 -12
- data/lib/assets/{react-rails-hot-loader.js → react-rails-hot-loader.js.erb} +28 -13
- data/lib/hot_loader/asset_change_set.rb +18 -8
- data/lib/hot_loader/railtie.rb +16 -12
- data/lib/hot_loader/server.rb +18 -9
- data/lib/hot_loader/version.rb +1 -1
- data/lib/hot_loader.rb +5 -9
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7984784ebf6f4c9bd1c59261311bc3bf2c30e37e
|
4
|
+
data.tar.gz: 4ab544abfee0ecd7fa15f80069ad08e36661f973
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3069d4c3f71c033bdc9f02cc1bf84aef91bde023c181e5e0c17261df3cd80f272631588b88b7c155cd50ce352ec43d01e7395e9eb70998df520a194c95279035
|
7
|
+
data.tar.gz: 306bd528fc9636645f0d67926e623b7859ed2cbe143eb73246a36b8c6a20285bda08cbb481da45d0eaaccef6b488631ff52bd0b85517bccb908bf0700df0c197
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -24,15 +24,6 @@ Or install it yourself as:
|
|
24
24
|
|
25
25
|
## Usage
|
26
26
|
|
27
|
-
- Add an initializer:
|
28
|
-
|
29
|
-
```ruby
|
30
|
-
# config/initializers/react_rails_hot_loader.rb
|
31
|
-
if Rails.env.development?
|
32
|
-
React::Rails::HotLoader.start()
|
33
|
-
end
|
34
|
-
```
|
35
|
-
|
36
27
|
- Include the JavaScript:
|
37
28
|
|
38
29
|
```js
|
@@ -46,6 +37,8 @@ Or install it yourself as:
|
|
46
37
|
|
47
38
|
- Edit files in `/app/assets/javascripts` & save changes -- they'll be reloaded in the client and React components will be remounted.
|
48
39
|
|
40
|
+
(This gem includes an initializer to start a change notification server in development _only_.)
|
41
|
+
|
49
42
|
## Configuration
|
50
43
|
|
51
44
|
If you notice that your assets are not being recompiled and hot loaded, it could be because they aren't being matched by the default asset glob used (`**/*.{js,coffee}*`). You can modify this asset glob like so:
|
@@ -55,6 +48,13 @@ If you notice that your assets are not being recompiled and hot loaded, it could
|
|
55
48
|
React::Rails::HotLoader::AssetChangeSet.asset_glob = "**/*.{js,rb}*" # I <3 Opal
|
56
49
|
```
|
57
50
|
|
51
|
+
You can choose a port to start it on (default is `8082`):
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
# config/initializers/react_rails_hot_loader.rb
|
55
|
+
React::Rails::HotLoader.port = 8088
|
56
|
+
```
|
57
|
+
|
58
58
|
## Doeses & Doesn'ts
|
59
59
|
|
60
60
|
`react-rails-hot-loader` ...
|
@@ -67,9 +67,8 @@ React::Rails::HotLoader::AssetChangeSet.asset_glob = "**/*.{js,rb}*" # I <3 Opal
|
|
67
67
|
|
68
68
|
## TODO
|
69
69
|
|
70
|
-
-
|
71
|
-
-
|
72
|
-
- Remove need for initializer by automatically starting in `config.after_initialize`?
|
70
|
+
- Figure out how the "real" React hot-loader preserves state and do that
|
71
|
+
- Log out when a push fails, or log the JS code if the push succeeds but doesn't get eval'ed
|
73
72
|
|
74
73
|
## License
|
75
74
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
var ReactRailsHotLoader = {
|
2
2
|
since: null,
|
3
|
-
port:
|
3
|
+
port: <%= React::Rails::HotLoader.port %>,
|
4
4
|
host: window.location.hostname,
|
5
5
|
shouldLog: true,
|
6
6
|
|
@@ -17,17 +17,11 @@ var ReactRailsHotLoader = {
|
|
17
17
|
|
18
18
|
this._socket.onmessage = function(message) {
|
19
19
|
var changes = JSON.parse(message.data)
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
_this.log(err)
|
26
|
-
}
|
27
|
-
})
|
28
|
-
ReactRailsUJS.mountComponents()
|
29
|
-
_this._resetSince()
|
30
|
-
_this.log("update finished")
|
20
|
+
if (changes.bankrupt) {
|
21
|
+
_this._handleBankrupt(changes)
|
22
|
+
} else {
|
23
|
+
_this._hotLoad(changes)
|
24
|
+
}
|
31
25
|
}
|
32
26
|
|
33
27
|
this._interval = setInterval(function() {
|
@@ -53,7 +47,28 @@ var ReactRailsHotLoader = {
|
|
53
47
|
if (this.shouldLog) {
|
54
48
|
console.log("[HotLoader] " + msg)
|
55
49
|
}
|
56
|
-
}
|
50
|
+
},
|
51
|
+
|
52
|
+
_hotLoad: function(changes) {
|
53
|
+
this.log("updating: " + changes.changed_file_names.join(", ") )
|
54
|
+
|
55
|
+
changes.changed_asset_contents.forEach(function(jsCode) {
|
56
|
+
try {
|
57
|
+
eval.call(window, jsCode)
|
58
|
+
} catch (err) {
|
59
|
+
_this.log(err)
|
60
|
+
}
|
61
|
+
})
|
62
|
+
ReactRailsUJS.mountComponents()
|
63
|
+
this._resetSince()
|
64
|
+
this.log("update finished")
|
65
|
+
},
|
66
|
+
|
67
|
+
_handleBankrupt: function(response) {
|
68
|
+
this.log("declaring bankruptcy! " + response.changed_files_count + " files changed.")
|
69
|
+
this.stop()
|
70
|
+
this.log("stopped")
|
71
|
+
},
|
57
72
|
}
|
58
73
|
|
59
74
|
ReactRailsHotLoader.start()
|
@@ -2,9 +2,12 @@ module React
|
|
2
2
|
module Rails
|
3
3
|
module HotLoader
|
4
4
|
class AssetChangeSet
|
5
|
-
attr_reader :since, :path, :changed_files, :changed_file_names
|
6
|
-
class_attribute :asset_glob
|
5
|
+
attr_reader :since, :path, :changed_files, :changed_file_names
|
6
|
+
class_attribute :asset_glob, :bankruptcy_count
|
7
|
+
# Search for changes with this glob
|
7
8
|
self.asset_glob = "/**/*.{js,coffee}*"
|
9
|
+
# If this many files change at once, give up hope! (Probably checked out a new branch)
|
10
|
+
self.bankruptcy_count = 5
|
8
11
|
|
9
12
|
# initialize with a path and time
|
10
13
|
# to find files which changed since that time
|
@@ -13,12 +16,11 @@ module React
|
|
13
16
|
@path = path.to_s
|
14
17
|
asset_glob = File.join(path, AssetChangeSet.asset_glob)
|
15
18
|
@changed_files = Dir.glob(asset_glob).select { |f| File.mtime(f) >= since }
|
16
|
-
@changed_file_names = changed_files.map { |f|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
19
|
+
@changed_file_names = changed_files.map { |f| File.basename(f) }
|
20
|
+
end
|
21
|
+
|
22
|
+
def bankrupt?
|
23
|
+
changed_files.length >= self.class.bankruptcy_count
|
22
24
|
end
|
23
25
|
|
24
26
|
def any?
|
@@ -34,6 +36,14 @@ module React
|
|
34
36
|
}
|
35
37
|
end
|
36
38
|
|
39
|
+
def changed_asset_contents
|
40
|
+
@changed_asset_contents ||= changed_files.map do |f|
|
41
|
+
logical_path = to_logical_path(f)
|
42
|
+
asset = ::Rails.application.assets[logical_path]
|
43
|
+
asset.to_s
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
37
47
|
private
|
38
48
|
|
39
49
|
def to_logical_path(asset_path)
|
data/lib/hot_loader/railtie.rb
CHANGED
@@ -8,20 +8,24 @@ module React
|
|
8
8
|
end
|
9
9
|
|
10
10
|
config.after_initialize do |app|
|
11
|
-
|
12
|
-
# Seems like Passenger kills threads on the main process
|
13
|
-
# In that case, `starting_worker_process` isn't good enough
|
14
|
-
# because it doesn't run :(
|
11
|
+
if ::Rails.env.development?
|
15
12
|
React::Rails::HotLoader.restart
|
16
|
-
end
|
17
13
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
14
|
+
ActionDispatch::Reloader.to_prepare do
|
15
|
+
# Seems like Passenger kills threads on the main process
|
16
|
+
# In that case, `starting_worker_process` isn't good enough
|
17
|
+
# because it doesn't run :(
|
18
|
+
React::Rails::HotLoader.restart
|
19
|
+
end
|
20
|
+
|
21
|
+
if defined?(PhusionPassenger)
|
22
|
+
PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
23
|
+
if forked
|
24
|
+
# We're in smart spawning mode.
|
25
|
+
React::Rails::HotLoader.restart
|
26
|
+
else
|
27
|
+
# We're in direct spawning mode. We don't need to do anything.
|
28
|
+
end
|
25
29
|
end
|
26
30
|
end
|
27
31
|
end
|
data/lib/hot_loader/server.rb
CHANGED
@@ -6,7 +6,7 @@ module React
|
|
6
6
|
class Server
|
7
7
|
attr_reader :host, :port, :change_set_class
|
8
8
|
|
9
|
-
def initialize(host:
|
9
|
+
def initialize(host: "0.0.0.0", port:, change_set_class: React::Rails::HotLoader::AssetChangeSet)
|
10
10
|
@host = host
|
11
11
|
@port = port
|
12
12
|
@change_set_class = change_set_class
|
@@ -16,7 +16,11 @@ module React
|
|
16
16
|
def restart
|
17
17
|
start
|
18
18
|
rescue StandardError => err
|
19
|
-
|
19
|
+
if err.message =~ /no acceptor/
|
20
|
+
React::Rails::HotLoader.log("WS server is already running (#{ws_url})")
|
21
|
+
else
|
22
|
+
React::Rails::HotLoader.error(err)
|
23
|
+
end
|
20
24
|
end
|
21
25
|
|
22
26
|
private
|
@@ -38,7 +42,17 @@ module React
|
|
38
42
|
# React::Rails::HotLoader.log("received message: #{msg}")
|
39
43
|
since_time = Time.at(msg.to_i)
|
40
44
|
changes = change_set_class.new(since: since_time)
|
41
|
-
if changes.
|
45
|
+
if changes.bankrupt?
|
46
|
+
changed_files_count = changes.changed_file_names.length
|
47
|
+
React::Rails::HotLoader.log("declared bankruptcy! (#{changed_files_count} files changed)")
|
48
|
+
|
49
|
+
bankruptcy_response = {
|
50
|
+
bankrupt: true,
|
51
|
+
changed_files_count: changed_files_count,
|
52
|
+
}
|
53
|
+
|
54
|
+
ws.send(bankruptcy_response.to_json)
|
55
|
+
elsif changes.any?
|
42
56
|
React::Rails::HotLoader.log("sent changes: #{changes.changed_file_names}")
|
43
57
|
ws.send(changes.to_json)
|
44
58
|
end
|
@@ -57,12 +71,7 @@ module React
|
|
57
71
|
end
|
58
72
|
|
59
73
|
React::Rails::HotLoader.log("started WS server (#{ws_url})")
|
60
|
-
|
61
|
-
if err.message =~ /no acceptor/
|
62
|
-
React::Rails::HotLoader.log("WS server is already running (#{ws_url})")
|
63
|
-
else
|
64
|
-
React::Rails::HotLoader.error(err)
|
65
|
-
end
|
74
|
+
|
66
75
|
end
|
67
76
|
|
68
77
|
def already_has_event_machine_server?
|
data/lib/hot_loader/version.rb
CHANGED
data/lib/hot_loader.rb
CHANGED
@@ -2,17 +2,13 @@ module React
|
|
2
2
|
module Rails
|
3
3
|
module HotLoader
|
4
4
|
mattr_accessor :server
|
5
|
+
mattr_accessor :port
|
6
|
+
self.port = 8082
|
5
7
|
|
6
|
-
#
|
7
|
-
def self.start(options={})
|
8
|
-
server_class = options.delete(:server_class) || Server
|
9
|
-
self.server = server_class.new(options)
|
10
|
-
restart
|
11
|
-
end
|
12
|
-
|
13
|
-
# Restart the server with the same options
|
8
|
+
# Start _or_ restart the server
|
14
9
|
def self.restart
|
15
|
-
server.
|
10
|
+
self.server ||= Server.new(port: port)
|
11
|
+
self.server.restart
|
16
12
|
rescue StandardError => err
|
17
13
|
React::Rails::HotLoader.error(err)
|
18
14
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: react-rails-hot-loader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Mosolgo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: em-websocket
|
@@ -210,7 +210,7 @@ files:
|
|
210
210
|
- bin/console
|
211
211
|
- bin/setup
|
212
212
|
- lib/assets/dummy/react-rails-hot-loader.js
|
213
|
-
- lib/assets/react-rails-hot-loader.js
|
213
|
+
- lib/assets/react-rails-hot-loader.js.erb
|
214
214
|
- lib/hot_loader.rb
|
215
215
|
- lib/hot_loader/asset_change_set.rb
|
216
216
|
- lib/hot_loader/asset_path.rb
|
@@ -239,7 +239,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
239
239
|
version: '0'
|
240
240
|
requirements: []
|
241
241
|
rubyforge_project:
|
242
|
-
rubygems_version: 2.
|
242
|
+
rubygems_version: 2.5.1
|
243
243
|
signing_key:
|
244
244
|
specification_version: 4
|
245
245
|
summary: Live-reload React.js components with Ruby on Rails
|