版权声明:本文由金朝麟原创文章,转载请注明出处: 
文章原文链接:https://www.qcloud.com/community/article/627049001486519548

来源:腾云阁 https://www.qcloud.com/community

原来用的React+Webpack时,那种同步压缩修改、实时动态刷新页面的感觉真的太棒了。但如果使用Express+ejs+less的话,配置webpack非常繁琐,所以,一番折腾后,于是有了Express+Less+Gulp的配置方案,效果见下图,项目地址:https://github.com/ycjcl868/Express_Gulp

目的

我使用Express+Ejs+Less开发,想开发时对所有资源进行压缩同步到浏览器端,Google搜索一遍,都不是太符合我的项目要求。于是看着Gulp文档结合npmjs.com终于折腾完毕。

配置

下面说下我的配置方法:

我的目录结构:

├── app.js   # Express Server
├── bin
│ └── www # 启动Server
├── dist # 编译压缩目录(部署目录)
│ ├── css
│ ├── img
│ ├── js
│ ├── views
│ └── lib # 第三方库目录(bower安装)
├── .bowerrc # bower前端安装库
├── gulpfile.js # Gulp配置文件
├── package.json
├── public # 开发目录
│ ├── img
│ ├── js
│ └── less
├── routes
│ ├── index.js
│ └── users.js
└── views # html
├── error.ejs
└── index.ejs

package.json文件内容:

{
"name": "voteapp",
"version": "1.0.0",
"description": "",
"main": "app.js",
"dependencies": {
"body-parser": "~1.13.2",
"cookie-parser": "~1.3.5",
"debug": "~2.2.0",
"ejs": "~2.3.3",
"express": "~4.13.1",
"morgan": "~1.6.1",
"serve-favicon": "~2.3.0"
},
"devDependencies": {
"browser-sync": "^2.18.6",
"del": "^2.2.2",
"gulp": "^3.9.1",
"gulp-cache": "^0.4.5",
"gulp-clean-css": "^2.3.2",
"gulp-concat": "^2.6.1",
"gulp-ejs": "^2.3.0",
"gulp-htmlmin": "^3.0.0",
"gulp-imagemin": "^3.1.1",
"gulp-less": "^3.3.0",
"gulp-livereload": "^3.8.1",
"gulp-nodemon": "^2.2.1",
"gulp-uglify": "^2.0.0",
"gulp-watch": "^4.3.11"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}

gulpfile.js文件

'use strict';
var gulp = require('gulp');
var minify = require('gulp-clean-css');
var browserSync = require('browser-sync');
var nodemon = require('gulp-nodemon');
var cache = require('gulp-cache');
var uglify = require('gulp-uglify');
var htmlmin = require('gulp-htmlmin');
var imagemin = require('gulp-imagemin');
var less = require('gulp-less');
var path = require('path');
var livereload = require('gulp-livereload');
var concat = require('gulp-concat');
var jshint = require('gulp-jshint');
var cssBase64 = require('gulp-base64');
var del = require('del'); // 删除文件
gulp.task('clean', function(cb) {
del(['dist/css/*', 'dist/js/*', 'dist/img/*','dist/views/*'], cb)
}); // 压缩ejs
gulp.task('ejs', function() {
return gulp.src('views/**/*.ejs')
.pipe(htmlmin({collapseWhitespace: true}))
.pipe(gulp.dest('dist/views/'));
}); // 压缩less
gulp.task('less', function () {
return gulp.src('public/less/**/*.less')
.pipe(less({
paths: [ path.join(__dirname, 'less', 'includes') ]
}))
.pipe(cssBase64())
.pipe(minify())
.pipe(gulp.dest('dist/css/'));
}); // 压缩js
gulp.task('js', function () {
return gulp.src('public/js/**/*.js')
.pipe(jshint())
.pipe(jshint.reporter('default'))
.pipe(uglify({ compress: true }))
.pipe(gulp.dest('dist/js/'))
}); // 压缩img
gulp.task('img', function() {
return gulp.src('public/img/**/*') //引入所有需处理的Img
.pipe(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true })) //压缩图片
// 如果想对变动过的文件进行压缩,则使用下面一句代码
// .pipe(cache(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true })))
.pipe(gulp.dest('dist/img/'))
// .pipe(notify({ message: '图片处理完成' }));
}); // 浏览器同步,用7000端口去代理Express的3008端口
gulp.task('browser-sync', ['nodemon'], function() {
browserSync.init(null, {
proxy: "http://localhost:3008",
files: ["dist/views/*.*","dist/css/*.*","dist/js/*.*","dist/img/*.*"],
browser: "google chrome",
port: 7000
});
}); // 开启Express服务
gulp.task('nodemon', function (cb) { var started = false; return nodemon({
script: 'bin/www'
}).on('start', function () {
// to avoid nodemon being started multiple times
// thanks @matthisk
if (!started) {
cb();
started = true;
}
});
}); gulp.task('build',['clean','less','ejs','js','img'],function () { }); gulp.task('default',['browser-sync'],function(){
// 将你的默认的任务代码放这 // 监听所有css文档
gulp.watch('public/less/*.less', ['less']); // 监听所有.js档
gulp.watch('public/js/*.js', ['js']); // 监听所有图片档
gulp.watch('public/img/**/*', ['img']);
// 监听ejs
gulp.watch('views/**/*.ejs', ['ejs']); // 创建实时调整服务器 -- 在项目中未使用注释掉
var server = livereload();
// 监听 dist/ 目录下所有文档,有更新时强制浏览器刷新(需要浏览器插件配合或按前文介绍在页面增加JS监听代码)
gulp.watch(['public/dist/**']).on('change', function(file) {
server.changed(file.path);
});
});

app.js文件

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser'); var routes = require('./routes/index');
var users = require('./routes/users'); var app = express(); // view engine setup
app.set('views', path.join(__dirname, 'dist/views'));
app.set('view engine', 'ejs'); // uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'dist'))); app.use('/', routes);
app.use('/users', users); // catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
}); // error handlers // development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
} // production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
}); module.exports = app;

然后先在根目录下执行安装:
npm install,使用时先运行gulp build将文件压缩、打包、编译,然后再执行gulp开启自动更新服务器。

Express+Less+Gulp配置高效率开发环境的更多相关文章

  1. Notepad++ 使用nppexec插件配置简易开发环境

    notepad++  采用nppexec插件来配置简易开发环境,而不需要笨重的IDE以及麻烦.重复的命令行.控制台输入: 以下为本人最近用到的脚本配置: //编程语言脚本中$(NAME_PART).x ...

  2. VC 6中配置OpenGL开发环境

    2010,2012中配置类似 http://hi.baidu.com/yanzi52351/item/f9a600dffa4caa4ddcf9be1d VC 6中配置OpenGL开发环境 这里,我习惯 ...

  3. Macbook Pro配置PHP开发环境

    Macbook Pro配置PHP开发环境 安装环境如下: Mac OS 10.10.1 Apache 2.4.9 PHP 5.5.14 MySQL 5.6.22 Apache配置 在Mac OS 10 ...

  4. eclipse配置c开发环境

    // */ // ]]> eclipse配置c开发环境 1. eclipse配置c开发环境 1.1. 缘起 1.2. cygwin 1.3. eclipse 1.4. 配置 1 eclipse配 ...

  5. [转]Aptana Studio 3配置Python开发环境图文教程

    转载URL:http://www.cr173.com/html/49260_1.html 一.安装Aptana Studio 3 安装完运行时建议将相关默认工作目录设定在英文的某个目录下.避免可能出现 ...

  6. Windows下配置Java开发环境

    学习Java第一步是配置本地开发环境,学习最基本的桌面开发,下面以win7为例配置Java开发环境,即:JDK+JRE+Eclipse,安装JDK的时候会默认安装JRE,根据提示安装就可以了. 首先去 ...

  7. 配置rt-thread开发环境(配置系统,生成系统镜像)

    配置rt-thread开发环境 ===========Python============= 1.Python的下载地址:http://www.python.org/ftp/python/ 链接中有各 ...

  8. Notepad++配置Python开发环境

    1. 安装Python 1 下载 我选择了32位的2.7版本.https://www.python.org/ftp/python/2.7.8/python-2.7.8.msi 2. 安装 安装的时候可 ...

  9. Linux下配置PHP开发环境

    转载于: http://www.uxtribe.com/php/405.html 该站下有系列PHP文章. 在Linux下搭建PHP环境比Windows下要复杂得多.除了安装Apache,PHP等软件 ...

随机推荐

  1. MyBatis之one2one与one2many

    <!--顾客信息表,其中一个顾客对应一个国家,一个顾客对应多个订单--> <resultMap id="customerResultMap" type=" ...

  2. [mysql]ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value

    From: http://m.blog.csdn.net/blog/langkeziju/13511411 我的MySQL版本为5.6.14版本,是二进制包安装的(虽然是二进制包安装的,但是以下问题同 ...

  3. Docker命令之 search

    docker search : 从Docker Hub查找镜像 语法 docker search [OPTIONS] TERM OPTIONS说明: --automated :只列出 automate ...

  4. Weblogic在Linux下启动特别慢及进入控制台慢的解决方法

    实际是JVM在Linux下的bug 他想调用一个随机函数 但取不到 暂时的解决办法是 1)较好的解决办法: 在Weblogic启动参数里添加 “- Djava.security.egd=file:/d ...

  5. Some Java exceptions, messages and errors.

    http://www.antapex.org/messages_java.txt http://www.jvmmonitor.org/index.html

  6. 有限状态机(FSM)的Java 演示

    本文从简单的样例入手,逐步演变成很复杂的程序. 在简明 状态模式(5.8)中,状态之间的变换由外界控制,或者说.多种状态是切割的.无关的.状态模式最有趣的地方正是讨论其状态的变迁. 1.引子 空调(a ...

  7. OpenLayers 比较有用的对象和属性

    1.ol.interaction.Pointer     是管理地图down.move.up事件的基类,也用于管理地图拖拽事件.     构造函数结构如下: new ol.interaction.Po ...

  8. python中,如有个非常长的字符串,在写的时候如何将其分隔

    说明: 比如,有个长字符串,Put several strings within parentheses to have them joined together.但是我在写脚本的时候, 想要放在多行 ...

  9. golang interface的使用和实现(翻译整理)

    https://blog.csdn.net/u011409801/article/details/79291221

  10. nodejs与Promise的思想碰撞

    玩node的同志们都知道,当这门语言被提出来的时候,作为自己最为骄傲的异步机制,却被PHP和Python等战团喷得不成样子的是,他们嘲笑着nodejs那蠢蠢的无限嵌套,nodejs战团只能以我们只要性 ...