vue_cli-rails 0.3.1 → 0.4.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/CHANGELOG.md +33 -0
- data/Gemfile.lock +2 -2
- data/README.md +93 -142
- data/lib/helpers/scripts/vue_create.rb +4 -4
- data/lib/source/app/controllers/vue_demo_controller.rb +2 -2
- data/lib/vue_cli/rails/engine.rb +4 -4
- data/lib/vue_cli/rails/node_env.rb +1 -1
- data/lib/vue_cli/rails/version.rb +1 -1
- metadata +2 -1
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 106196baec28c9e822399c81c0aaa74e3ebc975ed6058ab4526bbd7afed75a9f
         | 
| 4 | 
            +
              data.tar.gz: 3759ecd67ae31aac6c0cba11c779e7b2c2b43a3c4a1faa27b751d54b5b7066d3
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 1f96e3c8b417e714682deda2cfea327658326d1030ead03cc724b3e7d4544ba9813dcc6652196252cdebceb9a3cf90e1130f004770b9b8a3d8c0c76d97e93cb2
         | 
| 7 | 
            +
              data.tar.gz: 9a161f5257422c9a07b8a86430bcc2d0c3860e43a39925cb100e7fb7f5eb03df85d7e607324efe00fdc02de1b39c96bbc10ff1006e65de65d9a6a2e21ba23450
         | 
    
        data/CHANGELOG.md
    ADDED
    
    | @@ -0,0 +1,33 @@ | |
| 1 | 
            +
            # Change Log
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            ## [0.4.0] - Released on 2019-03-17
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            - Breaking change: changed `render_vue(entry_point)` to `render(vue: entry_point)`
         | 
| 6 | 
            +
            - Fixed some bugs cause incorrect configs when rerun `rake vue:create`
         | 
| 7 | 
            +
            - Adjusted Jest `transformIgnorePatterns` order
         | 
| 8 | 
            +
            - Added Change Log
         | 
| 9 | 
            +
            - Finished README
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            ## [0.3.1] - Released on 2019-03-16
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            - Added [`slm`](https://github.com/slm-lang/slm) template support, which is a lite version of [Slim](http://slim-lang.com/) implementation in JS.
         | 
| 14 | 
            +
            - Fixed a bug of `rake vue:support[]`
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            ## [0.3.0] - Released on 2019-03-13
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            - Breaking change: Moved entry point folder to `app/assets/vue/entry_points`
         | 
| 19 | 
            +
            - Added controller method `render_vue`
         | 
| 20 | 
            +
            - Some bug fixes
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            ## [0.2.0] - Released on 2019-03-03
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            - Added Jest support
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            ## [0.1.6] - Released on 2019-03-03
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            - Bug fixes
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            ## [0.1.2] - Released on 2019-02-24
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            - First release.
         | 
| 33 | 
            +
             | 
    
        data/Gemfile.lock
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -47,7 +47,7 @@ Out-of-box workflow: | |
| 47 47 | 
             
                > Don NOT select `In package.json` for "Where do you prefer placing config for Babel, PostCSS, ESLint, etc.?". Some functionalities like alias of jest may not work.
         | 
| 48 48 |  | 
| 49 49 | 
             
            2. Put your JavaScript files under `app/assets/vue/entry_points`.
         | 
| 50 | 
            -
            3. Insert your entry point by `vue_entry 'entry_point'` in views or ` | 
| 50 | 
            +
            3. Insert your entry point by `vue_entry 'entry_point'` in views or `render vue: 'entry_point'` in controllers.
         | 
| 51 51 | 
             
            4. `webpack-dev-server` auto starts alongside `rails server` in dev mode.
         | 
| 52 52 | 
             
            5. Invoke `env RAILS_ENV=production bundle exec rake vue:compile` to compile assets (you still must manually set `RAILS_ENV` to `production`).
         | 
| 53 53 |  | 
| @@ -75,110 +75,9 @@ If you are new to modern front-end development, or more specifically with `webpa | |
| 75 75 |  | 
| 76 76 | 
             
            > You may have interest of path alias in `config/vue.yml`.
         | 
| 77 77 |  | 
| 78 | 
            -
            < | 
| 79 | 
            -
             | 
| 80 | 
            -
            - File structure:
         | 
| 81 | 
            -
             | 
| 82 | 
            -
             ```text
         | 
| 83 | 
            -
             [+] app
         | 
| 84 | 
            -
                 [+] assets
         | 
| 85 | 
            -
                     [+] vue
         | 
| 86 | 
            -
                         [+] entry_points - Folder for entry points
         | 
| 87 | 
            -
                             [+] foo
         | 
| 88 | 
            -
                                 [-] bar.js - entry point: import '~views/FooBar.vue'
         | 
| 89 | 
            -
                         [+] views - alias `~views`
         | 
| 90 | 
            -
                             [-] FooBar.vue - Vue component for `foo/bar`
         | 
| 91 | 
            -
                 [+] controllers
         | 
| 92 | 
            -
                     [+] foo_controller.rb - controller
         | 
| 93 | 
            -
                 [+] views
         | 
| 94 | 
            -
                     [+] layout
         | 
| 95 | 
            -
                         [-] vue.html.erb - Vue layout
         | 
| 96 | 
            -
                     [+] foo
         | 
| 97 | 
            -
                         [-] bar.html.erb - View render: `vue_entry('foo/bar')`
         | 
| 98 | 
            -
             ```
         | 
| 99 | 
            -
             | 
| 100 | 
            -
            - `alias` in `config/vue.yml`:
         | 
| 101 | 
            -
             | 
| 102 | 
            -
             ```yaml
         | 
| 103 | 
            -
             # default
         | 
| 104 | 
            -
               alias:
         | 
| 105 | 
            -
                 ~views: app/assets/vue/views
         | 
| 106 | 
            -
             ```
         | 
| 107 | 
            -
             | 
| 108 | 
            -
            - Your controller:
         | 
| 109 | 
            -
             | 
| 110 | 
            -
             ```ruby
         | 
| 111 | 
            -
             # app/controllers/foo_controller.rb
         | 
| 112 | 
            -
             | 
| 113 | 
            -
             class FooController < ApplicationController
         | 
| 114 | 
            -
               layout 'vue'
         | 
| 115 | 
            -
             end
         | 
| 116 | 
            -
             ```
         | 
| 117 | 
            -
             | 
| 118 | 
            -
            - Your view:
         | 
| 119 | 
            -
             | 
| 120 | 
            -
             ```html
         | 
| 121 | 
            -
             <!-- file - app/views/foo/bar.html.erb -->
         | 
| 122 | 
            -
             <%= vue_entry('foo/bar') %>
         | 
| 123 | 
            -
             ```
         | 
| 124 | 
            -
             | 
| 125 | 
            -
            - Entry point JS:
         | 
| 126 | 
            -
             | 
| 127 | 
            -
             ```js
         | 
| 128 | 
            -
             // file - app/assets/vue/entry_points/foo/bar.js
         | 
| 129 | 
            -
             import Vue from 'vue';
         | 
| 130 | 
            -
             | 
| 131 | 
            -
             import Foo from '~views/FooBar.vue';
         | 
| 132 | 
            -
             | 
| 133 | 
            -
             new Vue({
         | 
| 134 | 
            -
               render: h => h(Foo),
         | 
| 135 | 
            -
             }).$mount('#app');
         | 
| 136 | 
            -
             ```
         | 
| 137 | 
            -
             | 
| 138 | 
            -
            - Your Vue component for your entry point:
         | 
| 139 | 
            -
             | 
| 140 | 
            -
             ```vue
         | 
| 141 | 
            -
             // file - app/assets/vue/views/FooBar.vue
         | 
| 142 | 
            -
             <template>
         | 
| 143 | 
            -
               <div id="foo-bar">
         | 
| 144 | 
            -
                 <h1>Foo/bar</h1>
         | 
| 145 | 
            -
               </div>
         | 
| 146 | 
            -
             </template>
         | 
| 147 | 
            -
             | 
| 148 | 
            -
             <script>
         | 
| 149 | 
            -
             export default {
         | 
| 150 | 
            -
               name: 'FooBar',
         | 
| 151 | 
            -
             };
         | 
| 152 | 
            -
             </script>
         | 
| 153 | 
            -
             | 
| 154 | 
            -
             <style scoped>
         | 
| 155 | 
            -
             #foo-bar {
         | 
| 156 | 
            -
               color: green;
         | 
| 157 | 
            -
             }
         | 
| 158 | 
            -
             </style>
         | 
| 159 | 
            -
             ```
         | 
| 160 | 
            -
             | 
| 161 | 
            -
            - Layout:
         | 
| 162 | 
            -
             | 
| 163 | 
            -
             ```html
         | 
| 164 | 
            -
             <!-- file - app/views/layout/vue.html.erb -->
         | 
| 165 | 
            -
             <!DOCTYPE html>
         | 
| 166 | 
            -
               <html>
         | 
| 167 | 
            -
               <head>
         | 
| 168 | 
            -
                 <title>Vue</title>
         | 
| 169 | 
            -
                 <%= csrf_meta_tags %>
         | 
| 170 | 
            -
               </head>
         | 
| 171 | 
            -
               <body>
         | 
| 172 | 
            -
                 <div id="app"></div><%= yield %>
         | 
| 173 | 
            -
               </body>
         | 
| 174 | 
            -
             </html>
         | 
| 175 | 
            -
             ```
         | 
| 176 | 
            -
             | 
| 177 | 
            -
            </details>
         | 
| 178 | 
            -
             | 
| 179 | 
            -
            #### Use `render_vue` in controllers
         | 
| 78 | 
            +
            #### Use `render vue: <entry_point>` in controllers
         | 
| 180 79 |  | 
| 181 | 
            -
            Usually you only need `<div id="app"></div>` and `vue_entry 'entry/point'` to render a Vue page. You can use ` | 
| 80 | 
            +
            Usually you only need `<div id="app"></div>` and `vue_entry 'entry/point'` to render a Vue page. You can use `render vue: 'entry/point'` inside your controller.
         | 
| 182 81 |  | 
| 183 82 | 
             
            This method is simply a wrap of `render html: vue_entry('entry_point'), layout: true`. So you can pass any arguments supported by `render` including `layout`.
         | 
| 184 83 |  | 
| @@ -190,7 +89,7 @@ class MyVueController < ApplicationController | |
| 190 89 | 
             
              layout 'vue_base'
         | 
| 191 90 |  | 
| 192 91 | 
             
              def foo
         | 
| 193 | 
            -
                 | 
| 92 | 
            +
                render vue: 'foo/bar'
         | 
| 194 93 | 
             
              end
         | 
| 195 94 | 
             
            end
         | 
| 196 95 | 
             
            ```
         | 
| @@ -347,7 +246,7 @@ Feel free to update `vue.config.js` by yourself. There are some lines of boiler- | |
| 347 246 |  | 
| 348 247 | 
             
            - `vue:support[formats]`
         | 
| 349 248 |  | 
| 350 | 
            -
              Adds template or style language support. Vue ships with supporting `pug`, `sass`, `less` and `stylus` out-of-box. How ever, you still have to install some loaders manually if you did not select that language with `vue:create`.
         | 
| 249 | 
            +
              Adds template or style language support. Vue ships with supporting `pug`, `slm`, `sass`, `less` and `stylus` out-of-box. How ever, you still have to install some loaders manually if you did not select that language with `vue:create`.
         | 
| 351 250 |  | 
| 352 251 | 
             
              You can add multiple languages at the same time: `rake vue:support[pug,stylus]`
         | 
| 353 252 |  | 
| @@ -404,7 +303,7 @@ You can check the full list on [Vue CLI official website](https://cli.vuejs.org/ | |
| 404 303 | 
             
                +  getSettings,
         | 
| 405 304 | 
             
                } = railsConfig;
         | 
| 406 305 |  | 
| 407 | 
            -
                + const { configureWebpack: { entry, output, resolve } } = getSettings('configureWebpack');
         | 
| 306 | 
            +
                + const { configureWebpack: { entry, output, resolve, module: cwModule } } = getSettings('configureWebpack');
         | 
| 408 307 |  | 
| 409 308 | 
             
                module.exports = {
         | 
| 410 309 | 
             
                  ...pickUpSettings`
         | 
| @@ -428,6 +327,7 @@ You can check the full list on [Vue CLI official website](https://cli.vuejs.org/ | |
| 428 327 | 
             
                +    entry,
         | 
| 429 328 | 
             
                +    output,
         | 
| 430 329 | 
             
                +    resolve,
         | 
| 330 | 
            +
                +    module: cwModule,
         | 
| 431 331 | 
             
                +  },
         | 
| 432 332 | 
             
                  chainWebpack: (config) => {
         | 
| 433 333 | 
             
                ```
         | 
| @@ -480,10 +380,85 @@ You can check the full list on [Vue CLI official website](https://cli.vuejs.org/ | |
| 480 380 |  | 
| 481 381 | 
             
                > I know it is not Rails-way at all. I don't want to waste time to just get it worked properly in Rails way - you are already using Node, why it bothers you?
         | 
| 482 382 |  | 
| 383 | 
            +
            - My API does not work with CSRF token
         | 
| 384 | 
            +
             | 
| 385 | 
            +
                Because Vue does not have opinion of Ajax (or JSON API) preference, you must implement what `jquery-ujs` does by yourself. There is an example code in vanilla JS with [querySelector](https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector) whish should work for IE8+:
         | 
| 386 | 
            +
             | 
| 387 | 
            +
                ```JS
         | 
| 388 | 
            +
                // fetch API
         | 
| 389 | 
            +
                async (url, data) => {
         | 
| 390 | 
            +
                  const $csrfParam = document.querySelector('meta[name="csrf-param"]');
         | 
| 391 | 
            +
                  const $csrfToken = document.querySelector('meta[name="csrf-token"]');
         | 
| 392 | 
            +
                  const csrfParam = ($csrfParam && $csrfParam.getAttribute('content')) || undefined;
         | 
| 393 | 
            +
                  const csrfToken = ($csrfToken && $csrfToken.getAttribute('content')) || undefined;
         | 
| 394 | 
            +
             | 
| 395 | 
            +
                  try {
         | 
| 396 | 
            +
                    const response = await fetch(url, {
         | 
| 397 | 
            +
                      method: 'POST',
         | 
| 398 | 
            +
                      headers: {
         | 
| 399 | 
            +
                        'Content-type': 'application/json',
         | 
| 400 | 
            +
                        'X-CSRF-Token': csrfToken,
         | 
| 401 | 
            +
                      },
         | 
| 402 | 
            +
                      body: JSON.stringify({
         | 
| 403 | 
            +
                        ...data,
         | 
| 404 | 
            +
                        [csrfParam]: csrfToken,
         | 
| 405 | 
            +
                      }),
         | 
| 406 | 
            +
                    });
         | 
| 407 | 
            +
                    return response.json();
         | 
| 408 | 
            +
                  } catch (e) {
         | 
| 409 | 
            +
                    // handle failed case
         | 
| 410 | 
            +
                  }
         | 
| 411 | 
            +
                }
         | 
| 412 | 
            +
                ```
         | 
| 413 | 
            +
             | 
| 414 | 
            +
                Alternatively you can turn off CSRF token and set [SameSite cookie](https://gist.github.com/will/05cb64dc343296dec4d58b1abbab7aaf) if all your clients no longer use IE. [Modern browsers](https://caniuse.com/#feat=same-site-cookie-attribute) can handle `SameSite` flag to [prevent CSRF attacks](http://www.sjoerdlangkemper.nl/2016/04/14/preventing-csrf-with-samesite-cookie-attribute/).
         | 
| 415 | 
            +
             | 
| 483 416 | 
             
            <details><summary>Q & A</summary>
         | 
| 484 417 |  | 
| 485 418 | 
             
            ## Q&A
         | 
| 486 419 |  | 
| 420 | 
            +
            ### Can I get rid of `js-yaml` and `webpack-assets-manifest`
         | 
| 421 | 
            +
             | 
| 422 | 
            +
            Only `webpack-assets-manifest` is a required dependency. It will be used to generate `manifest.json` which required for both dev and prod.
         | 
| 423 | 
            +
             | 
| 424 | 
            +
            `vue.rails.js` uses `js-yaml` for parsing `config/vue.yml`. It will fallback to `rake vue:json_config` if `js-yaml` not been installed. However, when your Rails app grow bigger, you will very likely find rake tasks start slower and slower.
         | 
| 425 | 
            +
             | 
| 426 | 
            +
            ### Can I use YAML for template inside .vue
         | 
| 427 | 
            +
             | 
| 428 | 
            +
            Short answer I don't know and I don't recommend. There are several HAML packages but all are too old. JS world suggests [pug](https://pugjs.org). You can also use [slm](https://github.com/slm-lang/slm) if you prefer [Slim](http://slim-lang.com/). Both are quite similar to CSS selector syntax, which means you don't really need to spend time to learn.
         | 
| 429 | 
            +
             | 
| 430 | 
            +
            Just `rake vue:support[pug,slm]` and try them out: `<template lang="pug">` or `<template lang="slm">`.
         | 
| 431 | 
            +
             | 
| 432 | 
            +
            ### Does it support pnpm
         | 
| 433 | 
            +
             | 
| 434 | 
            +
            No.
         | 
| 435 | 
            +
             | 
| 436 | 
            +
            The reason is `@vue/cli` does not support `pnpm` very well, or `npm` does not support `@vue/cli`. Who knows.
         | 
| 437 | 
            +
             | 
| 438 | 
            +
            You still have a chance to get it worked by giving `pnpm --shamefully-flatten` flag, which makes [no difference from `npm` or `yarn`](https://pnpm.js.org/docs/en/faq.html#solution-3).
         | 
| 439 | 
            +
             | 
| 440 | 
            +
            If someday they support each other, I'd like to support `pnpm` as well.
         | 
| 441 | 
            +
             | 
| 442 | 
            +
            ### Your demo code seems awful
         | 
| 443 | 
            +
             | 
| 444 | 
            +
            Yes I admit it. Personally I'd like to directly write SPA with webpack tooling for front-end. Back-end will be a separated project, and it will be a Rails-API or Sinatra project if I want to use ActiveRecord.
         | 
| 445 | 
            +
             | 
| 446 | 
            +
            `webpack-dev-server` can simply be configured with a proxy and I can use something like `npm-run-all` to start 2 services at the same time. I had to write some not-so-good code to get those things done in Rails.
         | 
| 447 | 
            +
             | 
| 448 | 
            +
            The demo is more Rails way - separated layouts and views. SPA world uses client routers like `vue-router`.
         | 
| 449 | 
            +
             | 
| 450 | 
            +
            ### It does not work on Windows
         | 
| 451 | 
            +
             | 
| 452 | 
            +
            Sorry, I don't think many gems work on Windows. Please install a virtual machine and run Linux on it. This gem is very likely working with `WSL`, however you may suffer performance issues due to [slow file system](https://github.com/Microsoft/WSL/issues/873#issuecomment-425272829)
         | 
| 453 | 
            +
             | 
| 454 | 
            +
            Currently `vue.config.js` is reading configurations from `vue.rails.js` which depends on `js-yaml`. It will fallback to `bundle exec rake vue:json_config` without `js-yaml` installed. You may suffer performance issue if your rake tasks are slow.
         | 
| 455 | 
            +
             | 
| 456 | 
            +
            ### Will you support SSR
         | 
| 457 | 
            +
             | 
| 458 | 
            +
            I do want to support SSR. However, the way [Vue officially provided](https://ssr.vuejs.org/) requires you to write separated code for client and server then compile with Webpack, which is quite complicated.[ `prerender-spa-plugin`](https://github.com/chrisvfritz/prerender-spa-plugin) might be easier to achieve it.
         | 
| 459 | 
            +
             | 
| 460 | 
            +
            I will do more investigation like how [Nuxt.js](https://nuxtjs.org/) does SSR. But I can't guarantee anything now.
         | 
| 461 | 
            +
             | 
| 487 462 | 
             
            ### Difference from Webpacker
         | 
| 488 463 |  | 
| 489 464 | 
             
            1. Webpacker is designed more generic. `vue_cli-rails` is opinionated to just get `@vue/cli` worked.
         | 
| @@ -541,41 +516,11 @@ You can check the full list on [Vue CLI official website](https://cli.vuejs.org/ | |
| 541 516 |  | 
| 542 517 | 
             
                Only a few platform-specific settings available. All others are very standard.
         | 
| 543 518 |  | 
| 544 | 
            -
            ### Can I get rid of `js-yaml` and `webpack-assets-manifest`
         | 
| 545 | 
            -
             | 
| 546 | 
            -
            Only `webpack-assets-manifest` is a required dependency. It will be used to generate `manifest.json` which required for both dev and prod.
         | 
| 547 | 
            -
             | 
| 548 | 
            -
            `vue.rails.js` uses `js-yaml` for parsing `config/vue.yml`. It will fallback to `rake vue:json_config` if `js-yaml` not been installed. However, when your Rails app grow bigger, you will very likely find rake tasks start slower and slower.
         | 
| 549 | 
            -
             | 
| 550 | 
            -
            ### Does it support pnpm
         | 
| 551 | 
            -
             | 
| 552 | 
            -
            No.
         | 
| 553 | 
            -
             | 
| 554 | 
            -
            The reason is `@vue/cli` does not support `pnpm` very well, or `npm` does not support `@vue/cli`. Who knows.
         | 
| 555 | 
            -
             | 
| 556 | 
            -
            You still have a chance to get it worked by giving `pnpm --shamefully-flatten` flag, which makes [no difference from `npm` or `yarn`](https://pnpm.js.org/docs/en/faq.html#solution-3).
         | 
| 557 | 
            -
             | 
| 558 | 
            -
            If someday they support each other, I'd like to support `pnpm` as well.
         | 
| 559 | 
            -
             | 
| 560 | 
            -
            ### Your demo code seems awful
         | 
| 561 | 
            -
             | 
| 562 | 
            -
            Yes I admit it. Personally I'd like to directly write SPA with webpack tooling for front-end. Back-end will be a separated project, and it will be a Rails-API or Sinatra project if I want to use ActiveRecord.
         | 
| 563 | 
            -
             | 
| 564 | 
            -
            `webpack-dev-server` can simply be configured with a proxy and I can use something like `npm-run-all` to start 2 services at the same time. I had to write some not-so-good code to get those things done in Rails.
         | 
| 565 | 
            -
             | 
| 566 | 
            -
            The demo is more Rails way - separated layouts and views. SPA world uses client routers like `vue-router`.
         | 
| 567 | 
            -
             | 
| 568 | 
            -
            ### It does not work on Windows
         | 
| 569 | 
            -
             | 
| 570 | 
            -
            Sorry, I don't think many gems work on Windows. Please install a virtual machine and run Linux on it. This gem is very likely working with `WSL`, however you may suffer performance issues due to [slow file system](https://github.com/Microsoft/WSL/issues/873#issuecomment-425272829)
         | 
| 571 | 
            -
             | 
| 572 | 
            -
            Currently `vue.config.js` is reading configurations from `vue.rails.js` which depends on `js-yaml`. It will fallback to `bundle exec rake vue:json_config` without `js-yaml` installed. You may suffer performance issue if your rake tasks are slow.
         | 
| 573 | 
            -
             | 
| 574 519 | 
             
            </details>
         | 
| 575 520 |  | 
| 576 521 | 
             
            ## Explanation by Demo
         | 
| 577 522 |  | 
| 578 | 
            -
            <details><summary> | 
| 523 | 
            +
            <details><summary>Copy Demo Code</summary>
         | 
| 579 524 |  | 
| 580 525 | 
             
            ### Install
         | 
| 581 526 |  | 
| @@ -663,11 +608,11 @@ This functionality is called [HMR (Hot Module Replacement)](https://webpack.js.o | |
| 663 608 |  | 
| 664 609 | 
             
            You can run ESLint by
         | 
| 665 610 |  | 
| 666 | 
            -
                $ yarn lint
         | 
| 611 | 
            +
                $ yarn lint # npm run lint
         | 
| 667 612 |  | 
| 668 613 | 
             
            Run Jest
         | 
| 669 614 |  | 
| 670 | 
            -
                $ yarn test:unit
         | 
| 615 | 
            +
                $ yarn test:unit # npm run test:unit
         | 
| 671 616 |  | 
| 672 617 | 
             
            ### Compile Assets
         | 
| 673 618 |  | 
| @@ -690,7 +635,7 @@ run: yarn exec vue-cli-service build | |
| 690 635 | 
             
            ...
         | 
| 691 636 | 
             
            ```
         | 
| 692 637 |  | 
| 693 | 
            -
            Your file names could be different from mine. Don't worry, we won't look those files. There are the files you  | 
| 638 | 
            +
            Your file names could be different from mine. Don't worry, we won't look those files. There are the files you will get:
         | 
| 694 639 |  | 
| 695 640 | 
             
            ```
         | 
| 696 641 | 
             
            .
         | 
| @@ -709,7 +654,9 @@ Your file names could be different from mine. Don't worry, we won't look those f | |
| 709 654 | 
             
                        └── foo.dcbad15e.js
         | 
| 710 655 | 
             
            ```
         | 
| 711 656 |  | 
| 712 | 
            -
             | 
| 657 | 
            +
            ### How Entry Point works
         | 
| 658 | 
            +
             | 
| 659 | 
            +
            Let's take a look at `app/assets/vue/manifest.json`:
         | 
| 713 660 |  | 
| 714 661 | 
             
            ```json
         | 
| 715 662 | 
             
            {
         | 
| @@ -741,4 +688,8 @@ Let have a look at `app/assets/vue/manifest.json`: | |
| 741 688 | 
             
            }
         | 
| 742 689 | 
             
            ```
         | 
| 743 690 |  | 
| 691 | 
            +
            As mentioned above, there are 2 files under `app/assets/vue/entry_points` folder: `foo.js` and `bar.js`. They will become entry points in `manifest.json`. When you call `render vue: 'bar'` in `VueDemoController` or `<%= vue_entry('foo') %>` in `app/views/vue_demo/foo.html.erb`, `vue_entry` will look for them in `entrypoints` of `manifest.json`, then generate `<link href="<path>" rel="stylesheet">` and `<script src="<path>"></script>` for each asset.
         | 
| 692 | 
            +
             | 
| 693 | 
            +
            It's slightly different on dev server. This gem will send requests to webpack-dev-server and fetch the paths on-the-fly. The request will be GET `http://localhost:3080/__manifest/?<entry_point>` for each `vue_entry`. You can also send GET request to `http://localhost:3080/__manifest/?!!INSPECT!!` to get the full manifest.
         | 
| 694 | 
            +
             | 
| 744 695 | 
             
            </details>
         | 
| @@ -121,13 +121,13 @@ class VueCreate | |
| 121 121 |  | 
| 122 122 | 
             
                # merge gitignore
         | 
| 123 123 | 
             
                if gi_input == 'm'
         | 
| 124 | 
            -
                  old_gi_line_count = gi_lines.size
         | 
| 125 124 | 
             
                  old_gi = Set.new(gi_lines.map(&:strip))
         | 
| 125 | 
            +
                  new_lines = gi.read.split("\n")
         | 
| 126 126 |  | 
| 127 | 
            -
                   | 
| 127 | 
            +
                  new_lines.map(&:strip).find_all(&:present?).each do |ln|
         | 
| 128 128 | 
             
                    gi_lines << ln unless old_gi.include?(ln)
         | 
| 129 129 | 
             
                  end
         | 
| 130 | 
            -
                  gi.write(gi_lines.map { |ln| "#{ln}\n" }.join('')) if gi_lines.size  | 
| 130 | 
            +
                  gi.write(gi_lines.map { |ln| "#{ln}\n" }.join('')) if gi_lines.size != new_lines.size
         | 
| 131 131 | 
             
                elsif gi_input == 'k'
         | 
| 132 132 | 
             
                  gi.write(gi_lines.join(''))
         | 
| 133 133 | 
             
                end
         | 
| @@ -233,7 +233,7 @@ class VueCreate | |
| 233 233 | 
             
                jest_config = JSON.parse(jest_config)
         | 
| 234 234 | 
             
                if jest_config['transformIgnorePatterns'] &&
         | 
| 235 235 | 
             
                   !jest_config['transformIgnorePatterns'].include?('<rootDir>/node_modules/')
         | 
| 236 | 
            -
                  jest_config['transformIgnorePatterns'] | 
| 236 | 
            +
                  jest_config['transformIgnorePatterns'].unshift('<rootDir>/node_modules/')
         | 
| 237 237 | 
             
                end
         | 
| 238 238 | 
             
                jest_config.delete('moduleNameMapper')
         | 
| 239 239 | 
             
                jest = <<~JS
         | 
| @@ -2,10 +2,10 @@ class VueDemoController < ApplicationController | |
| 2 2 | 
             
              layout 'vue_demo'
         | 
| 3 3 |  | 
| 4 4 | 
             
              def bar
         | 
| 5 | 
            -
                 | 
| 5 | 
            +
                render vue: 'bar' # same as `render html: vue_entry('bar'), layout: true`
         | 
| 6 6 | 
             
              end
         | 
| 7 7 |  | 
| 8 8 | 
             
              def baz
         | 
| 9 | 
            -
                render html: vue_entry('foo')
         | 
| 9 | 
            +
                render html: vue_entry('foo') # same as `render vue: 'foo', layout: false`
         | 
| 10 10 | 
             
              end
         | 
| 11 11 | 
             
            end
         | 
    
        data/lib/vue_cli/rails/engine.rb
    CHANGED
    
    | @@ -21,14 +21,14 @@ module VueCli | |
| 21 21 | 
             
                      Configuration.instance unless is_dev
         | 
| 22 22 | 
             
                    end
         | 
| 23 23 |  | 
| 24 | 
            +
                    ::ActionController::Renderers.add(:vue) do |entry, options|
         | 
| 25 | 
            +
                      render({ html: vue_entry(entry), layout: true }.merge(options))
         | 
| 26 | 
            +
                    end
         | 
| 27 | 
            +
             | 
| 24 28 | 
             
                    ::ActiveSupport.on_load(:action_controller) do
         | 
| 25 29 | 
             
                      ::ActionController::Base.class_eval do
         | 
| 26 30 | 
             
                        helper(Helper)
         | 
| 27 31 | 
             
                        include(Helper)
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                        define_method(:render_vue) do |entry, **args|
         | 
| 30 | 
            -
                          render({ html: vue_entry(entry), layout: true }.merge(args))
         | 
| 31 | 
            -
                        end
         | 
| 32 32 | 
             
                      end
         | 
| 33 33 | 
             
                    end
         | 
| 34 34 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: vue_cli-rails
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.4.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - James Chen
         | 
| @@ -119,6 +119,7 @@ files: | |
| 119 119 | 
             
            - ".rspec"
         | 
| 120 120 | 
             
            - ".rubocop.yml"
         | 
| 121 121 | 
             
            - ".travis.yml"
         | 
| 122 | 
            +
            - CHANGELOG.md
         | 
| 122 123 | 
             
            - Gemfile
         | 
| 123 124 | 
             
            - Gemfile.lock
         | 
| 124 125 | 
             
            - LICENSE
         |