此次主要是说明如何为新模块配置,以实现打包压缩。css
在本地安装Node,而后安装gulphtml
npm install gulp -g
在项目根目录下执行前端
npm install
安装全部的构建过程依赖的包,安装好之后,配置模块的构建文件。jquery
模块配置文件格式以下:web
module.exports = { css: [ 'css/main.css', 'css/selector.css', 'css/search-v1.css', ], js: ['js/search-main.js'] }
css属性是须要打包的css文件路径,构建结束后会打包成一个css文件。
js属性是js的入口文件,目前采用cmd模式作模板化,只需配置好入口文件,打包过程会对js的引用关系进行分析,将全部引用的js合并打包。npm
js入口文件:json
seajs.config({ // 基础路径 // base: window.seajsBase, // 路径配置 paths: { 'js': '../js', 'css': '../css', 'dist' : './dist' }, // 别名配置 alias: { 'jquery': 'js/jquery', 'index': 'js/index', 'citys-pc':'js/citys-pc', 'citys':'js/citys', 'industry':'js/industry-old', 'jobs':'js/jobs-old', 'bigcity':'js/bigcitys', 'js/selector':'js/selector-v1' }, // 文件编码 charset: 'utf-8' }) //加入模块引用代码 seajs.use("./js/search-v1")
入口文件中包含了sea-config.js中的配置内容,针对每一个模块,能够定义本身的个性配置。gulp
注意加入模块的引用:后端
seajs.use("./js/search-v1")
针对每一个模块,模块负责人只须要维护本身的配置文件,若是发现本身的模块和其余模块的有冲突,最好单首创建本身的模块,作好注释。浏览器
配置完成后,在根目录下,执行
gulp
打包完成后,查看build目录,会生成对应的css和js文件
gulp命令默认会对全部模块所有构建,若是只想构建本身的模块能够执行
gulp [配置文件名]
例如:
gulp search
注意:
构建系统会为每一个模块单首创建一个任务,以该配置文件的名称做为任务名。
gulp任务启动后,会对css和js进行构建,同时启动本地测试web服务器,以及css和js文件的监听,若是有css或者js更新,浏览器会自动刷新,帮助开发进行调试。
若是想加断点调试的话,在页面中引用原有的入口文件便可。
须要上线的文件是build的下css和js文件,也包括图片,更新后端模板文件的引用,加版本号。
注意:
整个流程由gulp实现,每一个模块只需增长一个配置文件,便可实现压缩打包,在线调试等,核心的gulp代码以下:
var gulp = require('gulp'), path = require('path'), gls = require('gulp-live-server'), cmd = require('gulp-cmd'), minifycss = require('gulp-clean-css'), concat = require('gulp-concat'), uglify = require('gulp-uglify'), rename = require('gulp-rename'), hash = require('gulp-hash'), del = require('del'), fs = require('fs'); //读取文件夹内的文件列表 var files = fs.readdirSync('./gulp'); //以文件名做为属性组装配置文件 var config = {}; files.forEach(function (file) { config[path.parse(file).name] = require('./gulp/' + file); }) var tasks = []; //遍历配置文件,建立构建任务 for (var item in config) { (function (item) { var subTasks = []; if (config[item]['css']) { gulp.task(item + '_css', function () { return gulp.src(config[item]['css']) .pipe(minifycss({ compatibility: 'ie7' })) .pipe(concat(item + '-main.css')) .pipe(gulp.dest('build/css/')); }); subTasks.push(item + '_css'); tasks.push(item + '_css'); } if (config[item]['js']) { gulp.task(item + '_js', function () { gulp.src('js/jquery.js') .pipe(cmd()) .pipe(gulp.dest('build/js')); return gulp.src(config[item]['js']) .pipe(concat(item + '-main.js')) .pipe(cmd({ ignore: ['jquery'] })) .pipe(uglify()) //压缩 .pipe(gulp.dest('build/js')); //输出 }); subTasks.push(item + '_js'); tasks.push(item + '_js'); } if (subTasks.length > 0) { gulp.task(item, ['clean'], function () { gulp.start(subTasks, 'serve'); }); } })(item); } //监听服务 gulp.task('serve', function () { //启动80端口做为本地web服务器 var server = gls.static('./', 80); server.start(); //监听文件目录 gulp.watch([ path.resolve(__dirname, './css/*.css'), path.resolve(__dirname, './js/*.js'), path.resolve(__dirname, './*.html') ], function (file) { gulp.start(tasks, function () { server.notify.apply(server, [file]); }) }); }); //清理目标构建文件 gulp.task('clean', function (cb) { del(['build/css/*', 'build/js/*']).then(paths => { cb(); console.log('Deleted files and folders:\n', paths.join('\n')); }); }); //默认的任务,执行所有的构建任务 gulp.task('default', ['clean'], function () { gulp.start(tasks, 'serve'); });
目前上线仍是须要手动修改模板文件的引用的资源版本号,有几个方案能够考虑:
一、在后端的配置文件中加入一个版本号配置项,前端读取配置项做为版本号,在Jekins增长一个修改版本号流程,Java端读取配置文件注意缓存的问题,保证配置文件更新后,能及时更新配置,或者每次读取文件时记录读取时间,超过必定的时间从新读取配置文件,能够保证不重启服务器的状况下更新版本号。
二、在后端系统启动的时候,生成一个时间戳做为版本号,每次上线重启系统,便可更新js版本号。
第一个方案相对比较好,能够在不重启服务器的状况下,更新版本号,考虑采纳。
注意:
在部署的时候 先上静态资源,后重启Java Web服务器,否则服务器重启后,仍是读取旧的静态资源,缓存了旧的静态资源,新上的静态资源仍是不能更新。
对css和js打包压缩之后,页面引用的css和js文件变少了,大幅减小了http请求数,也就相应减小了出错的几率,不过因为目前前端和后端部署未分离,静态资源的版本号还须要手工更新,后期上线会在服务器端执行构建流程,包括版本号的修改也会自动化。
另外,在qa测试上线过程当中,能够检测css和js是否按要求加入版本号,目前版本号的规则是当前的日期,好比:"./a.js?v=20160809",若是没有加版本号,提醒前端工程师,也能够在Jekins中对当前部署的模板进行检测,若是版本号不知足条件,禁止上线,或者写脚本自动修改。