├── cats ├── server.js ├── public │ ├── css │ │ └── main.css │ ├── index.html │ └── js │ │ ├── main.js │ │ └── main-dev.js ├── css │ └── index.styl ├── js │ └── index.js ├── src │ └── index.js ├── package.json ├── Dockerfile └── Dockerfile-dev ├── dogs ├── server.js ├── public │ ├── css │ │ └── main.css │ ├── index.html │ └── js │ │ ├── main.js │ │ └── main-dev.js ├── css │ └── index.styl ├── js │ └── index.js ├── src │ └── index.js ├── package.json ├── Dockerfile └── Dockerfile-dev ├── index ├── server.js ├── public │ └── index.html ├── src │ └── index.js ├── package.json ├── Dockerfile └── Dockerfile-dev ├── proxy ├── server.js ├── Dockerfile ├── package.json ├── Dockerfile-dev └── src │ └── index.js ├── .gitignore ├── sh ├── build.sh ├── scale.sh ├── stop.sh ├── run.sh ├── build-dev.sh ├── run-dev.sh ├── scale-dev.sh ├── stop-dev.sh ├── restart-dev.sh └── npminstall-dev.sh ├── rollup.config.js ├── package.json ├── docker-compose.yml ├── README.md ├── docker-compose-dev.yml └── watch.js /cats/server.js: -------------------------------------------------------------------------------- 1 | 2 | require('./src'); 3 | -------------------------------------------------------------------------------- /dogs/server.js: -------------------------------------------------------------------------------- 1 | 2 | require('./src'); 3 | -------------------------------------------------------------------------------- /index/server.js: -------------------------------------------------------------------------------- 1 | 2 | require('./src'); 3 | -------------------------------------------------------------------------------- /proxy/server.js: -------------------------------------------------------------------------------- 1 | 2 | require('./src'); 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | npm-debug.log 2 | node_modules 3 | -------------------------------------------------------------------------------- /cats/public/css/main.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #f9f9f9; 3 | } 4 | -------------------------------------------------------------------------------- /dogs/public/css/main.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #f9f9f9; 3 | } 4 | -------------------------------------------------------------------------------- /cats/css/index.styl: -------------------------------------------------------------------------------- 1 | 2 | @import 'nib' 3 | 4 | body 5 | background-color: #f9f9f9 6 | -------------------------------------------------------------------------------- /dogs/css/index.styl: -------------------------------------------------------------------------------- 1 | 2 | @import 'nib' 3 | 4 | body 5 | background-color: #f9f9f9 6 | -------------------------------------------------------------------------------- /sh/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker-compose -p boilerplate -f docker-compose.yml build $@ 4 | -------------------------------------------------------------------------------- /sh/scale.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker-compose -p boilerplate -f docker-compose.yml scale $@ 4 | -------------------------------------------------------------------------------- /sh/stop.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker-compose -p boilerplate -f docker-compose.yml down $@ 4 | -------------------------------------------------------------------------------- /sh/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker-compose -p boilerplate -f docker-compose-dev.yml up -d $@ 4 | -------------------------------------------------------------------------------- /sh/build-dev.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker-compose -p boilerplatedev -f docker-compose-dev.yml build $@ 4 | -------------------------------------------------------------------------------- /sh/run-dev.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker-compose -p boilerplatedev -f docker-compose-dev.yml up -d $@ 4 | -------------------------------------------------------------------------------- /sh/scale-dev.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker-compose -p boilerplatedev -f docker-compose-dev.yml scale $@ 4 | -------------------------------------------------------------------------------- /sh/stop-dev.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker-compose -p boilerplatedev -f docker-compose-dev.yml down $@ 4 | -------------------------------------------------------------------------------- /sh/restart-dev.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker-compose -p boilerplatedev -f docker-compose-dev.yml restart $@ 4 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | 2 | import buble from 'rollup-plugin-buble'; 3 | 4 | export default { 5 | plugins: [ buble() ] 6 | }; 7 | -------------------------------------------------------------------------------- /sh/npminstall-dev.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker-compose -p boilerplatedev -f docker-compose-dev.yml exec $@ npm install 4 | -------------------------------------------------------------------------------- /cats/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Cats! 🐈 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /dogs/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Dogs! 🐕 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /cats/public/js/main.js: -------------------------------------------------------------------------------- 1 | !function(){"use strict";var e=document.createElement("h1"),t=document.createElement("a");e.textContent="Meow!",t.href="/",t.textContent="Back to index",document.body.appendChild(e),document.body.appendChild(t)}(); -------------------------------------------------------------------------------- /dogs/public/js/main.js: -------------------------------------------------------------------------------- 1 | !function(){"use strict";var e=document.createElement("a"),t=document.createElement("h1");t.textContent="Woof!",e.href="/",e.textContent="Back to index",document.body.appendChild(t),document.body.appendChild(e)}(); -------------------------------------------------------------------------------- /index/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 🐈🐕 6 | 7 |

Cats!

8 |

Dogs!

9 | 10 | 11 | -------------------------------------------------------------------------------- /cats/js/index.js: -------------------------------------------------------------------------------- 1 | 2 | var hello = document.createElement('h1'); 3 | var index = document.createElement('a'); 4 | 5 | hello.textContent = 'Meow!' 6 | 7 | index.href = '/'; 8 | index.textContent = 'Back to index'; 9 | 10 | document.body.appendChild(hello); 11 | document.body.appendChild(index); 12 | -------------------------------------------------------------------------------- /dogs/js/index.js: -------------------------------------------------------------------------------- 1 | 2 | var index = document.createElement('a'); 3 | var hello = document.createElement('h1'); 4 | 5 | hello.textContent = 'Woof!' 6 | 7 | index.href = '/'; 8 | index.textContent = 'Back to index'; 9 | 10 | document.body.appendChild(hello); 11 | document.body.appendChild(index); 12 | -------------------------------------------------------------------------------- /cats/src/index.js: -------------------------------------------------------------------------------- 1 | 2 | var path = require('path'); 3 | 4 | var express = require('express'); 5 | var compression = require('compression'); 6 | 7 | var app = express(); 8 | 9 | var STATIC_PATH = path.join(__dirname, '..', 'public'); 10 | 11 | app.use(compression()); 12 | app.use(express.static(STATIC_PATH)); 13 | 14 | app.listen(80); 15 | -------------------------------------------------------------------------------- /dogs/src/index.js: -------------------------------------------------------------------------------- 1 | 2 | var path = require('path'); 3 | 4 | var express = require('express'); 5 | var compression = require('compression'); 6 | 7 | var app = express(); 8 | 9 | var STATIC_PATH = path.join(__dirname, '..', 'public'); 10 | 11 | app.use(compression()); 12 | app.use(express.static(STATIC_PATH)); 13 | 14 | app.listen(80); 15 | -------------------------------------------------------------------------------- /index/src/index.js: -------------------------------------------------------------------------------- 1 | 2 | var path = require('path'); 3 | 4 | var express = require('express'); 5 | var compression = require('compression'); 6 | 7 | var app = express(); 8 | 9 | var STATIC_PATH = path.join(__dirname, '..', 'public'); 10 | 11 | app.use(compression()); 12 | app.use(express.static(STATIC_PATH)); 13 | 14 | app.listen(80); 15 | -------------------------------------------------------------------------------- /cats/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cats", 3 | "version": "0.0.1", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "compression": "~1.6.1", 13 | "express": "~4.13.4" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /dogs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dogs", 3 | "version": "0.0.1", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "compression": "~1.6.1", 13 | "express": "~4.13.4" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /index/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dogs", 3 | "version": "0.0.1", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "compression": "~1.6.1", 13 | "express": "~4.13.4" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /cats/public/js/main-dev.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 'use strict'; 3 | 4 | var hello = document.createElement('h1'); 5 | var index = document.createElement('a'); 6 | 7 | hello.textContent = 'Meow!' 8 | 9 | index.href = '/'; 10 | index.textContent = 'Back to index'; 11 | 12 | document.body.appendChild(hello); 13 | document.body.appendChild(index); 14 | 15 | }()); -------------------------------------------------------------------------------- /dogs/public/js/main-dev.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 'use strict'; 3 | 4 | var index = document.createElement('a'); 5 | var hello = document.createElement('h1'); 6 | 7 | hello.textContent = 'Woof!' 8 | 9 | index.href = '/'; 10 | index.textContent = 'Back to index'; 11 | 12 | document.body.appendChild(hello); 13 | document.body.appendChild(index); 14 | 15 | }()); -------------------------------------------------------------------------------- /proxy/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM node:argon 3 | MAINTAINER Juha Lindstedt 4 | 5 | ENV NODE_ENV=production 6 | 7 | RUN mkdir -p /app 8 | 9 | COPY ./src /app/src 10 | COPY ./package.json /app/package.json 11 | COPY ./server.js /app/server.js 12 | 13 | WORKDIR /app 14 | 15 | RUN npm install 16 | 17 | ENTRYPOINT ["npm", "start"] 18 | EXPOSE 80 19 | -------------------------------------------------------------------------------- /proxy/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "proxy", 3 | "version": "0.0.1", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "express": "~4.13.4", 13 | "http-proxy": "~1.13.1" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /cats/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM node:argon 3 | MAINTAINER Juha Lindstedt 4 | 5 | ENV NODE_ENV=production 6 | 7 | RUN mkdir -p /app 8 | 9 | COPY ./public /app/public 10 | COPY ./src /app/src 11 | COPY ./package.json /app/package.json 12 | COPY ./server.js /app/server.js 13 | 14 | WORKDIR /app 15 | 16 | RUN npm install 17 | 18 | ENTRYPOINT ["npm", "start"] 19 | EXPOSE 80 20 | -------------------------------------------------------------------------------- /dogs/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM node:argon 3 | MAINTAINER Juha Lindstedt 4 | 5 | ENV NODE_ENV=production 6 | 7 | RUN mkdir -p /app 8 | 9 | COPY ./public /app/public 10 | COPY ./src /app/src 11 | COPY ./package.json /app/package.json 12 | COPY ./server.js /app/server.js 13 | 14 | WORKDIR /app 15 | 16 | RUN npm install 17 | 18 | ENTRYPOINT ["npm", "start"] 19 | EXPOSE 80 20 | -------------------------------------------------------------------------------- /index/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM node:argon 3 | MAINTAINER Juha Lindstedt 4 | 5 | ENV NODE_ENV=production 6 | 7 | RUN mkdir -p /app 8 | 9 | COPY ./public /app/public 10 | COPY ./src /app/src 11 | COPY ./package.json /app/package.json 12 | COPY ./server.js /app/server.js 13 | 14 | WORKDIR /app 15 | 16 | RUN npm install 17 | 18 | ENTRYPOINT ["npm", "start"] 19 | EXPOSE 80 20 | -------------------------------------------------------------------------------- /proxy/Dockerfile-dev: -------------------------------------------------------------------------------- 1 | 2 | FROM node:argon 3 | MAINTAINER Juha Lindstedt 4 | 5 | ENV NODE_ENV=development 6 | 7 | RUN mkdir -p /app 8 | 9 | COPY ./src /app/src 10 | COPY ./package.json /app/package.json 11 | COPY ./server.js /app/server.js 12 | 13 | WORKDIR /app 14 | 15 | RUN npm install 16 | 17 | ENTRYPOINT ["npm", "start"] 18 | EXPOSE 80 19 | 20 | VOLUME /app/src 21 | -------------------------------------------------------------------------------- /cats/Dockerfile-dev: -------------------------------------------------------------------------------- 1 | 2 | FROM node:argon 3 | MAINTAINER Juha Lindstedt 4 | 5 | ENV NODE_ENV=development 6 | 7 | RUN mkdir -p /app 8 | 9 | COPY ./public /app/public 10 | COPY ./src /app/src 11 | COPY ./package.json /app/package.json 12 | COPY ./server.js /app/server.js 13 | 14 | WORKDIR /app 15 | 16 | RUN npm install 17 | 18 | ENTRYPOINT ["npm", "start"] 19 | EXPOSE 80 20 | 21 | VOLUME /app/public 22 | VOLUME /app/src 23 | -------------------------------------------------------------------------------- /dogs/Dockerfile-dev: -------------------------------------------------------------------------------- 1 | 2 | FROM node:argon 3 | MAINTAINER Juha Lindstedt 4 | 5 | ENV NODE_ENV=development 6 | 7 | RUN mkdir -p /app 8 | 9 | COPY ./public /app/public 10 | COPY ./src /app/src 11 | COPY ./package.json /app/package.json 12 | COPY ./server.js /app/server.js 13 | 14 | WORKDIR /app 15 | 16 | RUN npm install 17 | 18 | ENTRYPOINT ["npm", "start"] 19 | EXPOSE 80 20 | 21 | VOLUME /app/public 22 | VOLUME /app/src 23 | -------------------------------------------------------------------------------- /index/Dockerfile-dev: -------------------------------------------------------------------------------- 1 | 2 | FROM node:argon 3 | MAINTAINER Juha Lindstedt 4 | 5 | ENV NODE_ENV=development 6 | 7 | RUN mkdir -p /app 8 | 9 | COPY ./public /app/public 10 | COPY ./src /app/src 11 | COPY ./package.json /app/package.json 12 | COPY ./server.js /app/server.js 13 | 14 | WORKDIR /app 15 | 16 | RUN npm install 17 | 18 | ENTRYPOINT ["npm", "start"] 19 | EXPOSE 80 20 | 21 | VOLUME /app/public 22 | VOLUME /app/src 23 | -------------------------------------------------------------------------------- /proxy/src/index.js: -------------------------------------------------------------------------------- 1 | 2 | var NET = process.env.NET; 3 | 4 | var express = require('express'); 5 | var app = express(); 6 | var httpProxy = require('http-proxy'); 7 | 8 | var proxy = httpProxy.createProxyServer(); 9 | 10 | app.set('strict routing', true); 11 | 12 | app.get('/cats', redirectTo('/cats/')); 13 | app.get('/dogs', redirectTo('/dogs/')); 14 | 15 | app.get('/', proxyTo(`http://index`)); 16 | 17 | app.use('/cats', proxyTo(`http://cats`)); 18 | app.use('/dogs', proxyTo(`http://dogs`)); 19 | 20 | function redirectTo (target) { 21 | return function (req, res, next) { 22 | res.redirect(target); 23 | } 24 | } 25 | 26 | function proxyTo (target) { 27 | return function (req, res, next) { 28 | proxy.web(req, res, {target: target}); 29 | } 30 | } 31 | 32 | app.listen(80); 33 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docker-boilerplate", 3 | "version": "0.0.1", 4 | "description": "", 5 | "main": "watch.js", 6 | "scripts": { 7 | "dev": "sh sh/build-dev.sh && sh sh/run-dev.sh && node watch", 8 | "dev-stop": "sh sh/stop-dev.sh", 9 | "start": "sh sh/build.sh && sh sh/run.sh", 10 | "stop": "sh sh/stop.sh", 11 | "stop-dev": "sh sh/stop-dev.sh", 12 | "npminstall": "sh sh/npminstall-dev.sh", 13 | "restart": "sh sh/restart-dev.sh", 14 | "scale": "sh sh/scale.sh", 15 | "scale-dev": "sh sh/scale-dev.sh" 16 | }, 17 | "author": "", 18 | "license": "ISC", 19 | "devDependencies": { 20 | "chokidar": "~1.4.2", 21 | "nib": "~1.1.0", 22 | "rollup": "~0.26.1", 23 | "rollup-plugin-buble": "~0.6.0", 24 | "stylus": "~0.54.5", 25 | "uglify-js": "~2.6.1" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | 3 | services: 4 | proxy: 5 | build: 6 | context: proxy 7 | dockerfile: Dockerfile 8 | restart: 'always' 9 | environment: 10 | NET: 'boilerplate' 11 | networks: 12 | boilerplate: 13 | ports: 14 | - '80:80' 15 | 16 | index: 17 | build: 18 | context: index 19 | dockerfile: Dockerfile 20 | restart: 'always' 21 | environment: 22 | NET: 'boilerplate' 23 | networks: 24 | boilerplate: 25 | aliases: 26 | - index 27 | 28 | cats: 29 | build: 30 | context: cats 31 | dockerfile: Dockerfile 32 | restart: 'always' 33 | environment: 34 | NET: 'boilerplate' 35 | networks: 36 | boilerplate: 37 | aliases: 38 | - cats 39 | 40 | dogs: 41 | build: 42 | context: dogs 43 | dockerfile: Dockerfile 44 | restart: 'always' 45 | environment: 46 | NET: 'boilerplate' 47 | networks: 48 | boilerplate: 49 | aliases: 50 | - dogs 51 | 52 | networks: 53 | boilerplate: 54 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Docker + Node.js boilerplate 2 | 3 | ## Clone 4 | ``` 5 | git clone http://github.com/pakastin/docker-boilerplate 6 | ``` 7 | 8 | ## Run dev environment 9 | ``` 10 | npm install 11 | npm run dev 12 | ``` 13 | 1) Mounts following files/folders for rapid updates: 14 | - [process]/public --> /app/public 15 | - [process]/src --> /app/src 16 | 17 | (node_modules are in /app/node_modules) 18 | 19 | 2) Starts watching following files: 20 | - [process]/css/**/*.styl --> build CSS to [process]/public/css/main.css 21 | - [process]/js/**/*.js --> build JS to [process]/public/js/main.js 22 | - [process]/src/**/*.js --> restart process 23 | - [process]/package.json --> npm install + restart process 24 | 25 | 3) Will quit on cmd+c 26 | 27 | ### Start production version 28 | ``` 29 | npm start 30 | ``` 31 | ### Start production version without node.js 32 | ``` 33 | docker-compose up -d 34 | ``` 35 | ### Scale containers 36 | ``` 37 | npm run scale cats=5 dogs=5 38 | ``` 39 | ### Scale containers without node.js 40 | ``` 41 | docker-compose scale cats=1 dogs=2 index=3 proxy=4 42 | ``` 43 | ### Scale dev containers 44 | ``` 45 | npm run scale-dev cats=5 dogs=5 46 | ``` 47 | ### Stop containers 48 | ``` 49 | npm run stop 50 | ``` 51 | ### Stop dev containers 52 | ``` 53 | npm run stop-dev 54 | ``` 55 | -------------------------------------------------------------------------------- /docker-compose-dev.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | 3 | services: 4 | proxy: 5 | build: 6 | context: proxy 7 | dockerfile: Dockerfile-dev 8 | restart: 'always' 9 | environment: 10 | NET: 'boilerplatedev' 11 | networks: 12 | boilerplatedev: 13 | ports: 14 | - '80:80' 15 | volumes: 16 | - './proxy/src:/app/src' 17 | 18 | index: 19 | build: 20 | context: index 21 | dockerfile: Dockerfile-dev 22 | restart: 'always' 23 | environment: 24 | NET: 'boilerplatedev' 25 | networks: 26 | boilerplatedev: 27 | aliases: 28 | - index 29 | volumes: 30 | - './index/public:/app/public' 31 | - './index/src:/app/src' 32 | 33 | cats: 34 | build: 35 | context: cats 36 | dockerfile: Dockerfile-dev 37 | restart: 'always' 38 | environment: 39 | NET: 'boilerplatedev' 40 | networks: 41 | boilerplatedev: 42 | aliases: 43 | - cats 44 | volumes: 45 | - './cats/public:/app/public' 46 | - './cats/src:/app/src' 47 | 48 | dogs: 49 | build: 50 | context: dogs 51 | dockerfile: Dockerfile-dev 52 | restart: 'always' 53 | environment: 54 | NET: 'boilerplatedev' 55 | networks: 56 | boilerplatedev: 57 | aliases: 58 | - dogs 59 | volumes: 60 | - './dogs/public:/app/public' 61 | - './dogs/src:/app/src' 62 | 63 | networks: 64 | boilerplatedev: 65 | -------------------------------------------------------------------------------- /watch.js: -------------------------------------------------------------------------------- 1 | 2 | var cp = require('child_process'); 3 | 4 | var chokidar = require('chokidar'); 5 | 6 | watchNode('proxy'); 7 | 8 | watchNode('index'); 9 | 10 | watchNode('cats'); 11 | watchCSS('cats', true); 12 | watchJS('cats', true); 13 | 14 | watchNode('dogs'); 15 | watchCSS('dogs', true); 16 | watchJS('dogs', true); 17 | 18 | function watchNode (name) { 19 | var cmd = `npm run restart ${name}`; 20 | var cmd2 = `npm run npminstall ${name}`; 21 | 22 | chokidar.watch(`${name}/src/**/*.js`) 23 | .on('change', exec(cmd)); 24 | 25 | chokidar.watch(`${name}/package.json`) 26 | .on('change', exec(cmd2, cmd)); 27 | } 28 | 29 | function watchCSS (name, init) { 30 | var cmd = `stylus -u nib ${name}/css/index.styl -o ${name}/public/css/main.css`; 31 | init && exec(cmd)(); 32 | 33 | chokidar.watch(`${name}/css/**/*.styl`) 34 | .on('change', exec(cmd)); 35 | } 36 | 37 | function watchJS (name, init) { 38 | var cmd = `rollup -c -f iife ${name}/js/index.js -o ${name}/public/js/main-dev.js`; 39 | var cmd2 = `uglifyjs ${name}/public/js/main-dev.js -cmo ${name}/public/js/main.js`; 40 | 41 | init && exec(cmd, cmd2)(); 42 | 43 | chokidar.watch(`${name}/js/**/*.js`) 44 | .on('change', exec(cmd, cmd2)); 45 | } 46 | 47 | function exec (cmd) { 48 | cmd = cmd.split(' '); 49 | var args = new Array(arguments.length - 1); 50 | for (var i = 1; i < arguments.length; i++) { 51 | args[i - 1] = arguments[i]; 52 | } 53 | return () => { 54 | console.log(cmd.join(' ')); 55 | var childProcess = cp.spawn(cmd[0], cmd.slice(1)); 56 | 57 | childProcess.stdout.pipe(process.stdout); 58 | childProcess.stderr.pipe(process.stderr); 59 | childProcess.on('error', console.error); 60 | 61 | if (args.length > 0) { 62 | childProcess.on('exit', () => { 63 | exec.apply(this, args)(); 64 | }); 65 | } 66 | } 67 | } 68 | --------------------------------------------------------------------------------