# GulpAssets Rails Plugin to augment frontend development with a gulp/webpack based workflow. - Installs Javascript infrastructure in your Rails project to manage frontend assets - Provides view helpers to Rails that allow you to easily reference gulp generated assets from Rails views - Puts Livereload into the Rails middleware stack. This injects the Livereload client into Rails-renderd pages, updates are triggered from gulp. ## Installation 1. Add `gem 'gulp_assets'` to your Gemfile and run `bundle install`. 2. Run `rails generate gulp_assets` to generate all necessary files. 3. Develop your frontend code in the `frontend` directory 4. Reference files generated by gulp using the `gulp_asset_path` helper 5. Run `npm start` during development for livereload/Webpack Hot Module replacement. ## Structure `frontend/assets` contains static assets (images, fonts, icons). A static asset is a file that is not processed and that does not contain references to other files. They are simply copied to `public/assets/assets`. `frontend/stylesheets` contains SCSS files which are compiled to `public/assets/stylesheets`. Files beginning with underscores are ignored. `frontend/javascripts/main.js` is the entry point for the client-side Javascript. This is picked up by Webpack, bundled and copied to `public/assets/javascripts`. If you need additional entry points, please adjust the webpack configuration accordingly. ## Gulp Commands ### `gulp default` Runs the webpack development server which will watch files, trigger livereload and serve static assets. This also runs if you execute `npm start`. ### `gulp precompile` Compiles assets for production, hashes their names and generates a `rev-mainfest.json`, which is used by the `gulp_asset_path` helper to generate the correct links with the hash in the filename. ## Referencing gulp assets from Rails views The `gulp_assets_path` helper takes a partial path as a parameter that sits inside the `public/assets` folder. It then operates differently, depending on the `RAILS_ENV`: - development: Prepend the path with the correct location on the webpack dev server, usually `//localhost:8080/assets`. `javascripts/main.js` would become `//localhost:8080/assets/javascripts/main.js`. - production: Prepend the path with the correct asset path and replace the filename with the hashed version. `javascripts/main.js` would become `/assets/javascripts/main-a42bb48a5f83.js`. ### Shortcuts To include a gulp-generated javascript or stylesheet, use the `gulp_javascript` or `gulp_stylesheet` helper: <%= gulp_javascript "main" %> <%= gulp_stylesheet "main" %> Since "main" is the default name, you can omit it: <%= gulp_javascript %> <%= gulp_stylesheet %> Both accept a second parameter for overwriting attributes. This can be used for example to change the `media` attribute for a stylesheet. ## Examples ### CSS - `frontend/stylesheets/main.scss` Input file - `public/assets/stylesheets/main.css` Output File - `` Used to link to the file. - `<%= gulp_stylesheet "main" %>` or `<%= gulp_stylesheet %>` also generate correct links ### JS - `frontend/javscripts/main.js` Input file - `public/assets/javscripts/main.js` Output File - `` - `<%= gulp_javascript "main" %>` or `<%= gulp_javascript %>` also generate correct links ## Development To test while changing the JS files, run ```shell ./cli create_testapp ``` inside the root of the gem. This will generate a testapp directory that contains a Rails app using the gem from source. All the gulp_assets specific files are symlinked to the files and directories in the template directory. If you want to use npm commands you have to run those inside the template directory, otherwise npm will replace the symlink with a new package.json. The rails app has the following features: - A layout requiring `main.js` and `main.css`. - A default route rendering a static template in `app/views/application/index.html.erb` # Changelog See CHANGELOG.md