webpacker-jets 3.2.100
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.eslintignore +4 -0
- data/.eslintrc.js +14 -0
- data/.gitignore +6 -0
- data/.rubocop.yml +124 -0
- data/.travis.yml +32 -0
- data/CHANGELOG.md +523 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +154 -0
- data/MIT-LICENSE +20 -0
- data/README.md +445 -0
- data/Rakefile +12 -0
- data/docs/assets.md +106 -0
- data/docs/cloud9.md +310 -0
- data/docs/css.md +116 -0
- data/docs/deployment.md +74 -0
- data/docs/docker.md +49 -0
- data/docs/env.md +65 -0
- data/docs/es6.md +53 -0
- data/docs/folder-structure.md +66 -0
- data/docs/misc.md +23 -0
- data/docs/props.md +223 -0
- data/docs/testing.md +128 -0
- data/docs/troubleshooting.md +119 -0
- data/docs/typescript.md +116 -0
- data/docs/webpack-dev-server.md +92 -0
- data/docs/webpack.md +297 -0
- data/docs/yarn.md +12 -0
- data/exe/webpack +8 -0
- data/exe/webpack-dev-server +8 -0
- data/gemfiles/Gemfile-rails-edge +13 -0
- data/gemfiles/Gemfile-rails.4.2.x +10 -0
- data/gemfiles/Gemfile-rails.5.0.x +10 -0
- data/gemfiles/Gemfile-rails.5.1.x +10 -0
- data/lib/install/angular.rb +27 -0
- data/lib/install/coffee.rb +22 -0
- data/lib/install/config/.babelrc +18 -0
- data/lib/install/config/.postcssrc.yml +3 -0
- data/lib/install/config/webpack/development.js +3 -0
- data/lib/install/config/webpack/environment.js +3 -0
- data/lib/install/config/webpack/production.js +3 -0
- data/lib/install/config/webpack/staging.js +3 -0
- data/lib/install/config/webpack/test.js +3 -0
- data/lib/install/config/webpacker.yml +79 -0
- data/lib/install/elm.rb +38 -0
- data/lib/install/erb.rb +22 -0
- data/lib/install/examples/angular/hello_angular.js +7 -0
- data/lib/install/examples/angular/hello_angular/app/app.component.ts +9 -0
- data/lib/install/examples/angular/hello_angular/app/app.module.ts +16 -0
- data/lib/install/examples/angular/hello_angular/index.ts +8 -0
- data/lib/install/examples/angular/hello_angular/polyfills.ts +73 -0
- data/lib/install/examples/angular/tsconfig.json +19 -0
- data/lib/install/examples/coffee/hello_coffee.coffee +4 -0
- data/lib/install/examples/elm/Main.elm +54 -0
- data/lib/install/examples/elm/hello_elm.js +12 -0
- data/lib/install/examples/erb/hello_erb.js.erb +6 -0
- data/lib/install/examples/react/.babelrc +6 -0
- data/lib/install/examples/react/hello_react.jsx +26 -0
- data/lib/install/examples/vue/app.vue +22 -0
- data/lib/install/examples/vue/hello_vue.js +70 -0
- data/lib/install/javascript/packs/application.js +10 -0
- data/lib/install/loaders/coffee.js +6 -0
- data/lib/install/loaders/elm.js +23 -0
- data/lib/install/loaders/erb.js +11 -0
- data/lib/install/loaders/typescript.js +6 -0
- data/lib/install/loaders/vue.js +13 -0
- data/lib/install/react.rb +28 -0
- data/lib/install/template.rb +37 -0
- data/lib/install/vue.rb +26 -0
- data/lib/tasks/installers.rake +24 -0
- data/lib/tasks/webpacker.rake +22 -0
- data/lib/tasks/webpacker/check_binstubs.rake +12 -0
- data/lib/tasks/webpacker/check_node.rake +24 -0
- data/lib/tasks/webpacker/check_yarn.rake +24 -0
- data/lib/tasks/webpacker/clobber.rake +16 -0
- data/lib/tasks/webpacker/compile.rake +41 -0
- data/lib/tasks/webpacker/install.rake +13 -0
- data/lib/tasks/webpacker/verify_install.rake +16 -0
- data/lib/tasks/webpacker/yarn_install.rake +6 -0
- data/lib/webpacker.rb +32 -0
- data/lib/webpacker/commands.rb +23 -0
- data/lib/webpacker/compiler.rb +88 -0
- data/lib/webpacker/configuration.rb +87 -0
- data/lib/webpacker/dev_server.rb +61 -0
- data/lib/webpacker/dev_server_proxy.rb +26 -0
- data/lib/webpacker/dev_server_runner.rb +51 -0
- data/lib/webpacker/helper.rb +66 -0
- data/lib/webpacker/instance.rb +44 -0
- data/lib/webpacker/manifest.rb +75 -0
- data/lib/webpacker/railtie.rb +82 -0
- data/lib/webpacker/rake_tasks.rb +6 -0
- data/lib/webpacker/runner.rb +22 -0
- data/lib/webpacker/version.rb +9 -0
- data/lib/webpacker/webpack_runner.rb +15 -0
- data/package.json +67 -0
- data/package/__tests__/environment.js +74 -0
- data/package/config.js +34 -0
- data/package/config_types/__tests__/config_list.js +123 -0
- data/package/config_types/__tests__/config_object.js +43 -0
- data/package/config_types/config_list.js +85 -0
- data/package/config_types/config_object.js +55 -0
- data/package/config_types/index.js +7 -0
- data/package/environment.js +116 -0
- data/package/environments/development.js +46 -0
- data/package/environments/production.js +37 -0
- data/package/environments/test.js +3 -0
- data/package/index.js +20 -0
- data/package/rules/babel.js +13 -0
- data/package/rules/css.js +39 -0
- data/package/rules/file.js +13 -0
- data/package/rules/index.js +11 -0
- data/package/rules/sass.js +15 -0
- data/package/utils/__tests__/deep_assign.js +11 -0
- data/package/utils/__tests__/deep_merge.js +10 -0
- data/package/utils/__tests__/objectify.js +9 -0
- data/package/utils/deep_assign.js +22 -0
- data/package/utils/deep_merge.js +23 -0
- data/package/utils/helpers.js +32 -0
- data/package/utils/objectify.js +4 -0
- data/test/command_test.rb +27 -0
- data/test/compiler_test.rb +35 -0
- data/test/configuration_test.rb +69 -0
- data/test/dev_server_test.rb +24 -0
- data/test/helper_test.rb +52 -0
- data/test/manifest_test.rb +28 -0
- data/test/rake_tasks_test.rb +29 -0
- data/test/test_app/Rakefile +3 -0
- data/test/test_app/app/javascript/packs/application.js +10 -0
- data/test/test_app/config/application.rb +11 -0
- data/test/test_app/config/environment.rb +4 -0
- data/test/test_app/config/webpacker.yml +65 -0
- data/test/test_app/public/packs/manifest.json +6 -0
- data/test/test_helper.rb +29 -0
- data/webpacker-jets.gemspec +29 -0
- data/yarn.lock +5768 -0
- metadata +250 -0
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
require "rake/testtask"
|
4
|
+
|
5
|
+
Rake::TestTask.new(:test) do |t|
|
6
|
+
t.libs << "test"
|
7
|
+
t.libs << "lib"
|
8
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
9
|
+
t.verbose = true
|
10
|
+
end
|
11
|
+
|
12
|
+
task default: :test
|
data/docs/assets.md
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
# Assets
|
2
|
+
|
3
|
+
|
4
|
+
Static assets like images and fonts support is enabled out-of-box
|
5
|
+
and you can link them into your JavaScript app code and have them
|
6
|
+
compiled automatically.
|
7
|
+
|
8
|
+
|
9
|
+
## Import from node modules
|
10
|
+
|
11
|
+
You can also import styles from `node_modules` using the following syntax.
|
12
|
+
Please note that your styles will always be extracted into `[pack_name].css`:
|
13
|
+
|
14
|
+
```sass
|
15
|
+
// app/javascript/styles.sass
|
16
|
+
// ~ to tell webpack that this is not a relative import:
|
17
|
+
|
18
|
+
@import '~@material/animation/mdc-animation'
|
19
|
+
@import '~bootstrap/dist/css/bootstrap'
|
20
|
+
```
|
21
|
+
|
22
|
+
```js
|
23
|
+
// Your main app pack
|
24
|
+
// app/javascript/packs/app.js
|
25
|
+
|
26
|
+
import '../styles'
|
27
|
+
```
|
28
|
+
|
29
|
+
```erb
|
30
|
+
<%# In your views %>
|
31
|
+
|
32
|
+
<%= javascript_pack_tag 'app' %>
|
33
|
+
<%= stylesheet_pack_tag 'app' %>
|
34
|
+
```
|
35
|
+
|
36
|
+
|
37
|
+
## Import from Sprockets using helpers
|
38
|
+
|
39
|
+
It's possible to link to assets that have been precompiled by Sprockets. Add the `.erb` extension to your JavaScript file, then you can use Sprockets' asset helpers:
|
40
|
+
|
41
|
+
```erb
|
42
|
+
<%# app/javascript/my_pack/example.js.erb %>
|
43
|
+
|
44
|
+
<% helpers = ActionController::Base.helpers %>
|
45
|
+
const railsImagePath = "<%= helpers.image_path('rails.png') %>"
|
46
|
+
```
|
47
|
+
|
48
|
+
This is enabled by the `rails-erb-loader` loader rule in `config/webpack/loaders/erb.js`.
|
49
|
+
|
50
|
+
|
51
|
+
## Using babel module resolver
|
52
|
+
|
53
|
+
You can also use [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver) to reference assets directly from `app/assets/**`
|
54
|
+
|
55
|
+
```bash
|
56
|
+
yarn add babel-plugin-module-resolver
|
57
|
+
```
|
58
|
+
|
59
|
+
Specify the plugin in your `.babelrc` with the custom root or alias. Here's an example:
|
60
|
+
|
61
|
+
```json
|
62
|
+
{
|
63
|
+
"plugins": [
|
64
|
+
["module-resolver", {
|
65
|
+
"root": ["./app"],
|
66
|
+
"alias": {
|
67
|
+
"assets": "./assets"
|
68
|
+
}
|
69
|
+
}]
|
70
|
+
]
|
71
|
+
}
|
72
|
+
```
|
73
|
+
|
74
|
+
And then within your javascript app code:
|
75
|
+
|
76
|
+
```js
|
77
|
+
// Note: we don't have do any ../../ jazz
|
78
|
+
|
79
|
+
import FooImage from 'assets/images/foo-image.png'
|
80
|
+
import 'assets/stylesheets/bar'
|
81
|
+
```
|
82
|
+
|
83
|
+
|
84
|
+
## Link in your Rails views
|
85
|
+
|
86
|
+
You can also link `js/images/styles/fonts` used within your js app in views using
|
87
|
+
`asset_pack_path` helper. This helper is useful in cases where you just want to
|
88
|
+
create a `<link rel="prefetch">` or `<img />` for an asset.
|
89
|
+
|
90
|
+
```yml
|
91
|
+
app/javascript:
|
92
|
+
- packs
|
93
|
+
- hello_react.js
|
94
|
+
- styles
|
95
|
+
- hello_react.css
|
96
|
+
- images
|
97
|
+
- calendar.png
|
98
|
+
```
|
99
|
+
|
100
|
+
```erb
|
101
|
+
<%= asset_pack_path 'hello_react.css' %>
|
102
|
+
<%# => "/packs/hello_react.css" %>
|
103
|
+
|
104
|
+
<img src="<%= asset_pack_path 'images/calendar.png' %>" />
|
105
|
+
<% # => <img src="/packs/images/calendar.png" /> %>
|
106
|
+
```
|
data/docs/cloud9.md
ADDED
@@ -0,0 +1,310 @@
|
|
1
|
+
# Webpack dev server and Rails on Cloud9
|
2
|
+
|
3
|
+
**Please note that this article is particularly relevant when
|
4
|
+
migrating the [`webpacker`] gem from v3.0.1 to v3.0.2, as described in
|
5
|
+
the [below](#binstub-versions).**
|
6
|
+
|
7
|
+
[**`[Go to tl;dr]`**](#tldr)
|
8
|
+
|
9
|
+
## Contents
|
10
|
+
|
11
|
+
- [Context](#context)
|
12
|
+
- [Binstub versions](#binstub-versions)
|
13
|
+
- [Quick solution](#quick-solution)
|
14
|
+
- [Flexible solution](#flexible-solution)
|
15
|
+
- [Sources](#sources)
|
16
|
+
- [Versions](#versions)
|
17
|
+
- [tl;dr](#tldr)
|
18
|
+
|
19
|
+
## Context
|
20
|
+
|
21
|
+
This article describes how to properly configure
|
22
|
+
[`webpack-dev-server`] with [`webpacker`] gem on a [Cloud9] workspace.
|
23
|
+
After a preliminary remark about the proper binstub version of the
|
24
|
+
`./bin/webpack-dev-server` script, this article presents two ways to
|
25
|
+
tackle the task: a simple and [quick solution](#quick-solution), which
|
26
|
+
is sufficient if we work alone on a project, and a slightly more
|
27
|
+
involved but [flexible approach](#flexible-solution), that can be
|
28
|
+
useful when several people might work in the same codebase.
|
29
|
+
|
30
|
+
[Cloud9]: https://c9.io
|
31
|
+
[`webpack-dev-server`]: https://github.com/webpack/webpack-dev-server
|
32
|
+
[`webpacker`]: https://github.com/rails/webpacker
|
33
|
+
|
34
|
+
## Binstub versions
|
35
|
+
|
36
|
+
A lot of the confusion about the [`webpack-dev-server`] options and
|
37
|
+
why they might not be properly taken into account, might be due to an
|
38
|
+
outdated version of the `./bin/webpack-dev-server` script. The script
|
39
|
+
created by the `rails webpacker:install` task of the [`webpacker`] gem
|
40
|
+
v3.0.1 ([source][v3.0.1/lib/install/bin/webpack-dev-server.tt]) is not
|
41
|
+
compatible with how v3.0.2 (sic) of the gem handles the
|
42
|
+
[`webpack-dev-server`] option flags (see full list of
|
43
|
+
[versions](#versions) below), which logically expects the
|
44
|
+
corresponding [binstub version][#833] of the script
|
45
|
+
([source][v3.0.2/exe/webpack-dev-server]). So please make sure that
|
46
|
+
you are using the [correct binstub][v3.0.2/exe/webpack-dev-server]
|
47
|
+
(the same applies to [`./bin/webpack`][v3.0.2/exe/webpack]). To be
|
48
|
+
fair, the [changelog of v3.0.2] properly mentions the change:
|
49
|
+
|
50
|
+
> - Added: Binstubs [#833]
|
51
|
+
> - (...)
|
52
|
+
> - Removed: Inline CLI args for dev server binstub, use env variables
|
53
|
+
instead
|
54
|
+
|
55
|
+
[changelog of v3.0.2]: https://github.com/rails/webpacker/blob/v3.0.2/CHANGELOG.md#302---2017-10-04
|
56
|
+
[v3.0.1/lib/install/bin/webpack-dev-server.tt]: https://github.com/rails/webpacker/blob/v3.0.1/lib/install/bin/webpack-dev-server.tt
|
57
|
+
[v3.0.2/exe/webpack-dev-server]: https://github.com/rails/webpacker/blob/v3.0.2/exe/webpack-dev-server
|
58
|
+
[v3.0.2/exe/webpack]: https://github.com/rails/webpacker/blob/v3.0.2/exe/webpack
|
59
|
+
[#833]: https://github.com/rails/webpacker/pull/833/files
|
60
|
+
|
61
|
+
## Quick solution
|
62
|
+
|
63
|
+
If you are working alone, the easiest way to fix the configuration of
|
64
|
+
the [`webpack-dev-server`] is to modify the `development.dev_server`
|
65
|
+
entry of the `config/webpacker.yml` file.
|
66
|
+
|
67
|
+
### `config/webpacker.yml` file
|
68
|
+
|
69
|
+
The `development.dev_server` entry of the `config/webpacker.yml` file
|
70
|
+
has to be changed from the following default values:
|
71
|
+
|
72
|
+
```yaml
|
73
|
+
dev_server:
|
74
|
+
https: false
|
75
|
+
host: localhost
|
76
|
+
port: 3035
|
77
|
+
public: localhost:3035
|
78
|
+
hmr: false
|
79
|
+
# Inline should be set to true if using HMR
|
80
|
+
inline: true
|
81
|
+
overlay: true
|
82
|
+
disable_host_check: true
|
83
|
+
use_local_ip: false
|
84
|
+
```
|
85
|
+
|
86
|
+
into the these custom configuration:
|
87
|
+
|
88
|
+
```yaml
|
89
|
+
dev_server:
|
90
|
+
https: true
|
91
|
+
host: localhost
|
92
|
+
port: 8082
|
93
|
+
public: your-workspace-name-yourusername.c9users.io:8082
|
94
|
+
hmr: false
|
95
|
+
inline: false
|
96
|
+
overlay: true
|
97
|
+
disable_host_check: true
|
98
|
+
use_local_ip: false
|
99
|
+
```
|
100
|
+
|
101
|
+
You can obtain the value `your-workspace-name-yourusername.c9users.io`
|
102
|
+
for your [Cloud9] workspace with `echo ${C9_HOSTNAME}`.
|
103
|
+
|
104
|
+
There are four main differences with the approaches found in the
|
105
|
+
mentioned [sources](#sources):
|
106
|
+
|
107
|
+
- Some solutions suggested to set the [`host`][devserver-host] option
|
108
|
+
to `your-workspace-name-yourusername.c9users.io`, which required to
|
109
|
+
add a line to the `/etc/hosts` file by running `echo "0.0.0.0
|
110
|
+
${C9_HOSTNAME}" | sudo tee -a /etc/hosts`. This was only necessary
|
111
|
+
due to restrictions in previous versions of [`webpacker`] and how
|
112
|
+
the value of the [`public`][devserver-public] setting was
|
113
|
+
calculated. Currently it is [no longer necessary][pr-comment-hosts]
|
114
|
+
to modify the `/etc/hosts` file because the [`host`][devserver-host]
|
115
|
+
setting can be kept as `localhost`.
|
116
|
+
|
117
|
+
[pr-comment-hosts]: https://github.com/rails/webpacker/pull/1033#pullrequestreview-78992024
|
118
|
+
|
119
|
+
- Some solutions stressed the need to set the
|
120
|
+
[`https`][devserver-https] option to `false` but this failed with
|
121
|
+
`net::ERR_ABORTED` in the browser console and raised the following
|
122
|
+
exception in the server when the client tried to get the
|
123
|
+
JavaScript sources:
|
124
|
+
|
125
|
+
```
|
126
|
+
#<OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=unknown state>
|
127
|
+
```
|
128
|
+
|
129
|
+
Setting `https: true` removes the issue.
|
130
|
+
|
131
|
+
- By leaving the [`inline`][devserver-inline] option to the default
|
132
|
+
`false` value, the live compilation still works but the browser
|
133
|
+
console constantly reports the following error:
|
134
|
+
|
135
|
+
```
|
136
|
+
Failed to load https://your-workspace-name-yourusername.c9users.io:8082/sockjs-node/info?t=1511016561187: No 'Access-Control-Allow-Origin' header is present on the requested resource.
|
137
|
+
Origin 'https://your-workspace-name-yourusername.c9users.io' is therefore not allowed access. The response had HTTP status code 503.
|
138
|
+
```
|
139
|
+
|
140
|
+
Setting `inline: false` removes the issue.
|
141
|
+
|
142
|
+
|
143
|
+
- None of the solutions suggested to set the
|
144
|
+
[`public`][devserver-public] option in the `config/webpacker.yml`
|
145
|
+
file and some suggested to pass it to the `webpack-dev-server`
|
146
|
+
command line. By setting it in the configuration file we don't need
|
147
|
+
to care about it in the terminal.
|
148
|
+
|
149
|
+
[devserver-host]: https://webpack.js.org/configuration/dev-server/#devserver-host
|
150
|
+
[devserver-https]: https://webpack.js.org/configuration/dev-server/#devserver-https
|
151
|
+
[devserver-inline]: https://webpack.js.org/configuration/dev-server/#devserver-inline
|
152
|
+
[devserver-public]: https://webpack.js.org/configuration/dev-server/#devserver-public
|
153
|
+
|
154
|
+
With this configuration, running as usual `./bin/webpack-dev-server`
|
155
|
+
in one terminal and `./bin/rails s -b $IP -p $PORT` in another should
|
156
|
+
work.
|
157
|
+
|
158
|
+
## Flexible solution
|
159
|
+
|
160
|
+
The previous solution is useful and fast to implement, but if you are
|
161
|
+
working with other people on the same repo it can be tricky to
|
162
|
+
maintain the proper configuration in the `config/webpacker.yml` file.
|
163
|
+
Moreover, the hostname of your [Cloud9] workspace is hardcoded, so
|
164
|
+
that the configuration is not portable.
|
165
|
+
|
166
|
+
A hint about another way to configure the `webpack-dev-server` can be
|
167
|
+
found in the [README of this repo][`webpacker` documentation]:
|
168
|
+
|
169
|
+
> You can use environment variables as options supported by
|
170
|
+
> webpack-dev-server in the form `WEBPACKER_DEV_SERVER_<OPTION>`.
|
171
|
+
> Please note that these environment variables will always take
|
172
|
+
> precedence over the ones already set in the configuration file.
|
173
|
+
|
174
|
+
Note that when the configuration of the [`webpack-dev-server`] is
|
175
|
+
tweaked with ENV variables, those same values _have to be passed_ to
|
176
|
+
the `rails server` process as well in order to let it use the _same_
|
177
|
+
configuration.
|
178
|
+
|
179
|
+
Taking that into account, a flexible solution can be implemented using
|
180
|
+
[`foreman`] with the following `Procfile.dev`:
|
181
|
+
|
182
|
+
[`foreman`]: https://github.com/ddollar/foreman
|
183
|
+
|
184
|
+
```Procfile
|
185
|
+
web: ./bin/rails server -b ${RAILS_SERVER_BINDING:-localhost} -p ${RAILS_SERVER_PORT:-3000}
|
186
|
+
webpacker: ./bin/webpack-dev-server
|
187
|
+
```
|
188
|
+
|
189
|
+
and this `bin/start` script:
|
190
|
+
|
191
|
+
```bash
|
192
|
+
#!/bin/bash
|
193
|
+
|
194
|
+
# Immediately exit script on first error
|
195
|
+
set -e -o pipefail
|
196
|
+
|
197
|
+
APP_ROOT_FOLDER="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )"
|
198
|
+
cd "${APP_ROOT_FOLDER}"
|
199
|
+
|
200
|
+
if [ -n "${C9_USER}" ]; then
|
201
|
+
# We are in a Cloud9 machine
|
202
|
+
|
203
|
+
# Make sure that Postgres is running
|
204
|
+
sudo service postgresql status || sudo service postgresql start
|
205
|
+
|
206
|
+
# Adapt the configuration of the webpack-dev-server
|
207
|
+
export APP_DOMAIN="${C9_HOSTNAME}"
|
208
|
+
export RAILS_SERVER_BINDING='0.0.0.0'
|
209
|
+
export RAILS_SERVER_PORT='8080'
|
210
|
+
export WEBPACKER_DEV_SERVER_PORT='8082'
|
211
|
+
export WEBPACKER_DEV_SERVER_HTTPS='true'
|
212
|
+
export WEBPACKER_DEV_SERVER_HOST="localhost"
|
213
|
+
export WEBPACKER_DEV_SERVER_PUBLIC="${C9_HOSTNAME}:${WEBPACKER_DEV_SERVER_PORT}"
|
214
|
+
export WEBPACKER_DEV_SERVER_HMR='false'
|
215
|
+
export WEBPACKER_DEV_SERVER_INLINE='false'
|
216
|
+
export WEBPACKER_DEV_SERVER_OVERLAY='true'
|
217
|
+
export WEBPACKER_DEV_SERVER_DISABLE_HOST_CHECK='true'
|
218
|
+
export WEBPACKER_DEV_SERVER_USE_LOCAL_IP='false'
|
219
|
+
fi
|
220
|
+
|
221
|
+
foreman start -f Procfile.dev
|
222
|
+
```
|
223
|
+
|
224
|
+
With these two scripts in place, the application can always be started
|
225
|
+
by running `bin/start`, in both [Cloud9] and other systems. The
|
226
|
+
trick is that by exporting the `WEBPACKER_DEV_SERVER_*` variables
|
227
|
+
before calling `foreman start`, we make sure that those values are
|
228
|
+
available to both `webpack-dev-server` and `rails server` processes.
|
229
|
+
|
230
|
+
## Sources
|
231
|
+
|
232
|
+
- ["Webpack dev server and Rails on Cloud9"][original-article] (the
|
233
|
+
original source for the present article, inspired by this
|
234
|
+
[comment][original-comment])
|
235
|
+
- ["Making Webpacker run on Cloud 9"] (GitHub issue)
|
236
|
+
- ["Anyone here got webpack-dev-server to work on Cloud 9?"] (GitHub issue)
|
237
|
+
- [`webpacker` documentation]
|
238
|
+
- [`webpacker/dev_server.rb` code]
|
239
|
+
- [`webpack-dev-server` documentation]
|
240
|
+
- ["Using Rails With Webpack in Cloud 9"] (blog article)
|
241
|
+
|
242
|
+
[original-article]: http://rbf.io/en/blog/2017/11/18/webpack-dev-server-and-rails-on-cloud9/
|
243
|
+
[original-comment]: https://github.com/rails/webpacker/issues/176#issuecomment-345532309
|
244
|
+
["Making Webpacker run on Cloud 9"]: https://github.com/rails/webpacker/issues/176
|
245
|
+
["Anyone here got webpack-dev-server to work on Cloud 9?"]: https://github.com/webpack/webpack-dev-server/issues/230
|
246
|
+
[`webpacker` documentation]: https://github.com/rails/webpacker/tree/v3.0.2#development
|
247
|
+
[`webpacker/dev_server.rb` code]: https://github.com/rails/webpacker/blob/v3.0.2/lib/webpacker/dev_server.rb#L55
|
248
|
+
[`webpack-dev-server` documentation]: https://webpack.js.org/configuration/dev-server/
|
249
|
+
["Using Rails With Webpack in Cloud 9"]: http://aalvarez.me/blog/posts/using-rails-with-webpack-in-cloud-9.html
|
250
|
+
|
251
|
+
## Versions
|
252
|
+
|
253
|
+
Since things in this ecosystem move fast, it's important to mention the
|
254
|
+
versions of the world for which this documentation is relevant:
|
255
|
+
|
256
|
+
```shell
|
257
|
+
$ egrep '^ ?(ruby|webpacker|rails) ' Gemfile.lock
|
258
|
+
rails (5.1.4)
|
259
|
+
webpacker (3.0.2)
|
260
|
+
ruby 2.4.2p198
|
261
|
+
|
262
|
+
$ yarn versions
|
263
|
+
yarn versions v1.1.0
|
264
|
+
{ http_parser: '2.7.0',
|
265
|
+
node: '8.5.0',
|
266
|
+
v8: '6.0.287.53',
|
267
|
+
uv: '1.14.1',
|
268
|
+
zlib: '1.2.11',
|
269
|
+
ares: '1.10.1-DEV',
|
270
|
+
modules: '57',
|
271
|
+
nghttp2: '1.25.0',
|
272
|
+
openssl: '1.0.2l',
|
273
|
+
icu: '59.1',
|
274
|
+
unicode: '9.0',
|
275
|
+
cldr: '31.0.1',
|
276
|
+
tz: '2017b' }
|
277
|
+
|
278
|
+
$ cat /etc/os-release | head -6
|
279
|
+
NAME="Ubuntu"
|
280
|
+
VERSION="14.04.5 LTS, Trusty Tahr"
|
281
|
+
ID=ubuntu
|
282
|
+
ID_LIKE=debian
|
283
|
+
PRETTY_NAME="Ubuntu 14.04.5 LTS"
|
284
|
+
VERSION_ID="14.04"
|
285
|
+
```
|
286
|
+
|
287
|
+
Everything was tested using Chrome Version 62.
|
288
|
+
|
289
|
+
## tl;dr
|
290
|
+
|
291
|
+
1. Make sure that you are running the [proper binstub
|
292
|
+
version](#binstub-versions) of `./bin/webpack-dev-server`.
|
293
|
+
|
294
|
+
1. Change the `development.dev_server` entry `config/webpacker.yml` file into:
|
295
|
+
|
296
|
+
```yaml
|
297
|
+
dev_server:
|
298
|
+
https: true
|
299
|
+
host: localhost
|
300
|
+
port: 8082
|
301
|
+
public: your-workspace-name-yourusername.c9users.io:8082
|
302
|
+
hmr: false
|
303
|
+
inline: false
|
304
|
+
overlay: true
|
305
|
+
disable_host_check: true
|
306
|
+
use_local_ip: false
|
307
|
+
```
|
308
|
+
|
309
|
+
1. Now running as usual `./bin/webpack-dev-server` in one terminal and
|
310
|
+
`./bin/rails s -b $IP -p $PORT` in another should work as expected.
|
data/docs/css.md
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
# CSS, Sass and SCSS
|
2
|
+
|
3
|
+
|
4
|
+
Webpacker supports importing CSS, Sass and SCSS files directly into your JavaScript files.
|
5
|
+
|
6
|
+
|
7
|
+
## Import styles into your JS app
|
8
|
+
|
9
|
+
```sass
|
10
|
+
// app/javascript/hello_react/styles/hello-react.sass
|
11
|
+
|
12
|
+
.hello-react
|
13
|
+
padding: 20px
|
14
|
+
font-size: 12px
|
15
|
+
```
|
16
|
+
|
17
|
+
```js
|
18
|
+
// React component example
|
19
|
+
// app/javascripts/packs/hello_react.jsx
|
20
|
+
|
21
|
+
import React from 'react'
|
22
|
+
import helloIcon from '../hello_react/images/icon.png'
|
23
|
+
import '../hello_react/styles/hello-react'
|
24
|
+
|
25
|
+
const Hello = props => (
|
26
|
+
<div className="hello-react">
|
27
|
+
<img src={helloIcon} alt="hello-icon" />
|
28
|
+
<p>Hello {props.name}!</p>
|
29
|
+
</div>
|
30
|
+
)
|
31
|
+
```
|
32
|
+
|
33
|
+
|
34
|
+
## Link styles from your Rails views
|
35
|
+
|
36
|
+
Under the hood webpack uses
|
37
|
+
[extract-text-webpack-plugin](https://github.com/webpack-contrib/extract-text-webpack-plugin) plugin to extract all the referenced styles within your app and compile it into
|
38
|
+
a separate `[pack_name].css` bundle so that in your view you can use the
|
39
|
+
`stylesheet_pack_tag` helper.
|
40
|
+
|
41
|
+
```erb
|
42
|
+
<%= stylesheet_pack_tag 'hello_react' %>
|
43
|
+
```
|
44
|
+
|
45
|
+
|
46
|
+
## Add bootstrap
|
47
|
+
|
48
|
+
You can use Yarn to add bootstrap or any other modules available on npm:
|
49
|
+
|
50
|
+
```bash
|
51
|
+
yarn add bootstrap
|
52
|
+
```
|
53
|
+
|
54
|
+
Import Bootstrap and theme (optional) CSS in your app/javascript/packs/app.js file:
|
55
|
+
|
56
|
+
```js
|
57
|
+
import 'bootstrap/dist/css/bootstrap'
|
58
|
+
import 'bootstrap/dist/css/bootstrap-theme'
|
59
|
+
```
|
60
|
+
|
61
|
+
Or in your app/javascript/app.sass file:
|
62
|
+
|
63
|
+
```sass
|
64
|
+
// ~ to tell that this is not a relative import
|
65
|
+
|
66
|
+
@import '~bootstrap/dist/css/bootstrap'
|
67
|
+
@import '~bootstrap/dist/css/bootstrap-theme'
|
68
|
+
```
|
69
|
+
|
70
|
+
|
71
|
+
## Post-Processing CSS
|
72
|
+
|
73
|
+
Webpacker out-of-the-box provides CSS post-processing using
|
74
|
+
[postcss-loader](https://github.com/postcss/postcss-loader)
|
75
|
+
and the installer sets up a standard `.postcssrc.yml`
|
76
|
+
file in your app root with standard plugins.
|
77
|
+
|
78
|
+
```yml
|
79
|
+
plugins:
|
80
|
+
postcss-import: {}
|
81
|
+
postcss-cssnext: {}
|
82
|
+
```
|
83
|
+
|
84
|
+
## Using CSS with [vue-loader](https://github.com/vuejs/vue-loader)
|
85
|
+
|
86
|
+
Vue templates require loading the stylesheet in your application in
|
87
|
+
order for CSS to work. This is in addition to loading the JavaScript
|
88
|
+
file for the entry point. Loading the stylesheet will also load the
|
89
|
+
CSS for any nested components.
|
90
|
+
|
91
|
+
```erb
|
92
|
+
<%= stylesheet_pack_tag 'hello_vue' %>
|
93
|
+
<%= javascript_pack_tag 'hello_vue' %>
|
94
|
+
```
|
95
|
+
|
96
|
+
## Resolve url loader
|
97
|
+
|
98
|
+
Since `Sass/libsass` does not provide url rewriting, all linked assets must be relative to the output. Add the missing url rewriting using the resolve-url-loader. Place it directly after the sass-loader in the loader chain.
|
99
|
+
|
100
|
+
|
101
|
+
```bash
|
102
|
+
yarn add resolve-url-loader
|
103
|
+
```
|
104
|
+
|
105
|
+
```js
|
106
|
+
// webpack/environment.js
|
107
|
+
const { environment } = require('@rails/webpacker')
|
108
|
+
|
109
|
+
// resolve-url-loader must be used before sass-loader
|
110
|
+
environment.loaders.get('sass').use.splice(-1, 0, {
|
111
|
+
loader: 'resolve-url-loader',
|
112
|
+
options: {
|
113
|
+
attempts: 1
|
114
|
+
}
|
115
|
+
});
|
116
|
+
```
|