前端基于gulp后端基于freemarker的工作流程总结

发表于:2018-4-19 09:40

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Caoyp_Let_It    来源:掘金中国

  前言
  最近在做一个PC端的项目,由于项目需要兼容到IE8,所以从技术选型上采取了公司之前一直沿用的前端基于gulp后端基于freemarker的模式来进行开发。
  那么gulp+freemarker这种开发模式的流程到底是怎样的呢?我这边就来简单的分析一下。
  一、前端基于gulp
  前端技术栈:
  • gulp
  • jquery
  • ajax
  • less...
  前端项目结构:
  ├──README.md项目介绍
  ├──src源码目录
  │├──common
  ├──less公共样式
  ├──js公共js
  ├──plugins插件
  项目公共文件
  │├──img图片
  │├──jsjs
  │├──less样式
  ├──.eslintrc.jseslint规则配置
  ├──package.json工程文件
  ├──gulpfile.js配置文件
  ├──server.js本地服务
  从目录来看,非常简单,我这边就主要来分析一下gulpfile.js和server.js
  gulpfile.js
  熟悉gulp的同学都知道,一般我们会将整个项目两种环境来调用,即开发环境和生产环境
  开发环境的配置:
  vargulp=require("gulp"),
  less=require("gulp-less"),
  clean=require("gulp-clean"),
  header=require("gulp-header");
  /**
  *less编译
  *@return{[type]}[description]
  *开发环境调用
  */
  gulp.task("less",["cleanCss"],function(){
  gulp.src(['src/less/*.less','src/common/less/*.less'])
  .pipe(plumber({
  errorHandler:errorHandler
  }))
  .pipe(less())
  .pipe(addHeader())
  .pipe(gulp.dest('dist/css'));
  });
  /**
  *js编译
  *@return{[type]}[description]
  *开发环境调用
  */
  gulp.task('js',['cleanJs'],function(){
  gulp.src(['src/js/*.js','src/common/js/*.js'])
  .pipe(plumber({
  errorHandler:errorHandler
  }))
  .pipe(addHeader())
  .pipe(gulp.dest('dist/js'));
  gulp.src('src/common/plugins/*.js')
  .pipe(gulp.dest("dist/js/plugins"))
  })
  /**
  *img输出
  *@return{[type]}[description]
  *开发环境调用
  */
  gulp.task("imgOutput",["cleanImg"],function(){
  gulp.src('src/img/**/*.*')
  .pipe(gulp.dest("dist/img"))
  })
  简析上述代码:
  在开发环境中我们需要对我们项目的src下的业务less、js、img和common下的公共less、js、img进行编译打包,那么我们就需要借助gulp.task()这个方法来建立一个编译任务。创建完任务以后,我们就需要通过gulp.src()来指向我们需要编译的文件
  最后我们再通过gulp.pipe()来创建一个又一个我们需要的管道,如
  gulp.pipe(plumber({errorHandler:errorHandler}))
  functionerrorHandler(e){
  //控制台发声,错误时beep一下
  gutil.beep();
  gutil.log(e);
  }
  编译的时候控制台打印错误信息。
  gulp.pipe(addHeader())
  /**
  *在文件头部添加时间戳等信息
  */
  varaddHeader=function(){
  returnheader(banner,{
  pkg:config,
  moment:moment
  });
  };
  编译以后在文件的头部加上编译时间
  gulp.pipe(gulp.dest('dist/js'))
  将编译后的文件输出到dist目录下
  生产环境的配置:
  vargulp=require("gulp"),
  less=require("gulp-cssmin"),
  clean=require("gulp-uglify");
  header=require("gulp-header")
  /**
  *cssbuild
  *@return{[type]}[description]
  *正式环境调用
  */
  gulp.task("cssmin",["cleanCss"],function(){
  gulp.src('src/common/less/all.base.less')
  .pipe(less())
  .pipe(cssmin())
  .pipe(rename({
  suffix:'.min'
  }))
  .pipe(addHeader())
  .pipe(gulp.dest("dist/css"));
  gulp.src('src/less/*.less')
  .pipe(less())
  .pipe(cssmin())
  .pipe(addHeader())
  .pipe(gulp.dest("dist/css"));
  });
  /**
  *js编译
  *@return{[type]}[description]
  *正式环境调用
  */
  gulp.task('jsmin',['cleanJs'],function(){
  gulp.src(['src/js/**/*.js','src/common/js/**/*.js'])
  .pipe(plumber({
  errorHandler:errorHandler
  }))
  .pipe(uglify())
  .pipe(addHeader())
  .pipe(gulp.dest('dist/js'));
  gulp.src('src/common/plugins/**/*.js')
  .pipe(uglify({
  mangle:true
  }))
  .pipe(addHeader())
  .pipe(gulp.dest("dist/js/plugins"))
  })
  关于生产环境的配置其实跟上述的开发环境配置原理差不多,区别将在于生产环境中我们需要借助gulp-cssmin和gulp-uglify将css和js都进行压缩,缩小文件的体积。
  这里提一下cleancss和cleanjs的意思,其实就是在我们每一次编译打包的时候将原来已经打包生成css和js都清理调,这样保证我们每次编译打包的代码都是最新的。
  gulp.task("cleanCss",function(){
  returngulp.src('dist/css',{
  read:false
  }).pipe(clean());
  });
  gulp.task("cleanJs",function(){
  returngulp.src('dist/js',{
  read:false
  }).pipe(clean());
  });
  gulp.task("cleanImg",function(){
  returngulp.src('dist/img',{
  read:false
  }).pipe(clean());
  });
  开发环境监听
  gulp.task("watch",function(){
  livereload.listen();
  //调用gulp-watch插件实现编译有改动的LESS文件
  gulp.watch(['src/less/*.less','src/common/less/*.less'],function(file){
  gulp.src(file.path)
  .pipe(plumber({
  errorHandler:errorHandler
  }))
  .pipe(less())
  .pipe(addHeader())
  .pipe(gulp.dest('dist/css'));
  });
  gulp.watch(['src/js/**/*.js','src/common/js/**/*.js'],function(file){
  gulp.src(file.path)
  .pipe(gulp.dest("dist/js"))
  });
  //监听图片改动
  gulp.watch('src/img/**/*.*',function(file){
  gulp.src(file.path)
  .pipe(gulp.dest("dist/img"))
  })
  //监听有变化的css,js,ftl文件,自动刷新页面
  gulp.watch(['dist/**/*.css','dist/**/*.js',ftlPath]).on('change',livereload.changed);
  });
  在开发项目的时候我们需要借助gulp.watch()来实时的监听项目中代码的改动,并且通过gulp-livereload这个插件来实时的刷新我们的页面,以提高我们的开发效率。
  说完gulpfile.js后我们再来分析一下server.js
  server.js
  constpath=require('path'),
  express=require('express'),
  proxy=require("express-http-proxy"),
  compress=require('compression'),
  app=express(),
  fs=require('fs'),
  config=require('./package.json'),
  projectName=config.name,
  port=process.env.PORT||'9091'
  //GZIP压缩
  app.use(compress());
  //设置响应头
  app.use(function(req,res,next){
  res.header('X-Powered-By','Express');
  res.header('Access-Control-Allow-Origin','*');
  next();
  })
  //当前静态项目的资源访问
  app.use('/'+projectName,express.static('dist'));
  app.use('/html',express.static('src/pages'));
  //静态服务器监听
  app.listen(port,'0.0.0.0',function(){
  console.log('staticserverrunningat'+port)
  })
  这里我们通过node中express框架来为我们搭建本地服务,这里重点提一下静态资源项目的访问
  通过app.use()方法传入两个参数,其中projectName代表的是我们在package.json中定义项目名称,如下phip_ehr
  {
  "name":"phip_ehr",
  "version":"1.0.0",
  "description":"",
  "main":"index.js",
  "scripts":{
  "start":"gulp&&gulpwatch",
  "build":"NODE_ENV=productiongulpbuild",
  "server":"nodeserver.js"
  }
  第二个参数express.static('dist')意思是将我们的服务代理到编译打包后的dist文件下如:http://192.168.128.68:9091/phip_ehr/js/**.js
  这样以来我们将可以轻松的获取到整个项目下的所有静态了。

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号