# WebpackManifestPlugin
This Ruby gem provides a way to use assets managed with `webpack` in Rails templates. JavaScript package [webpack-manifest-plugin](https://www.npmjs.com/package/webpack-manifest-plugin) outputs a JSON file that maps assets to file paths. File paths can change depending on a webpack configuration -- a development config usually doesn't version assets while a production config does. Webpack updates CSS and JavaScript files with the file paths it outputs but not Rails templates. This gem provides a view helper for including these assets in Rails views.
##### Who would use this?
Those who already have a webpack asset workflow and only need to reference webpack assets in Rails templates. Otherwise, use [webpacker](https://github.com/rails/webpacker).
##### Example App
https://github.com/ed-mare/webpackmanifestplugin-example
## Usage
**1) Install the [webpack-manifest-plugin](https://www.npmjs.com/package/webpack-manifest-plugin):**
```shell
npm install --save-dev webpack-manifest-plugin
```
**2) Configure your `webpack.config.js` file(s) to use this package:**
```javascript
/* add the plugin */
var ManifestPlugin = require('webpack-manifest-plugin');
/* in the plugins section */
plugins: [
// ...
new ManifestPlugin({
// server public path
publicPath: '/assets/'
}),
// ...
]
```
And manage your assets as you normally do with webpack.
```shell
# i,e.,
webpack -d -w
```
There is a rake task for running webpack. Ctrl-c kills it when in watch mode.
```shell
# i,e.,
rake webpack_manifest_plugin:build
# with options
rake webpack_manifest_plugin:build['-d -w --config webpack.config.prod.js']"
```
**3) Add this gem to your Rails application Gemfile and run `bundle`:**
```ruby
gem 'webpack_manifest_plugin'
```
And then execute:
```ruby
bundle
```
If you are creating a new Rails app, skip sprockets and yarn (unless you need yarn).
```shell
rails new --help
#...
[--skip-yarn], [--no-skip-yarn] # Don't use Yarn for managing JavaScript dependencies
#...
-S, [--skip-sprockets], [--no-skip-sprockets] # Skip Sprockets files
#...
```
If you want UJS and actioncable, add to package.json (with appropriate versions):
```JSON
# package.json
"dependencies": {
"actioncable": "5.1.3",
...
"rails-ujs": "5.1.3",
```
**4) Configure the gem in initializers:**
```ruby
# Configurations:
# webpack_cmd - Command to execute webpack. Defaults to 'webpack'.
# cache_manifest - boolean - defaults to false. If set to true, it loads the
# JSON file once and caches it in WebpackManifestPlugin.configuration.manifest.
# If false, it lazy loads per request.
# logger - defaults to Logger.new(STDOUT). Set to your Rails.logger or whatever
# logger you are using.
# create config/initializers/webpack_manifest_plugin.rb file and
# configure it for your app.
# Example:
WebpackManifestPlugin.configure do |c|
c.webpack_cmd = 'node node_modules/webpack/bin/webpack'
c.cache_manifest = Rails.env.production? ? true : false
c.logger = Rails.logger
end
```
**5) Use the `webpack_manifest_path` view helper your Rails views:**
A webpack-manifest-plugin file looks something like this:
```JSON
{
"common.css": "/assets/stylesheets/common.css",
"common.js": "/assets/javascripts/common.js",
"fonts/fontawesome-webfont.eot": "/assets/fonts/fontawesome-webfont.eot",
"fonts/fontawesome-webfont.svg?v=4.6.3": "/assets/fonts/fontawesome-webfont.svg",
"fonts/fontawesome-webfont.ttf?v=4.6.3": "/assets/fonts/fontawesome-webfont.ttf",
"images/login_cover.jpg": "/assets/images/login_cover.jpg",
"images/panel_bg.png": "/assets/images/panel_bg.png",
"react.css": "/assets/stylesheets/react.css",
"react.js": "/assets/javascripts/react.js",
"welcome.css": "/assets/stylesheets/welcome.css",
"welcome.js": "/assets/javascripts/welcome.js"
}
```
Specify the hash key in the `webpack_manifest_path` view helper:
```html
" />
" rel="stylesheet" type="text/css">
```
## Development
1) Build the docker image:
```shell
docker-compose build --no-cache
```
2) Start docker image with an interactive bash shell:
```shell
docker-compose run --rm gem
```
3) Once in bash session, code, run tests, start console, etc.
*Run bundle install if binstubs are missing or install only the executables
you need. Be sure they are excluded in .gitignore.*
```shell
# run console with gem loaded
bin/console
# run tests
bin/rspec
# check for vulnerabilities
bin/bundler-audit --update
# lint
#
bin/rubocop lib spec
```
## Todo
- Test with Rails 6 app.
- Test rake tasks.
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/ed-mare/webpack_manifest_plugin. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
## License
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).