FIS学习记录

什么是FIS?

FIS(Front-end Intergrated Solution),前端集成解决方案。 通常,一套完整的前端技术解决方案包括四个方向:

  1. 前端框架:提供组件加载及管理框架支持,提供前端基础库及组件库。
  2. 模板框架:提供组件化开发模式支持;配合前端框架收集页面所需要的最小静态资源需求;留有充分的性能优化空间,性能优化对工程师透明。
  3. 自动化工具:提供基本优化能力;为前端框架、模板框架提供辅助支持。
  4. 辅助开发工具:提升工程师的开发体验,降低调试、部署成本。

如果你想了解更多可以看这篇文章《什么是F.I.S》

三条基本语句

FIS的基础使用并不难,也就是三条指令 fis install(下载需要的组件)、fis release(编译并发布到服务器)、fis server(内置服务器相关)。
使用 fis release --optimize 实现资源压缩,fis release --md5实现对静态资源添加md5戳,fis release --pack实现资源合并。如果想同时使用三种功能可以 fis release -omp。
资源合并需要在fis.config.js中进行打包规则的设定。
例如:

fis.config.set('pack', {
 'pkg/lib.js': [ 
    '/lib/mod.js', 
    '/modules/underscore/**.js', 
    '/modules/backbone/**.js', 
    '/modules/jquery/**.js', 
    '/modules/vendor/**.js', 
    '/modules/common/**.js' 
  ]
});

设置完pack后,FIS默认只会进行文件打包,不会对页面中的静态资源引用进行替换,我们可以引入fis-postpackager-simple进行资源引用替换。

fis.config.set('modules.postpackager','simple')

如果要同时使用

三种语言能力
资源定位

资源定位其实就是指开发路径和部署路径分离,你可以通过配置来决定产出后静态资源的路径。


uri.png
内容嵌入

内容嵌入可以为工程师提供诸如图片base64嵌入到css、js里,前端模板编译到js文件中,将js、css、html拆分成几个文件最后合并到一起的能力。有了这项能力,可以有效的减少http请求数,提升工程的可维护性。(图片base64为什么能减少http请求?)

依赖声明

我们可以通过在html、css、js文件中声明对其他资源的依赖,然后fis在编译的过程中会扫描这些声明,建立一张静态资源关系表,从而建立一张map.json文件,使用fis作为编译工具的项目,可以将这张表提交给后端或者前端框架去运行时根据组件使用情况来 按需加载资源或者资源所在的包,从而提升前端页面运行性能。

配置api

虽然fis的基本功能就基本满足了大部分前端开发的要求,但是还是需要进行插件配置来满足不同项目的需求。在学习如何配置之前,要先理解一下单文件编译原理和打包原理。

fis编译流程.png

从图中我们可以看出,在单文件编译过程中有7个可扩展的处理过程,打包过程中有4个可扩展的处理过程,我们就在这些地方进行配置。

使用配置文件

在项目目录下新建一个 fis-conf.js 文件,我们可以对fis的编译系统做各种定制化配置。配置fis系统的接口是:

  fis.config.set('key',value);
  \\或者
  fis.config.merge({});

配置一共分为六类,项目配置、插件配置、插件运行配置、目录规范与域名配置、部署配置、打包配置。因为每项配置都有各种插件,所以用代码+注释来总结。

项目配置
//项目配置 配置项project
fis.config.merge({
    project:{
        charset : 'utf8',   //字符编码设置
        md5Length : 8,      //md5戳长度设置
        md5Connector : '.', //md5与文件的连接符设置
        include : 'src/**', //命中include的文件才会视为源码
        //排除命中文件,如果同时设置include则指排出命中include中的文件
        exclude : /^\/_build\//i, 
        fileType:{
            text : 'tpl,js,css', //追加文本后缀列表
            image : 'swf,cur,ico'//追加图片类二进制文件后缀列表
        }
    }
})
//解释:设置项目源码监听时不监听的文件列表。
fis.config.set('project.watch.exclude', 'node_modules'); 
//设置项目源码监听的方式,true为轮询方式,false为用系统api检查
fis.config.set('project.watch.usePolling', true);
插件配置
//插件配置 配置项modules
fis.config.merge({
    modules : {
        parser : { //配置编译器插件,可以根据 文件后缀 将某种语言编译成标准的js、css、html语言。
            less : ['less'],
            md : 'marked'
        },
        preprocessor : { //配置标准化预处理器插件,可以根据文件后缀对文件进行预处理。
            css : 'image-set'
        },
        postprocessor : {//在fis对静态资源进行语言能力扩展之后调用的插件配置,可以根据文件后缀对文件进行后处理。
            js : 'jswrapper'
        },
        lint : {//配置代码检查插件
            js : 'jshint' //js后缀文件会经过fis-lint-jshint插件的代码校验检查
        },
        test : {//配置自动测试插件
            js : 'phantomjs'
        },
        optimizer : {//配置文件优化插件
            js : 'uglify-js'
        },
        prepackager : 'xx',//打包预处理插件
        packager : 'packager',//打包插件
        spriter : 'spriter',//打包后处理csssprite插件
        postpackager : 'postpackager'//打包后处理插件
    }
})
插件运行配置
//插件运行配置 配置项settings
fis.config.merge({
    settings : {
        optimizer : {
            //fis-optimizer-uglify-js插件的配置数据
            'uglify-js' : {
                output : {
                    max_line_len : 500
                }
            },
            //fis-optimizer-clean-css插件的配置数据
            'clean-css' : {
                keepBreaks : true
            }
        }
    }
});

还有个内置插件运行配置,其实就是对fis中内置的插件进行详细的配置。

目录规范与域名配置

这部分我觉得是比较重要的,roadmap.path负责设置项目文件属性,与fis的三种语言能力都有关系,roadmap.ext指定后缀名与标准化语言的映射关系,roadmap.domain负责设置静态资源的域名前缀。

//目录规范与域名配置 配置项roadmap
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
            }
        ],
        ext : {
            //less后缀的文件将输出为css后缀
            //并且在parser之后的其他处理流程中被当做css文件处理
            less : 'css',
            //coffee后缀的文件将输出为js文件
            //并且在parser之后的其他处理流程中被当做js文件处理
            coffee : 'js',
            //md后缀的文件将输出为html文件
            //并且在parser之后的其他处理流程中被当做html文件处理
            md : 'html'
        },
        domain : {
            //widget目录下的所有css文件使用 http://css1.example.com 作为域名
            'widget/**.css' : 'http://css1.example.com',
            //所有的js文件使用 http://js1.example.com 或者  http://js2.example.com 作为域名
            '**.js' : ['http://js1.example.com', 'http://js2.example.com'],
            'image' : ['http://img1.example.com']//设置图片域名前缀
        }

    }
});
部署配置

deploy设置项目的发布方式,可以发布到本地也可以发布到服务器。

//部署配置 配置项deploy
fis.config.merge({
    deploy : {
        //使用fis release --dest remote来使用这个配置
        remote : {
            //如果配置了receiver,fis会把文件逐个post到接收端上
            receiver : 'http://www.example.com/path/to/receiver.php',
            //从产出的结果的static目录下找文件
            from : '/static',
            //保存到远端机器的/home/fis/www/static目录下
            //这个参数会跟随post请求一起发送
            to : '/home/fis/www/',
            //通配或正则过滤文件,表示只上传所有的js文件
            include : '**.js',
            //widget目录下的那些文件就不要发布了
            exclude : /\/widget\//i,
            //支持对文件进行字符串替换
            replace : {
                from : 'http://www.online.com',
                to : 'http://www.offline.com'
            }
        },
        //名字随便取的,没有特殊含义
        local : {
            //from参数省略,表示从发布后的根目录开始上传
            //发布到当前项目的上一级的output目录中
            to : '../output'
        },
        //也可以是一个数组
        remote2 : [
            {
                //将static目录上传到/home/fis/www/webroot下
                //上传文件路径为/home/fis/www/webroot/static/xxxx
                receiver : 'http://www.example.com/path/to/receiver.php',
                from : '/static',
                to : '/home/fis/www/webroot'
            },
            {
                //将template目录内的文件(不包括template一级)
                //上传到/home/fis/www/tpl下
                //上传文件路径为/home/fis/www/tpl/xxxx
                receiver : 'http://www.example.com/path/to/receiver.php',
                from : '/template',
                to : '/home/fis/www/tpl',
                subOnly : true
            }
        ]
    }
});
打包配置

这个就比较熟悉了,在前面的资源合并中也有提到。

//打包配置
fis.config.merge({
    pack : {
        //打包所有的demo.js, script.js文件
        //将内容输出为static/pkg/aio.js文件
        'pkg/aio.js' : ['**/demo.js', /\/script\.js$/i],
        //打包所有的css文件
        //将内容输出为static/pkg/aio.css文件
        'pkg/aio.css' : '**.css'
    }
});
总结

fis是一个前端工具框架,我们可以通过相应的配置来满足不同的项目需求,尤其是三种语言能力,为前端开发的我们解决了很多不必要的麻烦,除此之外,我觉得难点重点主要在对fis.config.js的配置上,所以要重点看配置api这一部分。
其实学习fis的时间不长,加起来应该不到三天,只在fis官方文档提供的fis-quickstart-demo中进行了练习,心得可能稍微有点浅,等以后实际应用了再来完善。
参考文档:
《fis官方文档》
《fis运行原理》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 前端集成解决方案要求: 模块化开发。最好能像写nodejs一样写js,很舒服。css最好也能来个模块化管理! 性能...
    Www刘阅读 2,999评论 1 20
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,431评论 25 707
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,733评论 6 342
  • 性能优化方向分类 请求数量: 合并脚本和样式表, CSS Sprites, 拆分初始化负载, 划分主域(使用“查找...
    Www刘阅读 1,759评论 3 8
  • 幸福在哪里,幸福在哪里? 幸福在高山,幸福在大海 幸福在冰川,幸福在荒漠 幸福在哪里,幸福在哪里? 幸福无时无刻无...
    胡子长阅读 239评论 0 0