Grunt with LiveReload

When you run grunt watch, you’ll still need to refresh the browser window every time you update a Less file, so the CSS updates can take effect. But there is something called LiveReload, which is a tool that does some magic.

LiveReload takes the power of grunt watch, and when it is used along with the corresponding LiveReload browser extension, it automatically reloads styles on a page without the need for a full page refresh. This can significantly boost your productivity when styling pages with LESS in Magento, and is a huge time saver.

Since we already have Grunt set up, we’ll just need the LiveReload Browser extension installed. It is available for both Chrome & Firefox.

After installing the extension, we’ll also need to make some updates to our theme. Within our theme, let’s create a file at Magento_Theme/layout/default_head_blocks.xml. This file contains any scripts or styles we’d like to add to the HTML head of the page. This will be a standard page node, that contains a head node, and we will be adding a JavaScript file to it with the script tag. Let’s add a defer attribute set to true, and set the src attribute to the location of our livereload script.

<?xml version="1.0"?>
<page xmlns:xsi="<>" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
        <script defer="true" src="/livereload.js?port=443" src_type="url"/>

If you use docker-magento for your development environment, you’ll set this to a special value of /livereload.js?port=443. Remember ther port=443 parameter, it’s very important!

If you don’t use docker-magento, you’ll want to add on the URL of your site along with the port LiveReload is listening on. By default, this is almost always http://yourdomain.test:35729. We’ll remove this for now, since I’m using docker-magento.

Finally, save & reload the page. If you hover over the LiveReload browser icon, it should say “LiveReload is connected.”. If you see any other error, or a 404 or 502 error in the browser console when trying to load livereload.js, it’s either because the livereload.js file is loaded at a different address, or grunt watch isn’t running. That’s another thing to note: the livereload server is automatically spanned off when grunt watch executes.

Complete and Continue