{"componentChunkName":"component---gatsby-theme-teklog-src-templates-post-tsx","path":"/how-to-configure-browser-sync-live-reloading-in-your-current-or-next-laravel-project-running-on-homestead-virtual-machine","result":{"data":{"site":{"siteMetadata":{"siteUrl":"https://blog.tekmi.nl","author":{"name":"Teklog","avatar":"/img/tekmi-icon.svg"}}},"blogPost":{"frontmatter":{"title":"How to configure Browser Sync live reloading in your current or next Laravel project running on Homestead Virtual Machine","slug":"how-to-configure-browser-sync-live-reloading-in-your-current-or-next-laravel-project-running-on-homestead-virtual-machine","series":null,"date":"2017-07-15","datePretty":"15 July, 2017","coverImage":{"childImageSharp":{"fixed":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAUCAwT/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAbtaWea+Egf/xAAaEAACAgMAAAAAAAAAAAAAAAAAAQMRAhIT/9oACAEBAAEFAlKjGQ3RZ0ZbP//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAEDAQE/AUf/xAAWEQEBAQAAAAAAAAAAAAAAAAAAERL/2gAIAQIBAT8BrT//xAAYEAACAwAAAAAAAAAAAAAAAAAAMQEQIf/aAAgBAQAGPwK8HIz/xAAZEAEBAQEBAQAAAAAAAAAAAAABABFBYXH/2gAIAQEAAT8hJ2FvYnDxAGbH2GNJ/9oADAMBAAIAAwAAABDAH//EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAEDAQE/EEY//8QAFhEBAQEAAAAAAAAAAAAAAAAAAAER/9oACAECAQE/EJLD/8QAGxABAAICAwAAAAAAAAAAAAAAAQARITFBUWH/2gAIAQEAAT8QZMJR1ASkn1g1VywnEBvtNoOQibqf/9k=","width":1000,"height":750,"src":"/static/24ebc127a8a3b7a94b40b7a9c0c1eba5/a7715/cyclingRouteWaterStorm.jpg","srcSet":"/static/24ebc127a8a3b7a94b40b7a9c0c1eba5/a7715/cyclingRouteWaterStorm.jpg 1x"}}},"author":null,"authorAvatar":null},"timeToRead":5,"excerpt":"Introduction Browser Sync is an open source tool that can instantaneously synchronize your code changes with your browser. As soon as the file is…","html":"<h2 id=\"introduction\" style=\"position:relative;\"><a href=\"#introduction\" aria-label=\"introduction permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Introduction</h2>\n<p><a href=\"https://www.browsersync.io/docs\">Browser Sync</a> is an open source tool that can instantaneously synchronize your code changes with your browser. As soon as the file is saved, automatic webpage reload happens, without any action from your side.</p>\n<p>You could use Browser Sync outside Laravel and without Laravel Mix asset bundler, however in this tutorial I will focus primarily on how to harvest its greatest features with truly minimalistic configuration.</p>\n<p>All the hardest work has already been done by Laravel Mix, which lets you incorporate Browser Sync into your project with little effort. If you are interested, Laravel Mix uses Webpack module bundler with <em>browser-sync-webpack-plugin</em> under the hood.</p>\n<p>So, do you want to gain some time while developing your current or future Laravel project? If the answer is yes, then let's start it off right away!</p>\n<h2 id=\"assumptions\" style=\"position:relative;\"><a href=\"#assumptions\" aria-label=\"assumptions permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Assumptions</h2>\n<ul>\n<li>Homestead Virtual Machine is up and running</li>\n<li>Fresh or existing Laravel project with Laravel Mix is configured and running in your browser</li>\n</ul>\n<h2 id=\"solution\" style=\"position:relative;\"><a href=\"#solution\" aria-label=\"solution permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Solution</h2>\n<p>Update Laravel Mix <strong>webpack.mix.js</strong> configuration file</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">mix<span class=\"token punctuation\">.</span><span class=\"token function\">browserSync</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  open<span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n  files<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token string\">'app/**/*'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">'public/**/*'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">'resources/views/**/*'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">'routes/**/*'</span>\n  <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>As you see, Browser Sync will listen for changes only inside the most important Laravel folders, as well as their subfolders. Additionally, option open is set to false, because inside the Virtual Machine there is no X Window System configured - therefore no way to open the graphical browser window from a terminal.</p>\n<p>Make sure you don't track changes on directories like <em>resources/js</em>, <em>resources/sass</em>, since those are usually pre-processed by specific plugins (e.g: Sass processor, Babel transpiler). What you should be really up for are the output files generated by them, usually saved under public folder, as shown below</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">mix<span class=\"token punctuation\">.</span><span class=\"token function\">sass</span><span class=\"token punctuation\">(</span><span class=\"token string\">'resources/assets/sass/app.scss'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'public/css'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">js</span><span class=\"token punctuation\">(</span><span class=\"token string\">'resources/assets/js/app.js'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'public/js'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">react</span><span class=\"token punctuation\">(</span><span class=\"token string\">'resources/assets/js/appreact.js'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'public/js'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Next, head over to your Blade main layout file and paste following snippet right before <code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">></span></span></code> tag.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\">@if (getenv('APP_ENV') === 'local')\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>__bs_script__<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"><span class=\"token language-javascript\"><span class=\"token comment\">//</span></span><span class=\"token included-cdata\"><span class=\"token cdata\">&lt;![CDATA[</span><span class=\"token language-javascript\">\n    document<span class=\"token punctuation\">.</span><span class=\"token function\">write</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"&lt;script async src='http://HOST:3000/browser-sync/browser-sync-client.js?v=2.18.12'>&lt;/script>\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"HOST\"</span><span class=\"token punctuation\">,</span> location<span class=\"token punctuation\">.</span>hostname<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">//</span></span><span class=\"token cdata\">]]></span></span><span class=\"token language-javascript\">\n  </span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span>\n@endif</code></pre></div>\n<p>Before we continue, let's stop and try to understand what is happening there</p>\n<ul>\n<li>Browser Sync client script will be loaded only after you define <code class=\"language-text\">APP_ENV</code> variable as local inside <em>.env</em> file</li>\n<li><code class=\"language-text\">HOST</code> placeholder will be replaced by Hostname (if your URI was <em><a href=\"http://homestead.app/users\">http://homestead.app/users</a></em>, then <code class=\"language-text\">HOST</code> will become <em>homestead.app</em>)</li>\n<li><em>3000</em> is a default port used by Browser Sync, if you defined other port inside your <em>webpack.mix.js</em>, make sure you change this too</li>\n<li><em>2.18.12</em> is a Browser Sync version, verify your version by running <code class=\"language-text\">node_modules/browser-sync/bin/browser-sync.js --version</code> and adjust the <code class=\"language-text\">?v</code> variable accordingly</li>\n</ul>\n<p>Next, open terminal window on your host machine and SSH onto your Homestead Virtual Machine</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">homestead <span class=\"token function\">ssh</span></code></pre></div>\n<p>If your host Unix-like operating system doesn't recognize this command, consider creating a helpful function</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token keyword\">function</span> <span class=\"token function-name function\">homestead</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token punctuation\">(</span> <span class=\"token builtin class-name\">cd</span> ~/path/to/your/homestead/directory <span class=\"token operator\">&amp;&amp;</span> vagrant <span class=\"token variable\">$*</span> <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>It should be placed inside your shell configuration file (e.g: <em>.bashrc</em>, <em>.bash_profile</em>, <em>.zshrc</em>) and sourced, if you want to use it immediately (<code class=\"language-bash\"><span class=\"token builtin class-name\">source</span> ~/.bashrc</code>).</p>\n<p>Inside your Virtual Machine, traverse to your Laravel application directory (the one where <em>package.json</em> exists) and run</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> run <span class=\"token function\">watch</span></code></pre></div>\n<p>You may experience dependency pre-installation screen, as shown below</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">Additional dependencies must be installed. This will only take a moment.\n<span class=\"token builtin class-name\">.</span>\n<span class=\"token builtin class-name\">.</span>\n<span class=\"token builtin class-name\">.</span>\nFinished. Please run Mix again.</code></pre></div>\n<p>This will most probably install <em>browser-sync-webpack-plugin</em> package.</p>\n<p>Once it's finished, rerun previous command: <code class=\"language-bash\"><span class=\"token function\">npm</span> run <span class=\"token function\">watch</span></code> and you should see the output similar to the one below</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">DONE Compiled successfully <span class=\"token keyword\">in</span> 7168ms \n<span class=\"token builtin class-name\">.</span>\n<span class=\"token builtin class-name\">.</span>\n<span class=\"token builtin class-name\">.</span>\n<span class=\"token punctuation\">[</span>BS<span class=\"token punctuation\">]</span> Proxying: http://app.dev\n<span class=\"token punctuation\">[</span>BS<span class=\"token punctuation\">]</span> Access URLs:\n ----------------------------------\n Local: http://localhost:3000\n External: http://10.0.2.15:3000\n ----------------------------------\n UI: http://localhost:3001\n UI External: http://10.0.2.15:3001\n ----------------------------------\n<span class=\"token punctuation\">[</span>BS<span class=\"token punctuation\">]</span> Watching files<span class=\"token punctuation\">..</span>.</code></pre></div>\n<p>Don't worry about those magic Hosts and IPs, you may change them inside your Browser Sync configuration, but from my experience, they didn't have any effect.</p>\n<p>Hint: If <a href=\"https://webpack.js.org/configuration/watch/#watchoptions-poll\">npm watching does not work for you</a>, consider using <code class=\"language-bash\"><span class=\"token function\">npm</span> run watch-poll</code>.</p>\n<p>That's all that is to it, now it's high time to test if everything works well.</p>\n<p>On your host machine, open your favorite browser and paste the project's url (e.g <a href=\"http://homestead.app\">http://homestead.app</a>). On the top right corner you should see a popup with text <em>Connected to BrowserSync.</em></p>\n<p>Head over to your IDE editor, change something in your Blade template, Javascript or CSS files and save it. Make sure it's also saved on your Homestead Virtual Machine, since this is the place where Browser Sync is watching for changes.</p>\n<p>Once done, you should see the live reloading in play. Isn't it cool? If you have two monitors, this can tremendously speed up your development.</p>\n<p>BrowserSync also provides handy UI console. In order to see it, open a new tab in your host machine's web browser, pasting your project URL followed by port 3001 (e.g: <em><a href=\"http://homestead.app:3001\">http://homestead.app:3001</a></em>)</p>\n<h2 id=\"summary\" style=\"position:relative;\"><a href=\"#summary\" aria-label=\"summary permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Summary</h2>\n<p>Browser Sync is an amazing tool, which can make your life as a developer much easier and more rewarding. It has a few other features I didn't even touch here, so feel free to scan their <a href=\"https://www.browsersync.io/\">Browser Sync website</a> yourself.</p>\n<p>You can also track the <a href=\"https://github.com/JeffreyWay/laravel-mix/blob/master/docs/browsersync.md\">Laravel Mix Browser Sync documentation</a>, however it's not very handy.</p>\n<p>Besides Browser Sync, there is another cross-browser synchronization tool out there, which name is LiveReload.</p>\n<p>I will dedicate the whole blogpost to it, but if you are really impatient, feel free to check the <a href=\"https://github.com/JeffreyWay/laravel-mix/blob/master/docs/livereload.md\">Laravel Mix Live Reload documentation</a> yourself.</p>"}},"pageContext":{"postId":"b340b7be-45fc-5caa-9e64-740f56a730b8","slug":"how-to-configure-browser-sync-live-reloading-in-your-current-or-next-laravel-project-running-on-homestead-virtual-machine"}}}