版权声明:本文由金朝麟原创文章,转载请注明出处: 
文章原文链接: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终于折腾完毕。

配置

下面说下我的配置方法:

我的目录结构:

  1. ├── app.js # Express Server
  2. ├── bin
  3. └── www # 启动Server
  4. ├── dist # 编译压缩目录(部署目录)
  5. ├── css
  6. ├── img
  7. ├── js
  8. ├── views
  9. └── lib # 第三方库目录(bower安装)
  10. ├── .bowerrc # bower前端安装库
  11. ├── gulpfile.js # Gulp配置文件
  12. ├── package.json
  13. ├── public # 开发目录
  14. ├── img
  15. ├── js
  16. └── less
  17. ├── routes
  18. ├── index.js
  19. └── users.js
  20. └── views # html
  21. ├── error.ejs
  22. └── index.ejs

package.json文件内容:

  1. {
  2. "name": "voteapp",
  3. "version": "1.0.0",
  4. "description": "",
  5. "main": "app.js",
  6. "dependencies": {
  7. "body-parser": "~1.13.2",
  8. "cookie-parser": "~1.3.5",
  9. "debug": "~2.2.0",
  10. "ejs": "~2.3.3",
  11. "express": "~4.13.1",
  12. "morgan": "~1.6.1",
  13. "serve-favicon": "~2.3.0"
  14. },
  15. "devDependencies": {
  16. "browser-sync": "^2.18.6",
  17. "del": "^2.2.2",
  18. "gulp": "^3.9.1",
  19. "gulp-cache": "^0.4.5",
  20. "gulp-clean-css": "^2.3.2",
  21. "gulp-concat": "^2.6.1",
  22. "gulp-ejs": "^2.3.0",
  23. "gulp-htmlmin": "^3.0.0",
  24. "gulp-imagemin": "^3.1.1",
  25. "gulp-less": "^3.3.0",
  26. "gulp-livereload": "^3.8.1",
  27. "gulp-nodemon": "^2.2.1",
  28. "gulp-uglify": "^2.0.0",
  29. "gulp-watch": "^4.3.11"
  30. },
  31. "scripts": {
  32. "test": "echo \"Error: no test specified\" && exit 1"
  33. },
  34. "author": "",
  35. "license": "ISC"
  36. }

gulpfile.js文件

  1. 'use strict';
  2. var gulp = require('gulp');
  3. var minify = require('gulp-clean-css');
  4. var browserSync = require('browser-sync');
  5. var nodemon = require('gulp-nodemon');
  6. var cache = require('gulp-cache');
  7. var uglify = require('gulp-uglify');
  8. var htmlmin = require('gulp-htmlmin');
  9. var imagemin = require('gulp-imagemin');
  10. var less = require('gulp-less');
  11. var path = require('path');
  12. var livereload = require('gulp-livereload');
  13. var concat = require('gulp-concat');
  14. var jshint = require('gulp-jshint');
  15. var cssBase64 = require('gulp-base64');
  16. var del = require('del');
  17. // 删除文件
  18. gulp.task('clean', function(cb) {
  19. del(['dist/css/*', 'dist/js/*', 'dist/img/*','dist/views/*'], cb)
  20. });
  21. // 压缩ejs
  22. gulp.task('ejs', function() {
  23. return gulp.src('views/**/*.ejs')
  24. .pipe(htmlmin({collapseWhitespace: true}))
  25. .pipe(gulp.dest('dist/views/'));
  26. });
  27. // 压缩less
  28. gulp.task('less', function () {
  29. return gulp.src('public/less/**/*.less')
  30. .pipe(less({
  31. paths: [ path.join(__dirname, 'less', 'includes') ]
  32. }))
  33. .pipe(cssBase64())
  34. .pipe(minify())
  35. .pipe(gulp.dest('dist/css/'));
  36. });
  37. // 压缩js
  38. gulp.task('js', function () {
  39. return gulp.src('public/js/**/*.js')
  40. .pipe(jshint())
  41. .pipe(jshint.reporter('default'))
  42. .pipe(uglify({ compress: true }))
  43. .pipe(gulp.dest('dist/js/'))
  44. });
  45. // 压缩img
  46. gulp.task('img', function() {
  47. return gulp.src('public/img/**/*') //引入所有需处理的Img
  48. .pipe(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true })) //压缩图片
  49. // 如果想对变动过的文件进行压缩,则使用下面一句代码
  50. // .pipe(cache(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true })))
  51. .pipe(gulp.dest('dist/img/'))
  52. // .pipe(notify({ message: '图片处理完成' }));
  53. });
  54. // 浏览器同步,用7000端口去代理Express的3008端口
  55. gulp.task('browser-sync', ['nodemon'], function() {
  56. browserSync.init(null, {
  57. proxy: "http://localhost:3008",
  58. files: ["dist/views/*.*","dist/css/*.*","dist/js/*.*","dist/img/*.*"],
  59. browser: "google chrome",
  60. port: 7000
  61. });
  62. });
  63. // 开启Express服务
  64. gulp.task('nodemon', function (cb) {
  65. var started = false;
  66. return nodemon({
  67. script: 'bin/www'
  68. }).on('start', function () {
  69. // to avoid nodemon being started multiple times
  70. // thanks @matthisk
  71. if (!started) {
  72. cb();
  73. started = true;
  74. }
  75. });
  76. });
  77. gulp.task('build',['clean','less','ejs','js','img'],function () {
  78. });
  79. gulp.task('default',['browser-sync'],function(){
  80. // 将你的默认的任务代码放这
  81. // 监听所有css文档
  82. gulp.watch('public/less/*.less', ['less']);
  83. // 监听所有.js档
  84. gulp.watch('public/js/*.js', ['js']);
  85. // 监听所有图片档
  86. gulp.watch('public/img/**/*', ['img']);
  87. // 监听ejs
  88. gulp.watch('views/**/*.ejs', ['ejs']);
  89. // 创建实时调整服务器 -- 在项目中未使用注释掉
  90. var server = livereload();
  91. // 监听 dist/ 目录下所有文档,有更新时强制浏览器刷新(需要浏览器插件配合或按前文介绍在页面增加JS监听代码)
  92. gulp.watch(['public/dist/**']).on('change', function(file) {
  93. server.changed(file.path);
  94. });
  95. });

app.js文件

  1. var express = require('express');
  2. var path = require('path');
  3. var favicon = require('serve-favicon');
  4. var logger = require('morgan');
  5. var cookieParser = require('cookie-parser');
  6. var bodyParser = require('body-parser');
  7. var routes = require('./routes/index');
  8. var users = require('./routes/users');
  9. var app = express();
  10. // view engine setup
  11. app.set('views', path.join(__dirname, 'dist/views'));
  12. app.set('view engine', 'ejs');
  13. // uncomment after placing your favicon in /public
  14. //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
  15. app.use(logger('dev'));
  16. app.use(bodyParser.json());
  17. app.use(bodyParser.urlencoded({ extended: false }));
  18. app.use(cookieParser());
  19. app.use(express.static(path.join(__dirname, 'dist')));
  20. app.use('/', routes);
  21. app.use('/users', users);
  22. // catch 404 and forward to error handler
  23. app.use(function(req, res, next) {
  24. var err = new Error('Not Found');
  25. err.status = 404;
  26. next(err);
  27. });
  28. // error handlers
  29. // development error handler
  30. // will print stacktrace
  31. if (app.get('env') === 'development') {
  32. app.use(function(err, req, res, next) {
  33. res.status(err.status || 500);
  34. res.render('error', {
  35. message: err.message,
  36. error: err
  37. });
  38. });
  39. }
  40. // production error handler
  41. // no stacktraces leaked to user
  42. app.use(function(err, req, res, next) {
  43. res.status(err.status || 500);
  44. res.render('error', {
  45. message: err.message,
  46. error: {}
  47. });
  48. });
  49. 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. Python内部机制。

    type ,object ,__class__ ,__bases__ ,__metaclass__ , -------------------------不明白的地方----------------- ...

  2. Toggle Checkboxes on/off

    You can write: $(document).ready(function() { $("#select-all-teammembers").click(function( ...

  3. fiddler 工具使用配置

    前言: 之前为了手动测试项目组之间提供的接口,确定到底是哪一个接口出了问题.一般情况下,我们都直接采用了 Google 浏览器上,F12 后,Network 找到想要的 URL,然后,直接在浏览器上访 ...

  4. @Mock与@InjectMocks的区别

    @Mock: 创建一个Mock. @InjectMocks: 创建一个实例,简单的说是这个Mock可以调用真实代码的方法,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中. 注意: ...

  5. mac osx voice over的使用

    mac下的filezilla是一个很奇葩的应用,奇葩在哪?有一次我不知道怎么操作的,把filezilla搬到到了窗体顶部,结果被mac的菜单栏挡住了标题栏,然后再也无法移动窗体了,以下是我为了移动它做 ...

  6. virtualbox谨记:win7上只有4.3.x的版本支持ubuntu14.04.3虚拟机安装Oracle Rac,其他的版本3.x和5.0.2(至2015-08-30)均不可以

    virtualbox谨记:win7上只有4.3.x的版本支持ubuntu14.04.3虚拟机安装Oracle Rac,其他的版本3.x和5.0.2(至2015-08-30)均不可以

  7. 如何破解银行O2O模式创新

    文/赵志宏 摩 根大通的买房APP,使客户可根据自己的位置选择合适的贷款经理:华道数据提供的卡惠APP,使客户可随时查询自己周围信用卡刷卡打折的商户信息:民生银 行的微信预约叫号功能,使客户根据可自己 ...

  8. 判断一个字符串同时出现几个字符的C#版本和JS版本

    C#版本,参考:http://www.cnblogs.com/dudu/p/3841256.html JS版本是我群友写的: var str="abcdef"; var arr=[ ...

  9. oracle数据库中sql%notfound的用法

    SQL%NOTFOUND 是一个布尔值.与最近的sql语句(update,insert,delete,select)发生交互,当最近的一条sql语句没有涉及任何行的时候,则返回true.否则返回fal ...

  10. linux环境中安装iotop命令,解决-bash: iotop: command not found问题

    需求描述: 今天在测试环境中,准备查看mysql各个线程占用的io的情况,准备使用iotop命令来查看,发现没有这个命令 [root@testvm Packages]# iotop -bash: io ...