云笔记:http://note.youdao.com/share/?id=7c4a2dcf118f0ad7bb52a36aaee46a7a&type=note
 
一、初识FIS
在做项目中遇到了静态资源浏览器缓存更新的问题,于是在网络上寻找解决方案。之前虽然没有解决过这个问题,但方法无非就是为其设定新URI使得浏览器强制更新。这个过程听起来还是相当简单的。
 
也是无意中搜索到了知乎上的一个帖子大公司里怎样开发和部署前端代码?
看到这个文章中提到了FIS,跟随着文章开始学习走起,有点小兴奋,只不过很快便发现问题更多。
 
二、尝试
原本只是想着有个工具可以将前端资源打个标识,这样就可以轻松的解决浏览器静态缓存更新问题。FIS的描述也确实如此,那么就开始动手搞起吧。
安装
FIS是基于Nodejs开发,所以nodejs必须有。装起。。
然后通过npm命令装起, npm install -g fis。结果卡死了。
 
由于是第一次接触,所以在baidu上找了半天也没找到方案。放弃。。。
 
发现了官方视频教程,于是花时间看了几集,大概了解到FIS这个工具还是挺简单的。而且解决了前端开发的问题:
1、资源压缩
2、md5戳
3、资源合并
 
貌似比较有用的功能就这几个。而我最关心的就是md5戳咯。。
 
md5戳
所谓Md5戳就是这样的:
<script src="/script/placeholder.js"></script>
加戳后是这样的:
<script src="/script/placeholder_88025f0.js"></script>
 
当然文件本身名称也变了:script/placeholder_88025f0.js
 
这样一来解决了两个问题:
1、引用静态资源的URI变了,那么自然浏览器会取新的资源,解决了更新缓存的问题
2、md5是通过文件计算得来,所以只有文件发生变化了才会产生新的URI,反之就不用变了,这就解决了增量更新的问题,同时兼顾了流量功击
 
当然对于我这种小项目来说第2点几乎没啥用。
 
再尝试安装
既然知道了好处,那就继续装吧,打开fis官方网站:http://fis.baidu.com,这里面有入门教程,这点毕竟百度团队公开的帮助还是相当可以的。而且是中文滴,好有亲近感。。找了原因可能是npm网站动不动会被墙导致的。。那么,官方也有方案,使用镜像:
npm install some-npm-module -g --registry=国内镜像 --disturl=https://npm.taobao.org/dist

这些东西官方网站都有提到,就不多说啦。出门左转去这里:https://github.com/fex-team/fis/issues/65

 
这次好了,安装好了,fis -v
 
三、遇到问题
装好了后那就开始在项目中用吧,这才发现自己太年轻。。。。。。
 
1、配置
直接使用fis release -md ../output,好了开始生成与发布。结果完蛋了,不管阿猫阿狗全部js/css/imgs都添加了md5戳。这可就麻烦了,完全不是自己想要的,也就是说直接通过一个工具一键解决加Md5戳的问题太理想了。
 
那么只好去研究官方的文档,了解具体的配置方式。在FIS中都是通过fis-conf.js这个文件来进行配置。官方例子:
// 设置图片合并的最小间隔
fis.config.set('settings.spriter.csssprites.margin', 20);
 
// 取消下面的注释开启simple插件,注意需要先进行插件安装 npm install -g fis-postpackager-simple
 fis.config.set('modules.postpackager', 'simple');
 
// 取消下面的注释设置打包规则
 fis.config.set('pack', {
     '/pkg/lib.js': [
         'js/lib/jquery.js',
         'js/lib/underscore.js',
         'js/lib/backbone.js',
         'js/lib/backbone.localStorage.js',
     ],
     // 取消下面的注释设置CSS打包规则,CSS打包的同时会进行图片合并
      '/pkg/aio.css': '**.css'
 });
 
// 取消下面的注释可以开启simple对零散资源的自动合并
 fis.config.set('settings.postpackager.simple.autoCombine', true);
 
fis.config.merge({
    roadmap : {
        path : [
            {
                //所有widget目录下的js文件
                reg : 'widget/**.js',
                //是模块化的js文件(标记为这种值的文件,会进行amd或者闭包包装)
                isMod : true,
                //默认依赖lib.js
                requires : [ 'lib.js' ],
                //向产出的map.json文件里附加一些信息
                extras : { say : '123' },
                //编译后产出到 /static/widget/xxx 目录下
                release : '/static$&'
            },
            {
                //所有的js文件
                reg : '**.js',
                //发布到/static/js/xxx目录下
                release : '/static/js$&'
            },
            {
                //所有的ico文件
                reg : '**.ico',
                //发布的时候即使加了--md5参数也不要生成带md5戳的文件
                useHash : false,
                //发布到/static/xxx目录下
                release : '/static$&'
            },
            {
                //所有image目录下的.png,.gif文件
                reg : /^\/images\/(.*\.(?:png|gif))/i,
                //访问这些图片的url是 '/m/xxxx?log_id=123'
                url : '/m/$1?log_id=123',
                //发布到/static/pic/xxx目录下
                release : '/static/pic/$1'
            },
            {
                //所有template目录下的.php文件
                reg : /^\/template\/(.*\.php)/i,
                //是类html文件,会进行html语言能力扩展
                isHtmlLike : true,
                //发布为gbk编码文件
                charset : 'gbk',
                //发布到/php/template/xxx目录下
                release : '/php/template/$1'
            },
            {
                //前面规则未匹配到的其他文件
                reg : /.*/,
                //编译的时候不要产出了
                release : false
            }
        ]
    }
});

这里面我目前用的最多的是roadmap,感觉这是个核心设置。

 
2、资源定位
所谓资源定位,就是在html/js/css中定位到资源引用,将FIS编绎(生成)过的新资源替换进去。那么其实挺简单的,就像本文最开始说的例子:
<script src="/script/placeholder.js"></script>
加戳后是这样的:
<script src="/script/placeholder_88025f0.js"></script>

这样每次发布都是自动完成了资源更新,有点小爽。。只不过问题来了。。。FIS目前替换后的URI是绝对路径。这句话什么意思?

 
比如,一个css代码:
.h_login-conimgbg{background:transparent url('img/lgoin_image.png') no-repeat; height:406px;}
 
其中引用了img/lgoin_image.png这个图片。但是经过FIS编绎后是什么样:
.h_login-conimgbg{background:transparent url('/css/img/lgoin_image_369f159.png') no-repeat; height:406px;}
 
FIS直接将绝对路径进行的替换,这就带来了一个问题,原先是相对目录,换成绝对目录后就变成了根目录了。会有啥问题呢?
如果使用了二级目录就会出现问题,比如系统部署在tomcat的webapps下的myweb目录中,访问时:http://localhost:8080/myweb。那么上面css定位资源时是http://localhost:8080/myweb/css/img/lgon_image.png。
 
可是FIS编绎后就会这样:http://localhost:8080/css/img/lgon_image_369f159.png。这样就无法访问了。于是我在FIS的讨论区咨询了这个问题,给的回复是:
 
 现在全部是绝对路径,主要是考虑到资源合并和 cdn 部署的功能实现
 
这么一来就只能通过其他的方式解决,比如,roadmap里可以配置资源的url生成时添加domain,这个方法原本是用来做cdn部署时使用的。但是也可以解决上面的问题。
 
3、不想处理的文件
在系统里使用了许多第三方资源,如jquery、jqueryUi等库,但这些库我们基本不会去修改代码,也就不存在那些静态资源压缩、添加md5的问题了。那当然就不想在FIS里处理这些文件,而FIS是默认处理所有的js/css/imgs。这也就涉及到了配置的问题。
fis.config.merge({
    roadmap : {
  path : [
   {
                //plugin的js文件
                reg : /^\/plugin\/(.*\.(?:js|css))/i,
                useHash : false,
                useCompile : false,
                url : '${appServer}$&',
            }
        ]
    }
});
这是我截取的一个配置片段,通过reg来定位具体的目录
  • useHash:false,表示不添加md5戳
  • useCompile:false,表示不对资源进行编绎处理
 
好了,有了这个配置,plugin下的js/css就不会被处理了。
 
四、阶段感受
其实到最后我已经放弃了,因为项目会用到jenkins hudson做集成,这里面还有许多的部署问题,时间关系就不愿意再深入了。原本想的用个工具加个md5戳或者版本号的想法破灭了。
 
但是收获还是有的:
1、前端的工程化原来可以有这么出格的思路,其实并没有什么特别大的进步,只不过是看起来很叼的样子。而且FIS感觉是起步阶段,对于开发相对较为规范的项目确实是可以考虑的一个辅助工具
2、真正让我觉得有意思的地方是前端模块化。这部分是FIS里的进阶,真正的前端工程其实是这部分。我在前端方面的经验太少了,仅仅是初步水平,所以这部分高级内容需要花时间学习和实践
3、无论产前端还是后端都是程序员,都是工程师。
 

F.I.S初探(前端工程化)的更多相关文章

  1. 前端工程化开发之yeoman、bower、grunt

    上两遍文章介绍了前端模块化开发(以seaJs为例)和前端自动化开发(以grunt为例)的流程,参见: http://www.cnblogs.com/luozhihao/p/4818782.html ( ...

  2. [转]基于gulp和webpack的前端工程化

    本文样例代码 :https://github.com/demohi/learning-gulp 本文主要简单介绍一下基于gulp和webpack的前端工程化. 技术栈 React.js reFlux ...

  3. 基于webpack的前端工程化开发解决方案探索(一):动态生成HTML(转)

    1.什么是工程化开发 软件工程的工程化开发概念由来已久,但对于前端开发来说,我们没有像VS或者eclipse这样量身打造的IDE,因为在大多数人眼中,前端代码无需编译,因此只要一个浏览器来运行调试就行 ...

  4. 前端工程化(二)---webpack配置

    导航 前端工程化(一)---工程基础目录搭建 前端工程化(二)---webpack配置 前端工程化(三)---Vue的开发模式 前端工程化(四)---helloWord 继续上一遍的配置,本节主要记录 ...

  5. 前端工程化(三)---Vue的开发模式

    从0开始,构建前后端分离应用 导航 前端工程化(一)---工程基础目录搭建 前端工程化(二)---webpack配置 前端工程化(三)---Vue的开发模式 前端工程化(四)---helloWord ...

  6. gulp前端工程化教程

    gulp npm install -g gulp-concat 文件打包 npm install -g gulp-rename 文件重命名 npm install -g gulp-imagemin 图 ...

  7. 前端工程化系列[06]-Yeoman脚手架核心机制

    在前端工程化系列[05] Yeoman脚手架使用入门这边文章中,对Yeoman的使用做了简单的入门介绍,这篇文章我们将接着探讨Yeoman这个脚手架工具内部的核心机制,主要包括以下内容 ❏ Yeoma ...

  8. 前端工程化系列[04]-Grunt构建工具的使用进阶

    在前端工程化系列[02]-Grunt构建工具的基本使用和前端工程化系列[03]-Grunt构建工具的运转机制这两篇文章中,我们对Grunt以及Grunt插件的使用已经有了初步的认识,并探讨了Grunt ...

  9. 前端工程化系列[03]-Grunt构建工具的运转机制

    在前端工程化系列[02]-Grunt构建工具的基本使用这篇文章中,已经对Grunt做了简单的介绍,此外,我们还知道了该如何来安装Grunt环境,以及使用一些常见的插件了,这篇文章主要介绍Grunt的核 ...

  10. 页面仔初窥"前端工程化"

    今天看了几篇前端界的一位大牛--张云龙的文章,其中一篇在自己的理解范围内看得懂一些,有所收获,说的是前端工程化的事,看完算是对前端工程形成了一个模糊的概念. 现在我所接触到的前端开发,还是张云龙大神所 ...

随机推荐

  1. Lintcode 75.寻找峰值

    --------------------------------------- 按照给定的峰值定义,峰值的左半部分一定是递增的,所以只要找到不递增的即可. AC代码: class Solution { ...

  2. python 学习笔记7 面向对象编程

    一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...

  3. PHPCMS_V9 模型字段添加单文件上传功能

    后台有“多文件上传”功能,但是对于有些情况,我们只需要上传一个文件,而使用多文件上传功能上传一个文件,而调用时调用一个文件URL太麻烦了. 使用说明: 1.打开phpcms\modules\conte ...

  4. 4.View绘制分析笔记之onDraw

    上一篇文章我们了解了View的onLayout,那么今天我们来学习Android View绘制三部曲的最后一步,onDraw,绘制. ViewRootImpl#performDraw private ...

  5. VS2013如何避开安装时IE10的限制

    [VS2013]如何避开VS2013必须要有IE10的限制 VS就会告诉我们目前环境不适合安装VS2013,必须升级IE版本到IE10. 在不安装IE10时的时候,安装办法: 将下面一段文字,储存为. ...

  6. Qt经典出错信息之undefined reference to `vtable for classname

    原文链接:Qt经典出错信息之undefined reference to `vtable for classname 这个出错信息太常见了,用过Qt两个月以上的朋友基本上都能自己解决了,因为太经典了, ...

  7. [转]在Eclipse中使用JUnit4进行单元测试(中级篇)

    我们继续对初级篇中的例子进行分析.初级篇中我们使用Eclipse自动生成了一个测试框架,在这篇文章中,我们来仔细分析一下这个测试框架中的每一个细节,知其然更要知其所以然,才能更加熟练地应用JUnit4 ...

  8. 关于UnsupportedClassVersionError的错误处理

    错误:Java.lang.UnsupportedClassVersionError: Bad version number in .class file 造成这种错误的原因是你的支持Tomcat运行的 ...

  9. solr update接口常用方法

    solr索引数据更新接口:http://localhost:8080/solr/update 有以下一些操作可以通过update接口完成,只能使用post的形式提交数据. 1.添加索引 确保field ...

  10. bzoj 3507: [Cqoi2014]通配符匹配

    Description 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个是星号(“”’),可以匹配0个及以上的任意字符:另一个是问号(“?”),可 ...