yyx990803 / laravel-vue-cli-3

Example project using Vue CLI 3 with Laravel

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

How can I use --watch with this setup?

erik-viking opened this issue · comments

I'm trying to use "watch": "vue-cli-service build --no-clean --watch", in my package.json and it seems to somewhat work, but it rebuilds everytime I refresh my application.

That is what serve is for, take a look: 🙂
https://cli.vuejs.org/guide/cli-service.html

But using serve will try to startup a new server, I want to use the existing server that's already loaded through laravel. Using --watch I found it was looking at ALL files in the root folder, not just files under frontend/, which is why it kept rebuilding whenever it saw a change under other folders.

I'm also having issues with using serve because it's not building any files under the public/ folder. Our setup is a little different as we don't have a index.html under src/public and rely on the resources/main.blade.php to be the landing point of the application. Would appreciate any help you can provide!

@erik-viking Can you share a repository link? If you're relying on Laravel Mix and its watch feature you should keep the /package.json and /webpack.mix.js in your project root.

serve will run your Vue application in its own dev server without exposing files to /public. You can use the build script if you want your frontend to be compiled.

@erik-viking Thanks for this. It works for me, not experiencing the rebuild on refresh. HMR isn't working however. Did you get it to work for you?

If it hasn't already, maybe "watch" should be added to package.json that ships with vue-cli-3

@kharysharpe HMR won't work when build --watch is used. Source

@emanuelmutschlechner Thanks, but it seems like it is trying to do something, *.hot.json files being generated on changes, as if it is meant to work.

Right, my package.json has "watch": "vue-cli-service build --no-clean --watch", which watches files, but seems to watch files that change outside of the frontend/ folder.

The "R" in HMR would not work, I think you have to use a custom implementation of livereload or browsersync in order for that to work properly. Right now I just have to manualy refresh the page after the files are updated in the public/ folder.

Also, for more insight, here's what my vue.config.js file looks like:

const path = require('path');
const resolve = dir => path.join(__dirname, `src/${dir}`);

module.exports = {
    baseUrl: '/',
    outputDir: '../public/',
    // Fixing CircleCi Bug related to thread-loader
    parallel: !process.env.CIRCLECI,
    css: {
        sourceMap: process.env.NODE_ENV !== 'production',
    },
    configureWebpack: config => {
        // To enable sourceMaps in VSCode debugger
        config.devtool = 'source-map';
        config.watchOptions = {
            aggregateTimeout: 500,
            ignored: /node_modules|public|laradock|storage|\.git/,
        };
    },
    chainWebpack: config => {
        // setup alias resolution for require() paths
        config.resolve.alias
            // .set('@', path.join(__dirname, 'resources/src'))
            .set('api', resolve('api'))
            .set('components', resolve('components'))
            .set('images', resolve('assets/images'))
            .set('languages', resolve('languages'))
            .set('lodash', 'lodash-es')
            .set('objects', path.join(__dirname, '../shared/json'))
            .set(
                'persona-ui',
                path.join(__dirname, 'node_modules/persona-ui/src/components')
            )
            .set('plugins', resolve('plugins'))
            .set('router', resolve('router'))
            .set('store', resolve('store'))
            .set('utils', resolve('utils'))
            .set('views', resolve('views'));

        // delete HTML related webpack plugins
        // this is needed so it doesn't try to do anything
        // with the files inside public/ folder
        config.plugins.delete('html');
        config.plugins.delete('preload');
        config.plugins.delete('prefetch');
        config.plugins.delete('copy');

        config.plugin('copy').use('copy-webpack-plugin', [
            [
                {
                    from: '../.env',
                    to: __dirname,
                    toType: 'dir',
                },
            ],
        ]);

        // This will remove auto-generated files that were previously built
        config
            .plugin('clean-public')
            .use('clean-webpack-plugin', [
                [
                    'css',
                    'fonts',
                    'images',
                    'img',
                    'js',
                    '*.hot-update*',
                    '*.js',
                    '*.js.map',
                ],
                { root: path.join(__dirname, '../public') },
            ]);

        config.module.rules.delete('less');
        config.module.rules.delete('pug');
        config.module.rules.delete('sass');
        config.module.rules.delete('scss');
        config.module.rules.delete('stylus');

        config.module
            .rule('images')
            .use('url-loader')
            .tap(args => {
                // disable injection of base64 images (???)
                args.limit = -1;

                return args;
            });
    },
};

Did you ever get this resolved? I have a very similar need with a php backend.

No, I'm pretty sure you need to setup some sort of custom browserSync or liveReload functionality in order to get that to work.

I, too, have a project I would like to use Laravel to serve up the blade file as the entry point for the app (as opposed to vue-cli's node server) and have HMR work as well. I tried following #11, but it doesn't seem to be a straightforward solution. Has anyone been able to get this sort of setup running? Or do I need to ditch vue-cli entirely and run laravel-mix instead?