好好的Seajs,说不用就不用了

话说最近看到的关于Seajs的坑,真不少;说什么seajs.use的相对路径解析有坑、依赖模块的缓存问题、自动化的压缩合并问题、es6来了,seajs过时啦!;是的,这些个问题确实不是不常见!那么,兵来将挡,水来土掩,选择了出击,咱就得迎难而上啊!

seajs.use的相对路径解析的问题,纯属个人写法的问题;无论是页面上seajs.use还是在合并在config里的seajs.use都是没问题的,seajs.use的相对路径是指向调用页面的,但是有静态资源站,所以用绝对路径肯定不会指错的;我个人发现个问题是由seajs的模块合并引发的,因为最终与我的需求冲突了:我要的是页面上只src两个文件,一个seajs,一个mainjs,因为现实的原因,页面后端输出,项目已成型,所以我能做的是尽力把改动压到前端,后端做最小的改动,因此往页面上加其他文件还有seajs.use(‘/path/*.js‘)是基本上要避免的,要不然到时得全站更新;当然,如果是项目刚开始的话,这些就不是问题了;OK,我分解模块,定义模块,弄个mainjs做config并分发页面主模块;至此,一切都是那么顺当,seajs,beautiful!

可是当我要自动化压缩合并模块时,坑就来了,很容易想简单的一个地方在于:一般的想法可能都是,合并文件,就是把几个文件打包到一起,然后压缩,然而在seajs里这样就大错特错了;seajs里一个文件即是一个模块,合并多个文件后在一个文件里会出现多个define,当然,这些多个define可以定义模块的独立ID,然后你之前的seajs.use路径要对应着改,因为你之前use的是一个模块,而现在那个文件里却包含的是一堆模块,你怎么use的到呢?而且这个合并的文件要不放在页面,而是用mainjs去代理的话,我得绕一大圈才行,我么多步骤、这么绕的自动化我只能呵呵了,原谅我的懒惰。。。往下看,自有替代方案。

前面也说了,这是个人写法的问题以及现实需求的原因,seajs本身还是很人性化的;分享一下,关于seajs的合并方式:gulp-seajs-combo;

 1 var gulp = require(‘gulp‘),
 2     seajsCombo = require(‘gulp-seajs-combo‘);
 3
 4 gulp.task(‘seajs‘, function(){
 5
 6     (function  (urls,dest) {
 7          for(var i=0;i<urls.length;i++){
 8              (function (iurl) {
 9                 return gulp.src(iurl)
10                     .pipe(seajsCombo())
11                    .pipe(gulp.dest(dest));
12             })(urls[i]);
13          }
14     })([
15         ‘./public/javascripts/index1.js‘
16     ],‘./public/javascripts/dist‘);
17     // array > 页面主模块
18     // dest
19
20 });

合并压缩后对应着慢慢改配置吧!

至于依赖模块的缓存问题,这个做法就很多了,在require里加时间戳是最不推荐的,在config里的alias上加时间戳,可以考虑;常见的是config的map来实现:‘map‘:  [ /^(.*\.(?:css|js))(.*)$/i, ‘$1?1314521‘ ],这个问题在于,我本想去一个模块的缓存,结果把所有模块的缓存都去了;那么这样是不是就可以了呢?

1 map: [
2     function(url) {
3         if(...){...//}
4     }
5   ]

其实这里并没什么问题,只是要提醒自己,某个时候,依赖模块也是要去缓存的;

既然标题叫做《好好的Seajs,说不用就不用了》,说明我最终放弃了Seajs,原谅我!我的错,是我懒,不想改来改去,才出此下策;挥别Seajs,擦干泪,迎接Browserify吧!

说到模块化,Nodejs那家伙做的老好了,正儿八经的Nodejs里一切皆模块;话说Seajs的模块化机制有参考Nodejs呢;现在好了,使用Browserify,咱也能在javascript里像写Nodejs一样来组织前端模块了;那些看似多余的前奏可以参考:[回首来时走过的-模块化之路Browserify让你的Javascript游走于前后端],我的个人小站是个我业余的实验厂,基本上有什么想法,插件啥的,如果不能立马用到工作的项目里,我便会首先想法用到这个小站上,最初是用的Seajs组织的一些杂七杂八的模块,现在全改为Browserify了,目前感觉挺好的!好吧,其实这是个广告!我只是个初入前端的小前端,大侠绕过这段吧;

用上了Browserify:

  • 前端的模块化,说好的Seajs、Requirejs呢?丢掉,丢掉
  • define那个wrapper,丢掉
  • 安静的定义模块(不用define了),require模块吧
  • 不用改来改去,一键gulp到指定目录

现在,前端开发环境可以改为Nodejs了,像写Nodejs一样写JavaScript,去require模块,单个模块不用define,甚至都不用module.exports,依然可以require;唉,这些一个人时乐一下就行了,还是安静的做个美男子吧!上代码了。

 1 var browserify = require("browserify");
 2 var source = require("vinyl-source-stream");
 3 var streamify=require(‘gulp-streamify‘);
 4 var uglify=require(‘gulp-uglify‘);
 5 var buffer=require(‘vinyl-buffer‘);
 6 var watch=require(‘gulp-watch‘);;
 7
 8 gulp.task(‘go‘,function() {
 9     return browserify(‘./public/javascripts/index1.js‘)
10         .bundle()
11         .pipe(source(‘index1.js‘))
12         .pipe(buffer())//.pipe(streamify(uglify()))  //压缩耗时间   上线处理
13         .pipe(gulp.dest(‘./public/javascripts/dist‘))
14 });

有个小问题,开发时F5按的比较频繁,每次保存后,还得gulp一下,是不是有点多余,听说gulp有个gulp-livereload,不过需要浏览器的插件支持;还有个更好的browser-sync,多端同步刷新,自行github吧;其实gulp-watch也不错;

1 gulp.task(‘watch‘,function(){
2     gulp.watch(‘./public/javascripts/index1.js‘,[‘go‘]);
3 });

当然,这只是初级的结构,问题肯定也少不了,一切从实际出发,具体问题具体分析吧;反正我是爱上了这种搞法;

那么,ES6来了,Seajs过时了吗?我一个小前端没有发言权,不管怎样Seajs的历史作用是毋庸置疑的,再说了,PC端特别是IE那堆历史遗留问题,ES6就算babel到ES5兼容到IE9+问题不大,全面用还是尚需时日的;不过正因为此,前端有了更多的可能性,咱也看到了前端更美好的未来;

时间: 2024-08-01 10:44:14

好好的Seajs,说不用就不用了的相关文章

马云再一次颠覆革命!支付宝又逆天:不用钱包不用手机照样支付

更多:http://www.webyang.net/Html/web/article_160.html 虽近支付宝和微信支付打得火热,各种促销打折抢占支付市场,这个时候支付宝发大招了!宣布推出全新的支付方式"kungfu"(空付)也和功夫发音相近. 具体支付宝这次使的是怎样的功夫呢? 通过支付宝扫描任何一个实物进行授权,例如你身上的一个纹身.然后设定改实物的价值,也就是支付上限,这时,他就具备来支付能力.你到商家进行消费的时候,无需带手机打开支付宝,只需要对着镜头出示该实物,验证后完成

一个字符串,不用循环,不用递归,求长度

/* 法一:传入长度做参数 */ int strlen_x(const char * pstr,int &len) { char * pTemp = (char*)pstr; if (*pstr == '\0') return len; len++; pTemp = pTemp++; return strlen_x(pTemp, len); } /* 法二 不传入长度参数 http://blog.csdn.net/stpeace/article/details/8096629 */ int Ge

有些函数真的能不用就不用啊

做网络数据抓取,添加下面代码.同样的数据,分析需要14秒 local_tv_sec = header->ts.tv_sec; ltime=localtime(&local_tv_sec); strftime( timestr, sizeof timestr, "%H:%M:%S", ltime); 删除这些代码,分析只需2秒. 以前也测试过sprintf这种函数,好像也是慢的可以. 个人认为格式化输出这种函数,尽量在对效率要求高的代码中少用.

追寻伯利恒二叉树 -- 不用栈不用递归

http://www.acmerblog.com/inorder-tree-traversal-without-recursion-and-without-stack-5988.html 用叶子节点的空指针来记录当前节点的位置,然后一旦遍历到了叶子节点,发现叶子节点的右指针指向的是当前节点,那么就认为以当前节点的左子树已经遍历完成. 以inorder为例,初始化当前节点为root,它的遍历规则如下: 如果当前节点为空,程序退出. 如果当前节点非空, 如果当前节点的左儿子为空,那么输出当前节点,当

云计算背后的秘密:NoSQL诞生的原因和优缺点

转载收藏一篇对nosql讲解的比较全面的文章:http://blog.csdn.net/xlgen157387/article/details/47908797 这篇文章将和大家聊聊为什么NoSQL会在关系型数据库已经非常普及的情况下异军突起? 诞生的原因 随着互联网的不断发展,各种类型的应用层出不穷,所以导致在这个云计算的时代,对技术提出了更多的需求,主要体现在下面这四个方面: 1. 低延迟的读写速度:应用快速地反应能极大地提升用户的满意度; 2. 支撑海量的数据和流量:对于搜索这样大型应用而

[zz]有哪些优秀的科学网站和科研软件推荐给研究生?

https://www.zhihu.com/question/37061410 如题,各位科研前辈,有没有一些好的科研网站或者适合科研人员用的软件以及APP,推荐给一只研一的菜鸡,帮助我们提高科研效率,了解更多知识.或者指点迷津,分享一些科研经验,让菜鸡少走弯路.欢迎分享,感激不尽!!! 6 条评论 分享 默认排序按时间排序 56 个回答 2230赞同反对,不会显示你的姓名 ljthyd食品科学.食品安全.食品加工话题优秀回答者 食品… 2230 人赞同 写几个常见的我觉得挺好的网站及软件,也不

关系数据库&amp;&amp;NoSQL数据库

在过去,我们只需要学习和使用一种数据库技术,就能做几乎所有的数据库应用开发.因为成熟稳定的关系数据库产品并不是很多,而供你选择的免费版本就更加少了,所以互联网领域基本上都选择了免费的MySQL数据库.在高速发展的WEB2.0时代,我们发现关系数据库在性能.扩展性.数据的快速备份和恢复.满足需求的易用性上并不总是能很好的满足我们的需要,我们越来越趋向于根据业务场景选择合适的数据库,以及进行多种数据库的融合运用. 当我们在讨论是否要使用NoSQL的时候,你还需要理解NoSQL也是分很多种类的,在No

小的时候.by小雷

小的时候,总是有很多想法.   想去做,却做不成.   因为,自己小,被父母约束着,被学校圈着,被老师教育着. 想买个小霸王游戏机,没钱.在父辈的眼中,"游戏" ,游戏室,电脑游戏,全都是鬼神,我的孩子必须远离它,玩游戏的孩子都是坏孩子. 想买个自行车,到处潇洒,没钱 ,又没有偷的胆量,只有不偷的素养. 因为小,在几乎所有的父母眼里,孩子都是不懂事的~ 没见过几个父母,有耐心和兴趣了解自己孩子的想法和诉求~ 我不太晓得其他地区的或者外国的父母,是如何对待自己孩子的~ 只是想说,如果有一

log4j+slf4j迁移到log4j2+slf4j (Servlet3.0)

最近对系统中的旧项目实现log升级,选择了log4j2来代替log4j,作为最新一代的log实现,log4j2好在那里可以直接看log4j2性能章节. 这里写写如何从log4j升级到log4j2. 1. maven依赖的变化,对log4j的依赖变成了对log4j2的依赖,在实际使用过程中发现过旧的jboss logging会有问题,使用了3.3.0.Final支持log4j2的版本. <dependency> <groupId>org.apache.logging.log4j<