'Using Browsersync via a Gulp Task with DDEV-local
I am using DDEV as my local hosting environment, and many of my projects implement front end automation via Gulp. Browsersync is a major component to our front end set-up, and requires ports to be exposed by the DDEV container to the host machine. The problem at hand is two fold, what is the best way to expose a port to the host machine from the container, and what is the best set-up for a Browser-Sync Gulp task in a DDEV environment?
Solution 1:[1]
Exposing the Necessary Ports
Part one of this situation requires using a Docker Compose file to expose your container's port to the hose machine. Based on this Answer you need to create a docker-compose.browsersync.yaml
file in your .ddev
directory.
An example of that file for Browser-Sync would be as follows:
# Override the web container's standard HTTP_EXPOSE and HTTPS_EXPOSE
# This is to expose the browsersync port.
version: '3.6'
services:
web:
# ports are a list of exposed *container* ports
expose:
- '3000'
environment:
- HTTP_EXPOSE=${DDEV_ROUTER_HTTP_PORT}:80,${DDEV_MAILHOG_PORT}:8025,3001:3000
- HTTPS_EXPOSE=${DDEV_ROUTER_HTTPS_PORT}:80,${DDEV_MAILHOG_HTTPS_PORT}:8025,3000:3000
We expose Port 3000 here because it is the default for Browser-Sync, but could be updated to reflect the needs of your projects.
Note: After adding this file to your .ddev
directory you should restart your ddev project.
For more information on defining new services with docker compose, read the DDEV docs.
Setting-Up Browser-Sync in Gulp
This assumes you have a working gulpfile.js
ready to do with your other required packages included already. If you're not fully familiar with Browser-Sync and Gulp, please refer to their docs for full details.
const browserSync = require('browser-sync').create();
/*
* Set 'url' (the host and proxy hostnames) to match the canonical url of your ddev project.
* Do not include the http/s protocol in the url. The ddev-router will route the
* host machine's request to the appropriate protocol.
*
* ex: yoursite.ddev.site
*/
const url = 'yoursite.ddev.site';
/*
* This function only includes the most basic browser-sync settings needed
* to get a watch server running. Please refer to the browser-sync docs for other
* available options.
*/
const startServer = function (done) {
// Initialize BrowserSync
browserSync.init({
proxy: url,
host: url,
port: 3000,
});
done();
};
exports.startServer = startServer;
You can test this using gulp startServer
after initial set-up. Gulp will output a http
as the External URL for testing. However thanks to the ddev-router it can be accessed via http
or https
.
Solution 2:[2]
Exposing Port 3000 for HTTP & HTTPS for BrowserSync
piggy-backing on the answer from @TXChetG and the answer from @Mario Hernandez
create a file called "docker-compose.browsersync.yaml" inside your hidden /.ddev/ config folder with code below, tabbed properly (which is very important), then run the command "ddev restart"
# Override the web container standard HTTP_EXPOSE and HTTPS_EXPOSE
# This is to expose the browsersync port.
version: '3.6'
services:
web:
# ports are a list of exposed *container* ports
expose:
- '3000'
environment:
- HTTP_EXPOSE=${DDEV_ROUTER_HTTP_PORT}:80
- HTTPS_EXPOSE=${DDEV_ROUTER_HTTPS_PORT}:80
Solution 3:[3]
If you are a mac user and browsersync still doesn't work with the above solution, you might need to update your /etc/hosts file as I had to.
You can check more details in this answer.
Solution 4:[4]
I was unable to run browsersync from within the container. I updated my local system and ran browsersync locally
I used Stephen's solution elsewhere on this page (https://stackoverflow.com/a/70190271/18779 for quick reference).
I am running a Mac so I also did the following:
- Upgrade homebrew
- Use brew to install nvm
- Use nvm to install node 12 (I had to try a few versions to eliminate errors. 12 worked for me.
- Use npm to rebuild node-sass. I got sass errors before I did this.
- run browsersync. I am using Drupal and Radix subtheme so, for me, that was
cd [subtheme dir]
andnpm run watch
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | |
Solution 3 | dcolazin |
Solution 4 | zkent |