Skip to content

Instantly share code, notes, and snippets.

Last active November 8, 2022 12:31
Star You must be signed in to star a gist
What would you like to do?
gulp + expressjs + nodemon + browser-sync
'use strict';
// simple express server
var express = require('express');
var app = express();
var router = express.Router();
app.get('/', function(req, res) {
'use strict';
var gulp = require('gulp');
var browserSync = require('browser-sync');
var nodemon = require('gulp-nodemon');
gulp.task('default', ['browser-sync'], function () {
gulp.task('browser-sync', ['nodemon'], function() {
browserSync.init(null, {
proxy: "http://localhost:5000",
files: ["public/**/*.*"],
browser: "google chrome",
port: 7000,
gulp.task('nodemon', function (cb) {
var started = false;
return nodemon({
script: 'app.js'
}).on('start', function () {
// to avoid nodemon being started multiple times
// thanks @matthisk
if (!started) {
started = true;
<link rel="stylesheet" href="site.css"/>
<!-- some dummy non-conforming quick dirty html code to test browser-sync. dont't judge me. -->
<b>lorem</b> ipsum upsum dumsum
<!-- put this under /public/* -->
"name": "gulp-expressjs-nodemon-browser-sync",
"version": "0.0.0",
"description": "",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
"author": {
"name": "Hafiz Ismail",
"email": "",
"url": ""
"license": "ISC",
"dependencies": {
"express": "^4.8.2"
"devDependencies": {
"browser-sync": "^1.3.3",
"gulp": "^3.8.7",
"gulp-nodemon": "^1.0.4"
/* some css */
/* put this under /public/* */
body {
font-family: 'Helvetica';
color: red;
Copy link

Thx. I was looking for something like this!

Copy link

Thanks man. This help me a lot!

Copy link

very helpfull

Copy link

emveeoh commented Apr 3, 2016

Thank you!

Copy link

Holy moly, works fantastic! 👯

Copy link

ohsiwon commented May 13, 2016

This is great! Thank you!

Copy link

jcloutz commented May 25, 2016

This i awesome, thank you for posting!

Copy link

gcfabri commented Jun 23, 2016

Thank you, very helpful!

Copy link

great gulp-recipe.

Copy link

Just as info if you change the package nodemon for gulp-nodemon you'll get the nodemon log traces too in the console. worth it.

Copy link

akhileshmohan commented Aug 3, 2016

Very useful conversation..thank you all

Copy link

man it works, now I'm able to simulate production server with express (and kills every ugly fat bug in a wheels)

Copy link

I got a forever loading, any clue why?

Copy link

deepank411 commented Sep 10, 2016


This link has a part of my projects gulpfile:
I tried your code snippet to integrate browsersync with nodemon but all it leads to is an infinite load. No code(html/js/css) is loaded.
I have tried putting the port and the browser but to a no different result. I also unsuccessfully tried the code from .
Also my terminal log shows the nodemon is running with no error.

Can you please have a look at the gulp task and let me know if I'm doing something incorrectly.


Copy link

zootella commented Oct 5, 2016

this is awesome. thanks.

Copy link

This is great. I used it to make a my grabs a projects 'dist' folder and move it into the 'public' folder

Copy link

IanGrainger commented Nov 11, 2016

Great! I noticed my pages got out of date when I changed something that caused nodemon to restart, so I added:
.on('restart', function() {

... Except it doesn't work because it calls the reload before the server has finished running up. Darn.

Copy link

sainthkh commented Dec 9, 2016

According to API, var browserSync = require('browser-sync'); is changed to var browserSync = require('browser-sync').create(); in 2.0.

Copy link

sainthkh commented Dec 9, 2016

For those who cannot run google chrome in windows:

Internally, browser-sync uses opn library. So, the name of browser is different from OS to OS. As for windows, it's not google chrome, it's just chrome. Other browsers:

  • Internet Explorer: iexplore
  • Firefox: firefox
  • Microsoft Edge: path.join(__dirname, ".bin", "edge.exe")

As Microsoft Edge doesn't have the way to call it by cmd start "some command for edge", so we need special command line program. I've downloaded it to projectRoot/.bin and changed its name to "edge.exe". So, the name of edge is really odd. However, when every setup is done, everything works nicely.

Copy link

coverboy commented Mar 4, 2017

Pretty Awesome!! Thanks.

Copy link

For those who have the "loading forever" issue, I had to install nodemon, and then run nodemon in a separate terminal for the gulp task to load. Don't know exactly why though.

Copy link

Nice job, thx!

Copy link

Works great! Thx!

Copy link

Works great! Thx!

Copy link

Works great! Thx!

Copy link

Does someone knows how to change the default behaviour of browser-sync which automatically delivers index.html as the root directory?
I tried changing that behaviour by simply defining a route inside my app.js but somehow it gets ignored.

Copy link

binler commented Mar 7, 2018

Nice job, but i have a question?
It's just working when i access http://localhost:3000, when I access http://localhost:3000/users it not working, help me?

Copy link

danielchikaka commented Aug 28, 2018

Looks promising but it breaks after running for the first time with this error:

Error: listen EADDRINUSE :::5000

at Object._errnoException (util.js:1022:11)

at _exceptionWithHostPort (util.js:1044:20)

at Server.setupListenHandle [as _listen2] (net.js:1351:14)

at listenInCluster (net.js:1392:12)

at Server.listen (net.js:1476:7)

at Function.listen (C:\xampp\htdocs\ndondo\aug2018\jobBoard\node_modules\express\lib\application.js:618:24)

at Object.<anonymous> (C:\xampp\htdocs\ndondo\aug2018\jobBoard\index.js:36:5)

at Module._compile (module.js:643:30)

at Object.Module._extensions..js (module.js:654:10)

at Module.load (module.js:556:32)

[18:01:36] [nodemon] app crashed - waiting for file changes before starting

Any ideas why ?

Copy link

Heres a 2019 way of setting up the gulpfile since that code no longer works for running multiple tasks

const gulp = require("gulp");
const browserSync = require("browser-sync");
var nodemon = require("gulp-nodemon");

gulp.task("nodemon", cb => {
  let started = false;

  return nodemon({
    script: "server.js"
  }).on("start", () => {
    if (!started) {
      started = true;

  gulp.series("nodemon", () => {
    browserSync.init(null, {
      proxy: "http://localhost:7000",
      files: ["public/**/*.*"],

      port: 9000

gulp.task("serve", gulp.series("browser-sync", () => {}));

Copy link

Thanks @Dmitri801, works great!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment