gulp基于seaJs模块化项目打包实践【原创】
公司还一直在延续使用jq+seajs的技术栈,所以只能基于现在的技术栈进行静态文件打包,而众所周知seajs的打包比较“偏门”,在查了不少的文档和技术分享后终于琢磨出了自己的打包策略。
本文目录
一:devDependencies依赖
了解gulp的肯定对npm都有所了解,在这里就不再赘述,直接贴依赖包。
"devDependencies": {
"gulp": "^3.9.1",
"gulp-autoprefixer": "^3.1.1",
"gulp-clean": "^0.3.2",
"gulp-cleanhtml": "^1.0.1",
"gulp-cssimport": "^5.0.0",
"gulp-cssmin": "^0.1.7",
"gulp-htmlmin": "^3.0.0",
"gulp-load-plugins": "^1.5.0",
"gulp-rename": "^1.2.2",
"gulp-rev": "^7.1.2",
"gulp-rev-collector": "^1.1.1",
"gulp-seajs-combo": "^1.2.3",
"gulp-uglify": "^2.1.0"
}
二: css的压缩、合并、md5
文件中使用了gulp的插件“gulp-load-plugins”,没用过的可以简单了解下 https://www.npmjs.com/package/gulp-load-plugins
//css 合并 压缩 md5
gulp.task('css', function(){
return gulp.src('./public/static/src/css/!(common|lib)/*.css')
.pipe($.cssimport({}))
.pipe($.autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))
.pipe($.cssmin())
.pipe($.rev())
.pipe(gulp.dest('./public/static/dist/css'))
.pipe($.rev.manifest())
.pipe($.rename('css-mainfest.json'))
.pipe(gulp.dest('./public/static/dist/rev/css'));
});
考虑到每次修改需要把以前的css文件删除,所以还要有清除css文件的任务
//清除原来的内容
gulp.task("cleancss", function(){
return gulp.src('./public/static/dist/css')
.pipe($.clean());
});
三: seajs合并
好了,下面是重头戏--合并seajs,在合并seajs之前,我们先了解下一些不同的地方。
由于打包的局限性我们需要给每一个被页面引入的seajs文件添加一个中介文件调用seajs.use,不要在页面中使用seajs.use调用。
Demo如下:

// seajs合并
gulp.task('seajs', ['index/index', 'index/submit','require/index']);
gulp.task('index/index', function(){
return gulp.src("./public/static/src/js/{index,}/index_main.js")
.pipe($.seajsCombo({
map:{
'/static/src/js/index/index.js': 'D:/wamp/www/hxe/js/index/index.js'
}
}))
.pipe(gulp.dest('D:/wamp/www/hxe/temp'))
});
gulp.task('index/submit', function(){
return gulp.src("./public/static/src/js/{index,}/submit_main.js")
.pipe($.seajsCombo({
map:{
'/static/src/js/index/submit.js': 'D:/wamp/www/hxe/js/index/submit.js'
}
}))
.pipe(gulp.dest('D:/wamp/www/hxe/temp'))
});
gulp.task('require/index', function(){
return gulp.src("./public/static/src/js/{require,}/schedule_main.js")
.pipe($.seajsCombo({
map:{
'/static/src/js/require/index.js': 'D:/wamp/www/hxe/js/require/index.js'
}
}))
.pipe(gulp.dest('D:/wamp/www/hxe/temp'))
});
在这里重点强调一下,由于打包的一些限制,我们需要将js文件夹复制一份放到一个绝对路径文件夹下,我在这放到了 D:/wamp/www/hxe/ 下,而我们产生的合并文件也一并存放在这个文件夹下。
还需要注意的一点是我们在一个项目肯定会存在不同的文件夹下有相同的文件名,如我的项目在index和require文件夹下都存在index_main.js和index.js这就需要我们用正则区分,即上面的{index,} 和 {require,}。
四: js压缩
熟悉gulp的肯定知道我们只有在seajs合并任务完毕后才能执行压缩任务,所以我们可以将seajs任务作为 js 的前置任务。
// 压缩js
gulp.task('js', ['seajs'], function(){
return gulp.src("D:/wamp/www/hxe/temp/*/*.js")
.pipe($.uglify({
mangle: { except: ['require', 'exports', 'module', '$'] }//排除混淆关键字
}))
.pipe($.rev())
.pipe(gulp.dest('./public/static/dist/js'))
.pipe($.rev.manifest())
.pipe($.rename('js-manifest.json'))
.pipe(gulp.dest('./public/static/dist/rev/js'))
});
//清除原来的内容
gulp.task("cleanJs", function(){
return gulp.src('./public/static/dist/js')
.pipe($.clean());
});
在这里,就需要将我们再绝对路径下合并产生的临时文件压缩并输出到我们的项目路径下。
五: html压缩
html的操作,最主要的重头戏还是在于css和js的路径替换,所以打包的成功与否html这边的操作也至为重要。
//html 压缩
gulp.task('rev',['css','js'],function () {
var options = {
removeComments: true, //清除HTML注释
collapseWhitespace: true, //压缩HTML
collapseBooleanAttributes: true, //省略布尔属性的值 input checked="true" ==> input checked
removeEmptyAttributes: true, //删除所有空格作属性值 input id="" ==> input
removeScriptTypeAttributes: true, //删除<script>的type="text/javascript"
removeStyleLinkTypeAttributes: true, //删除<style>和<link>的type="text/css"
minifyJS: true, //压缩页面JS
minifyCSS: true //压缩页面CSS
};
return gulp.src(['./public/static/dist/rev/*/*.json', './application/home/view/**/*.html'])
.pipe($.revCollector({
replaceReved: true,
dirReplacements: {
'/src/css': '/dist/css/',
'/src/js/': '/dist/js/'
}
}))
.pipe($.htmlmin(options))
.pipe(gulp.dest('./application/home/view_build'));
});
//清除html文件夹
gulp.task("cleanhtml", function(){
return gulp.src('./application/home/view_build')
.pipe($.clean());
});
六: 程序的默认执行
程序的默认执行,主要是对gulp打包的顺序最后做一遍确认,在控制台直接使用gulp就能触发default任务。
//默认任务
gulp.task('default', ['cleancss','cleanJs', 'cleanhtml'], function(){
gulp.start('rev');
});
七: 总结
通过gulp打包seajs项目,主要的核心还是在于map映射的问题,所以我们通过借助绝对路径的方式可以成功的绕开这个问题--将文件合并放在项目之外。
seajs模块化,gulp压缩打包合并只是几个简单的命令已经走了好几个年头,颇有些“廉颇老矣”的悲情,但是只要脑筋灵活还是能做很多事情的,当然我们也要拥抱变化,webpack都2.0了。。。
gulp打包seajs项目Demo地址 https://github.com/jinghaoo/seaJS-gulp
如果有什么问题,欢迎给我发邮件: jingh1024@163.com
gulp基于seaJs模块化项目打包实践【原创】的更多相关文章
- springboot之多模块化项目打包
1.目录结构 2.打成war包,只需在web子项目中的pom文件中添加 <packaging>war</packaging> <build> <!-- 为ja ...
- 基于vue-cli项目打包慢的定位优化过程
入职一周后,上一个前端就离职了(超级坑爹的),留下了一个比较棘手的问题,就是基于vue-cli的项目打包超级慢,我接手项目的时候,打包需要45min(上个离职者也不知道原因),经过3个月之后,随着项目 ...
- 介绍一种基于gulp对seajs的模块做合并压缩的方式
之前的项目一直采用grunt来构建,然后用requirejs做模块化,requirejs官方有提供grunt的插件来做压缩合并.现在的项目切到了gulp,模块化用起了seajs,自然而然地也想到了模块 ...
- 初学seaJs模块化开发,利用grunt打包,减少http请求
原文地址:初学seaJs模块化开发,利用grunt打包,减少http请求 未压缩合并的演示地址:demo2 学习seaJs的模块化开发,适合对seajs基础有所了解的同学看,目录结构 js — —di ...
- 基于vue模块化开发后台系统——构建项目
文章目录如下:项目效果预览地址项目开源代码基于vue模块化开发后台系统--准备工作基于vue模块化开发后台系统--构建项目基于vue模块化开发后台系统--权限控制 前言 在熟悉上一篇说到准备工具之后, ...
- Grunt-Kmc基于KISSY项目打包
Grunt-Kmc基于KISSY项目打包 1. Grunt-Kmc 是基于nodejs开发的,所以未安装nodeJS,先需要安装nodejs.安装步骤如下: 1. 下载安装文件,下载地址 ...
- 基于springboot的web项目最佳实践
springboot 可以说是现在做javaweb开发最火的技术,我在基于springboot搭建项目的过程中,踩过不少坑,发现整合框架时并非仅仅引入starter 那么简单. 要做到简单,易用,扩展 ...
- 关于 JS 模块化的最佳实践总结
模块化开发是 JS 项目开发中的必备技能,它如同面向对象.设计模式一样,可以兼顾提升软件项目的可维护性和开发效率. 模块之间通常以全局对象维系通讯.在小游戏中,GameGlobal 是全局对象.在小程 ...
- JS 模块化和打包方案收集
1.这里想讨论的是拆分规则,不是在问哪个工具怎么使用.2.这里没有在想找正确答案,因为感觉这个问题要结合具体业务场景. 随着项目开发越来越大,一开始代码全打包到一个文件的方式,让文件越来越大,接下来要 ...
随机推荐
- HTML5之多媒体
概览 html5新增了两个关于多媒体的元素:video和audio,前者是用于视频,后者用于音频.而他们使用非常简单 <audio src="xhn.mp3" control ...
- java装箱跟拆箱解析
/** * 在jdk1.5之后,java为基本数据类型到对应的应用数据类型提供了自动拆箱装箱操作 * 不管是自动拆箱还是自动装箱都是应用数据类型有的方法,基本数据类型是没有任何方法可调用的 *从概念上 ...
- 3389: [Usaco2004 Dec]Cleaning Shifts安排值班
3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 102 Solved: ...
- PHP无锁内存nosql---Yac的实战
无锁内存nosql---Yac的实战 最近在工作使用了yac,所以比较了下Memcache和Yac的高并发读写性能测试,发现Yac要比Memcache快很多(这里没有比较Yac和Apc的性能情况, 不 ...
- 【iOS】7.4 定位服务->2.1.2 定位 - 官方框架CoreLocation: CLLocationManager(位置管理器)
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 2017Java技术预备作业1501黄学超
阅读邹欣老师的博客,谈谈你期望的师生关系是什么样的? 我觉得师生关系应当是亲密无间,课上老师讲解学生配合,课下师生交流启发思考. 你有什么技能(学习,棋类,球类,乐器,艺术,游戏,......)比大多 ...
- Android使用Aspectj
使用AspectJ 集成步骤: 1.AS配置Aspectj环境 2.配置使用ajc编译 4.定义注解 5.配置规则 6.使用 7.注意事项 AS配置Aspectj环境.Aspect目前最新版本为 1. ...
- 交叉编译Python-2.7.13到ARM(aarch32)平台
作者:彭东林 邮箱:pengdonglin137@163.com QQ:405728433 环境 主机: ubuntu14.04 64bit 开发板: qemu + vexpress-a9 (参考: ...
- DLL:无法解析的外部符号 "__declspec(dllimport)
(4.10)碰到问题:MFC规则DLL(静态库1)中,AFX_EXT_CLASS导出类及类的对象.在静态库2中使用.出现两个问题: (1) 静态库1中警告:dll链接不一致; (2) 静态库2中报 ...
- laravel框架中所用到的依赖注入
用Laravel开发前前后后有2个月左右了,之前一直写Java,就像找到Java和PHP之前的共同点,用Java的某些原理去理解PHP会发现还是有很多共通之处的.Java的依赖注入已经是一个很常见的概 ...