webpacker 4.2.2 → 5.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.node-version +1 -1
- data/.travis.yml +7 -20
- data/CHANGELOG.md +32 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +8 -5
- data/README.md +52 -280
- data/docs/css.md +3 -4
- data/docs/deployment.md +2 -2
- data/docs/docker.md +17 -17
- data/docs/engines.md +13 -0
- data/docs/env.md +0 -2
- data/docs/integrations.md +220 -0
- data/docs/testing.md +1 -2
- data/docs/typescript.md +48 -28
- data/lib/install/config/webpacker.yml +0 -4
- data/lib/install/examples/react/tsconfig.json +2 -1
- data/lib/install/examples/typescript/tsconfig.json +2 -1
- data/lib/install/loaders/svelte.js +2 -2
- data/lib/install/template.rb +1 -1
- data/lib/install/typescript.rb +5 -12
- data/lib/tasks/webpacker/check_node.rake +14 -7
- data/lib/tasks/webpacker/check_yarn.rake +16 -9
- data/lib/tasks/webpacker/clean.rake +12 -6
- data/lib/tasks/webpacker/clobber.rake +8 -4
- data/lib/tasks/webpacker/yarn_install.rake +5 -16
- data/lib/webpacker/commands.rb +33 -9
- data/lib/webpacker/compiler.rb +2 -3
- data/lib/webpacker/configuration.rb +1 -5
- data/lib/webpacker/dev_server_proxy.rb +3 -1
- data/lib/webpacker/dev_server_runner.rb +4 -4
- data/lib/webpacker/helper.rb +12 -12
- data/lib/webpacker/manifest.rb +4 -4
- data/lib/webpacker/railtie.rb +0 -43
- data/lib/webpacker/version.rb +1 -1
- data/package.json +35 -35
- data/package/__tests__/dev_server.js +2 -0
- data/package/dev_server.js +1 -1
- data/package/environments/__tests__/base.js +10 -0
- data/package/environments/base.js +12 -1
- data/package/environments/development.js +0 -4
- data/package/rules/babel.js +1 -1
- data/package/rules/sass.js +7 -1
- data/test/manifest_test.rb +37 -6
- data/test/rake_tasks_test.rb +11 -0
- data/test/test_app/app/javascript/packs/multi_entry.css +4 -0
- data/test/test_app/app/javascript/packs/multi_entry.js +4 -0
- data/test/test_app/config/application.rb +0 -1
- data/webpacker.gemspec +4 -3
- data/yarn.lock +2627 -1547
- metadata +28 -13
- data/gemfiles/Gemfile-rails.4.2.x +0 -9
- data/gemfiles/Gemfile-rails.5.0.x +0 -9
- data/gemfiles/Gemfile-rails.5.1.x +0 -9
- data/lib/install/loaders/typescript.js +0 -11
data/docs/css.md
CHANGED
@@ -213,11 +213,10 @@ const { environment } = require('@rails/webpacker')
|
|
213
213
|
|
214
214
|
// resolve-url-loader must be used before sass-loader
|
215
215
|
environment.loaders.get('sass').use.splice(-1, 0, {
|
216
|
-
loader: 'resolve-url-loader'
|
217
|
-
options: {
|
218
|
-
attempts: 1
|
219
|
-
}
|
216
|
+
loader: 'resolve-url-loader'
|
220
217
|
});
|
218
|
+
|
219
|
+
module.exports = environment
|
221
220
|
```
|
222
221
|
|
223
222
|
## Working with TypeScript
|
data/docs/deployment.md
CHANGED
@@ -13,8 +13,8 @@ By default the output will look like this in different environments:
|
|
13
13
|
<script src="http://localhost:8080/calendar-0bd141f6d9360cf4a7f5.js"></script>
|
14
14
|
<link rel="stylesheet" media="screen" href="http://localhost:8080/calendar-dc02976b5f94b507e3b6.css">
|
15
15
|
<!-- In production or development mode -->
|
16
|
-
<script src="/packs/calendar-0bd141f6d9360cf4a7f5.js"></script>
|
17
|
-
<link rel="stylesheet" media="screen" href="/packs/calendar-dc02976b5f94b507e3b6.css">
|
16
|
+
<script src="/packs/js/calendar-0bd141f6d9360cf4a7f5.js"></script>
|
17
|
+
<link rel="stylesheet" media="screen" href="/packs/css/calendar-dc02976b5f94b507e3b6.css">
|
18
18
|
```
|
19
19
|
|
20
20
|
|
data/docs/docker.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Docker
|
2
2
|
|
3
|
-
To setup webpacker with a dockerized Rails application
|
3
|
+
To setup webpacker with a dockerized Rails application.
|
4
4
|
|
5
5
|
First, add a new service for webpacker in docker-compose.yml:
|
6
6
|
|
@@ -9,8 +9,10 @@ version: '3'
|
|
9
9
|
services:
|
10
10
|
webpacker:
|
11
11
|
build: .
|
12
|
-
|
13
|
-
-
|
12
|
+
environment:
|
13
|
+
- NODE_ENV=development
|
14
|
+
- RAILS_ENV=development
|
15
|
+
- WEBPACKER_DEV_SERVER_HOST=0.0.0.0
|
14
16
|
command: ./bin/webpack-dev-server
|
15
17
|
volumes:
|
16
18
|
- .:/webpacker-example-app
|
@@ -18,15 +20,6 @@ services:
|
|
18
20
|
- '3035:3035'
|
19
21
|
```
|
20
22
|
|
21
|
-
Second, change the webpack-dev-server host to the service name of the docker-compose in config/webpacker.yml:
|
22
|
-
|
23
|
-
```yaml
|
24
|
-
development:
|
25
|
-
<<: *default
|
26
|
-
dev_server:
|
27
|
-
host: webpacker
|
28
|
-
```
|
29
|
-
|
30
23
|
add nodejs and yarn as dependencies in Dockerfile,
|
31
24
|
|
32
25
|
```dockerfile
|
@@ -53,12 +46,19 @@ RUN curl -sL https://deb.nodesource.com/setup_8.x | bash \
|
|
53
46
|
# Rest of the commands....
|
54
47
|
```
|
55
48
|
|
56
|
-
|
49
|
+
then add the webpacker host name environment variable to the web/app service:
|
57
50
|
|
58
|
-
```
|
59
|
-
|
60
|
-
|
61
|
-
|
51
|
+
```Dockerfile
|
52
|
+
web:
|
53
|
+
build:
|
54
|
+
context: .
|
55
|
+
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
|
56
|
+
volumes:
|
57
|
+
- .:/usr/src/app
|
58
|
+
ports:
|
59
|
+
- "3000:3000"
|
60
|
+
environment:
|
61
|
+
- WEBPACKER_DEV_SERVER_HOST=webpacker
|
62
62
|
```
|
63
63
|
|
64
64
|
Lastly, rebuild your container:
|
data/docs/engines.md
CHANGED
@@ -196,5 +196,18 @@ config.middleware.use(
|
|
196
196
|
urls: ["/my-engine-packs"], root: "my_engine/public"
|
197
197
|
)
|
198
198
|
```
|
199
|
+
or if you prefer to keep your engine-related configuration within the engine itself
|
200
|
+
|
201
|
+
```ruby
|
202
|
+
# my-engine-root/lib/my-engine/engine.rb
|
203
|
+
module MyEngine
|
204
|
+
class Engine < ::Rails:Engine
|
205
|
+
config.app_middleware.use(
|
206
|
+
Rack::Static,
|
207
|
+
urls: ["/my-engine-packs"], root: "my_engine/public"
|
208
|
+
)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
```
|
199
212
|
|
200
213
|
**NOTE:** in the example above we assume that your `public_output_path` is set to `my-engine-packs` in your engine's `webpacker.yml`.
|
data/docs/env.md
CHANGED
@@ -49,8 +49,6 @@ dotenvFiles.forEach((dotenvFile) => {
|
|
49
49
|
dotenv.config({ path: dotenvFile, silent: true })
|
50
50
|
})
|
51
51
|
|
52
|
-
environment.plugins.prepend('Environment', new webpack.EnvironmentPlugin(JSON.parse(JSON.stringify(process.env))))
|
53
|
-
|
54
52
|
module.exports = environment
|
55
53
|
```
|
56
54
|
|
@@ -0,0 +1,220 @@
|
|
1
|
+
# Integrations
|
2
|
+
|
3
|
+
Webpacker ships with basic out-of-the-box integration for React, Angular, Vue and Elm.
|
4
|
+
You can see a list of available commands/tasks by running `bundle exec rails webpacker`:
|
5
|
+
|
6
|
+
## React
|
7
|
+
|
8
|
+
To use Webpacker with [React](https://facebook.github.io/react/), create a
|
9
|
+
new Rails 5.1+ app using `--webpack=react` option:
|
10
|
+
|
11
|
+
```bash
|
12
|
+
# Rails 5.1+
|
13
|
+
rails new myapp --webpack=react
|
14
|
+
```
|
15
|
+
|
16
|
+
(or run `bundle exec rails webpacker:install:react` in an existing Rails app already
|
17
|
+
setup with Webpacker).
|
18
|
+
|
19
|
+
The installer will add all relevant dependencies using Yarn, changes
|
20
|
+
to the configuration files, and an example React component to your
|
21
|
+
project in `app/javascript/packs` so that you can experiment with React right away.
|
22
|
+
|
23
|
+
|
24
|
+
## Angular with TypeScript
|
25
|
+
|
26
|
+
To use Webpacker with [Angular](https://angular.io/), create a
|
27
|
+
new Rails 5.1+ app using `--webpack=angular` option:
|
28
|
+
|
29
|
+
```bash
|
30
|
+
# Rails 5.1+
|
31
|
+
rails new myapp --webpack=angular
|
32
|
+
```
|
33
|
+
|
34
|
+
(or run `bundle exec rails webpacker:install:angular` on a Rails app already
|
35
|
+
setup with Webpacker).
|
36
|
+
|
37
|
+
The installer will add the TypeScript and Angular core libraries using Yarn alongside
|
38
|
+
a few changes to the configuration files. An example component written in
|
39
|
+
TypeScript will also be added to your project in `app/javascript` so that
|
40
|
+
you can experiment with Angular right away.
|
41
|
+
|
42
|
+
By default, Angular uses a JIT compiler for development environment. This
|
43
|
+
compiler is not compatible with restrictive CSP (Content Security
|
44
|
+
Policy) environments like Rails 5.2+. You can use Angular AOT compiler
|
45
|
+
in development with the [@ngtools/webpack](https://www.npmjs.com/package/@ngtools/webpack#usage) plugin.
|
46
|
+
|
47
|
+
Alternatively if you're using Rails 5.2+ you can enable `unsafe-eval` rule for your
|
48
|
+
development environment. This can be done in the `config/initializers/content_security_policy.rb`
|
49
|
+
with the following code:
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
Rails.application.config.content_security_policy do |policy|
|
53
|
+
if Rails.env.development?
|
54
|
+
policy.script_src :self, :https, :unsafe_eval
|
55
|
+
else
|
56
|
+
policy.script_src :self, :https
|
57
|
+
end
|
58
|
+
end
|
59
|
+
```
|
60
|
+
|
61
|
+
|
62
|
+
## Vue
|
63
|
+
|
64
|
+
To use Webpacker with [Vue](https://vuejs.org/), create a
|
65
|
+
new Rails 5.1+ app using `--webpack=vue` option:
|
66
|
+
|
67
|
+
```bash
|
68
|
+
# Rails 5.1+
|
69
|
+
rails new myapp --webpack=vue
|
70
|
+
```
|
71
|
+
(or run `bundle exec rails webpacker:install:vue` on a Rails app already setup with Webpacker).
|
72
|
+
|
73
|
+
The installer will add Vue and its required libraries using Yarn alongside
|
74
|
+
automatically applying changes needed to the configuration files. An example component will
|
75
|
+
be added to your project in `app/javascript` so that you can experiment with Vue right away.
|
76
|
+
|
77
|
+
If you're using Rails 5.2+ you'll need to enable `unsafe-eval` rule for your development environment.
|
78
|
+
This can be done in the `config/initializers/content_security_policy.rb` with the following
|
79
|
+
configuration:
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
Rails.application.config.content_security_policy do |policy|
|
83
|
+
if Rails.env.development?
|
84
|
+
policy.script_src :self, :https, :unsafe_eval
|
85
|
+
else
|
86
|
+
policy.script_src :self, :https
|
87
|
+
end
|
88
|
+
end
|
89
|
+
```
|
90
|
+
You can read more about this in the [Vue docs](https://vuejs.org/v2/guide/installation.html#CSP-environments).
|
91
|
+
|
92
|
+
### Lazy loading integration
|
93
|
+
|
94
|
+
See [docs/es6](docs/es6.md) to know more about Webpack and Webpacker configuration.
|
95
|
+
|
96
|
+
For instance, you can lazy load Vue JS components:
|
97
|
+
|
98
|
+
Before:
|
99
|
+
```js
|
100
|
+
import Vue from 'vue'
|
101
|
+
import { VCard } from 'vuetify/lib'
|
102
|
+
|
103
|
+
Vue.component('VCard', VCard)
|
104
|
+
```
|
105
|
+
|
106
|
+
After:
|
107
|
+
```js
|
108
|
+
import Vue from 'vue'
|
109
|
+
|
110
|
+
// With destructuring assignment
|
111
|
+
Vue.component('VCard', import('vuetify/lib').then(({ VCard }) => VCard)
|
112
|
+
|
113
|
+
// Or without destructuring assignment
|
114
|
+
Vue.component('OtherComponent', () => import('./OtherComponent'))
|
115
|
+
```
|
116
|
+
|
117
|
+
You can use it in a Single File Component as well:
|
118
|
+
|
119
|
+
```html
|
120
|
+
<template>
|
121
|
+
...
|
122
|
+
</template>
|
123
|
+
|
124
|
+
<script>
|
125
|
+
export default {
|
126
|
+
components: {
|
127
|
+
OtherComponent: () => import('./OtherComponent')
|
128
|
+
}
|
129
|
+
}
|
130
|
+
</script>
|
131
|
+
```
|
132
|
+
|
133
|
+
By wrapping the import function into an arrow function, Vue will execute it only when it gets requested, loading the module in that moment.
|
134
|
+
|
135
|
+
##### Automatic registration
|
136
|
+
|
137
|
+
```js
|
138
|
+
/**
|
139
|
+
* The following block of code may be used to automatically register your
|
140
|
+
* Vue components. It will recursively scan this directory for the Vue
|
141
|
+
* components and automatically register them with their "basename".
|
142
|
+
*
|
143
|
+
* Eg. ./components/OtherComponent.vue -> <other-component></other-component>
|
144
|
+
* Eg. ./UI/ButtonComponent.vue -> <button-component></button-component>
|
145
|
+
*/
|
146
|
+
|
147
|
+
const files = require.context('./', true, /\.vue$/i)
|
148
|
+
files.keys().map(key => {
|
149
|
+
const component = key.split('/').pop().split('.')[0]
|
150
|
+
|
151
|
+
// With Lazy Loading
|
152
|
+
Vue.component(component, () => import(`${key}`))
|
153
|
+
|
154
|
+
// Or without Lazy Loading
|
155
|
+
Vue.component(component, files(key).default)
|
156
|
+
})
|
157
|
+
```
|
158
|
+
|
159
|
+
## Elm
|
160
|
+
|
161
|
+
To use Webpacker with [Elm](http://elm-lang.org), create a
|
162
|
+
new Rails 5.1+ app using `--webpack=elm` option:
|
163
|
+
|
164
|
+
```
|
165
|
+
# Rails 5.1+
|
166
|
+
rails new myapp --webpack=elm
|
167
|
+
```
|
168
|
+
|
169
|
+
(or run `bundle exec rails webpacker:install:elm` on a Rails app already setup with Webpacker).
|
170
|
+
|
171
|
+
The Elm library and its core packages will be added via Yarn and Elm.
|
172
|
+
An example `Main.elm` app will also be added to your project in `app/javascript`
|
173
|
+
so that you can experiment with Elm right away.
|
174
|
+
|
175
|
+
## Svelte
|
176
|
+
|
177
|
+
To use Webpacker with [Svelte](https://svelte.dev), create a
|
178
|
+
new Rails 5.1+ app using `--webpack=svelte` option:
|
179
|
+
|
180
|
+
```
|
181
|
+
# Rails 5.1+
|
182
|
+
rails new myapp --webpack=svelte
|
183
|
+
```
|
184
|
+
|
185
|
+
(or run `bundle exec rails webpacker:install:svelte` on a Rails app already setup with Webpacker).
|
186
|
+
|
187
|
+
Please play with the [Svelte Tutorial](https://svelte.dev/tutorial/basics) or learn more about its API at https://svelte.dev/docs
|
188
|
+
|
189
|
+
## Stimulus
|
190
|
+
|
191
|
+
To use Webpacker with [Stimulus](http://stimulusjs.org), create a
|
192
|
+
new Rails 5.1+ app using `--webpack=stimulus` option:
|
193
|
+
|
194
|
+
```
|
195
|
+
# Rails 5.1+
|
196
|
+
rails new myapp --webpack=stimulus
|
197
|
+
```
|
198
|
+
|
199
|
+
(or run `bundle exec rails webpacker:install:stimulus` on a Rails app already setup with Webpacker).
|
200
|
+
|
201
|
+
Please read [The Stimulus Handbook](https://stimulusjs.org/handbook/introduction) or learn more about its source code at https://github.com/stimulusjs/stimulus
|
202
|
+
|
203
|
+
## CoffeeScript
|
204
|
+
|
205
|
+
To add [CoffeeScript](http://coffeescript.org/) support,
|
206
|
+
run `bundle exec rails webpacker:install:coffee` on a Rails app already
|
207
|
+
setup with Webpacker.
|
208
|
+
|
209
|
+
An example `hello_coffee.coffee` file will also be added to your project
|
210
|
+
in `app/javascript/packs` so that you can experiment with CoffeeScript right away.
|
211
|
+
|
212
|
+
## Erb
|
213
|
+
|
214
|
+
To add [Erb](https://apidock.com/ruby/ERB) support in your JS templates,
|
215
|
+
run `bundle exec rails webpacker:install:erb` on a Rails app already
|
216
|
+
setup with Webpacker.
|
217
|
+
|
218
|
+
An example `hello_erb.js.erb` file will also be added to your project
|
219
|
+
in `app/javascript/packs` so that you can experiment with Erb-flavoured
|
220
|
+
javascript right away.
|
data/docs/testing.md
CHANGED
@@ -10,8 +10,7 @@ Webpacker does not setup `Karma` by default, so you've to manually install it al
|
|
10
10
|
"test": "NODE_ENV=test karma start"
|
11
11
|
},
|
12
12
|
"dependencies": {
|
13
|
-
"typescript": "^2.5.2"
|
14
|
-
"ts-loader": "^2.3.7"
|
13
|
+
"typescript": "^2.5.2"
|
15
14
|
},
|
16
15
|
"devDependencies": {
|
17
16
|
"karma": "^1.7.1",
|
data/docs/typescript.md
CHANGED
@@ -1,19 +1,54 @@
|
|
1
|
-
#
|
1
|
+
# TypeScript
|
2
2
|
|
3
|
+
## Installation
|
3
4
|
|
4
|
-
|
5
|
+
1. Run the TypeScript installer
|
5
6
|
|
6
|
-
|
7
|
+
```bash
|
8
|
+
bundle exec rails webpacker:install:typescript
|
9
|
+
```
|
10
|
+
|
11
|
+
After that, a new file called `hello_typescript.ts` will be present in your `packs` directory (or rather the `source_entry_path` of your `webpacker.yml` configuration). You're now ready to write TypeScript.
|
12
|
+
|
13
|
+
## Upgrading to 5.1
|
14
|
+
|
15
|
+
If you update your App to `webpacker >= 5.1` and had TypeScript installed before, you need to add some new/remove some old configurations:
|
16
|
+
|
17
|
+
1. Remove old packages:
|
18
|
+
- `yarn remove ts-loader`
|
19
|
+
|
20
|
+
2. Add new packages:
|
21
|
+
- `yarn add @babel/preset-typescript`
|
22
|
+
|
23
|
+
3. Remove old configuration files:
|
24
|
+
- Delete this file: `config/webpack/loaders/typescript.js`
|
25
|
+
|
26
|
+
4. Remove the following lines from `config/webpack/environment.js`:
|
27
|
+
- `const typescript = require('./loaders/typescript')`
|
28
|
+
- `environment.loaders.prepend('typescript', typescript)`
|
29
|
+
|
30
|
+
5. Add the TypeScript preset to your `babel.config.js`:
|
31
|
+
- This line `['@babel/preset-typescript', { 'allExtensions': true, 'isTSX': true }]` has to be added as the last item to the `presets` array in your `babel.config.js`
|
32
|
+
|
33
|
+
### Upgrading to 5.1 for Vue users
|
34
|
+
|
35
|
+
1. Remove old packages:
|
36
|
+
- `yarn remove ts-loader pnp-webpack-plugin`
|
37
|
+
|
38
|
+
2. Follow point 3 and 4 from the `TypeScript with Vue components` section
|
39
|
+
|
40
|
+
## TypeScript with React
|
41
|
+
|
42
|
+
1. Setup react using Webpacker [react installer](../README.md#react). Then run the TypeScript installer
|
7
43
|
|
8
44
|
```bash
|
9
45
|
bundle exec rails webpacker:install:typescript
|
10
|
-
yarn add @types/react @types/react-dom
|
11
46
|
```
|
12
47
|
|
13
|
-
2. Rename the generated `hello_react.js` to `hello_react.tsx`. Make the file valid
|
14
|
-
now you can use
|
48
|
+
2. Rename the generated `hello_react.js` to `hello_react.tsx`. Make the file valid TypeScript and
|
49
|
+
now you can use TypeScript, JSX with React.
|
15
50
|
|
16
|
-
##
|
51
|
+
## TypeScript with Vue components
|
17
52
|
|
18
53
|
1. Setup Vue using the Webpacker [Vue installer](../README.md#vue). Then run the TypeScript installer
|
19
54
|
|
@@ -22,37 +57,22 @@ bundle exec rails webpacker:install:typescript
|
|
22
57
|
```
|
23
58
|
|
24
59
|
2. Rename generated `hello_vue.js` to `hello_vue.ts`.
|
25
|
-
3.
|
26
|
-
4. Change the generated `config
|
60
|
+
3. Install the right Babel preset: `yarn add babel-preset-typescript-vue`
|
61
|
+
4. Change the generated `babel.config.js` from
|
27
62
|
|
28
63
|
```js
|
29
|
-
|
30
|
-
test: /\.(ts|tsx)?(\.erb)?$/,
|
31
|
-
use: [{
|
32
|
-
loader: 'ts-loader'
|
33
|
-
}]
|
34
|
-
}
|
64
|
+
["@babel/preset-typescript", { "allExtensions": true, "isTSX": true }]
|
35
65
|
```
|
36
66
|
|
37
67
|
to
|
38
68
|
|
39
69
|
```js
|
40
|
-
|
41
|
-
|
42
|
-
module.exports = {
|
43
|
-
test: /\.(ts|tsx)?(\.erb)?$/,
|
44
|
-
use: [{
|
45
|
-
loader: 'ts-loader',
|
46
|
-
options: PnpWebpackPlugin.tsLoaderOptions({
|
47
|
-
appendTsSuffixTo: [/\.vue$/]
|
48
|
-
})
|
49
|
-
}]
|
50
|
-
}
|
70
|
+
["babel-preset-typescript-vue", { "allExtensions": true, "isTSX": true }]
|
51
71
|
```
|
52
72
|
|
53
|
-
and now you can use `<script lang="ts">` in your `.vue` component files. See [the
|
73
|
+
and now you can use `<script lang="ts">` in your `.vue` component files. See [the babel-preset-typescript-vue docs](https://www.npmjs.com/package/babel-preset-typescript-vue) for more info.
|
54
74
|
|
55
|
-
## HTML templates with
|
75
|
+
## HTML templates with TypeScript and Angular
|
56
76
|
|
57
77
|
After you have installed Angular using `bundle exec rails webpacker:install:angular`
|
58
78
|
you would need to follow these steps to add HTML templates support:
|