前端构建工具-fis3

前言

来到新公司,接手一个一年前的老项目,项目技术栈为fis3+vue1+requireJs+less,从而接触到fis3+require.js的配合用法。虽然这套方案已经慢慢被遗弃,而fis3也被webpack逐步取代。但是学习这套方法对维护旧项目有不少的帮助,因此便记录一下学习过程。

简介

fis3 :是面向前端的工程构建工具。解决前端工程中性能优化、资源加载(异步、同步、按需、预加载、依赖管理、合并、内嵌)、模块化开发、自动化工具、开发规范、代码部署等问题。
require.js:一个能实现js文件的异步加载,避免网页失去响应和管理模块之间的依赖性,便于代码的编写和维护的JS库。

重点

require.js
//main.js会第一个被require.js加载
<script src="js/require.js" data-main="js/main"></script>
// main.js
require(['moduleA', 'moduleB', 'moduleC'], function (moduleA, moduleB, moduleC){
  // some code here
  //只有在module ABC都加载成功,回调函数才会执行
});
//配置require对象,写在main.js主体函数前
require.config({
  baseUrl: "js/lib",  //配置基准目录,可选
  paths: {  //定义依赖的名称和路径,默认加后缀.js,所以别加.js。定义后页面会自动加载此js文件,不用自己引入。
    "jquery": "jquery.min",
    "underscore": "underscore.min",
    "backbone": "backbone.min"
    },
  shim: {  //加载非amd规范的模块
    'underscore':{
      exports: '_'  
     },
    'backbone': {
      deps: ['underscore', 'jquery'],  //模块依赖
      exports: 'Backbone'  //输出的变量名,表明这个模块外部调用时的名称
     },
    'jquery.scroll': {  //jquery插件可以这样写
      deps: ['jquery'],
      exports: 'jQuery.fn.scroll'
     }
   }
 });
//定义一个amd模块
//第一个参数为名字,可选,定义了名字可以让其他文件根据其名字找到这个模块,不用显式配置require.config的path,而且如果require.config的path定义的名称与这个参数不一致,前者会无效。
//第二个参数是依赖于其他模块,可选,必为数组。
//函数必定有返回值,一般为对象。
define('name', ['myLib'], function(myLib){
  function foo(){
    myLib.doSomething();
  }
  return {
    foo : foo
  };
});

正确姿势:
引入require.js, 用require.config的paths属性加载其他js文件,注意paths中的key要和js文件中define定义的name一致,不然会引入失败。如果define中没有传入name参数,则默认和key相同。



参考资料:

  1. http://www.ruanyifeng.com/blog/2012/11/require_js.html (阮一峰)
  2. http://blog.csdn.net/u010130282/article/details/52329953
fis3
常用命令

fis3 release -wL 打包并启动热加载,默认输出到内置服务器目录
fis3 server start 开启fis3内置服务器
fis3 server open 打开内置服务器的目录
fis3 release prod 打包成生产环境

重要知识

fis-conf.js为配置文件,放在项目根目录;

//selector :FIS3 把匹配文件路径的路径作为selector,匹配到的文件会分配给它设置的 props
//props :编译规则属性,包括文件属性和插件属性
//http://fis.baidu.com/fis3/docs/api/config-glob.html  (selector规则)
//http://fis.baidu.com/fis3/docs/api/config-props.html  (props属性说明)

fis.match(selector, props);

//例子  (排在后面的匹配会覆盖排在前面的匹配,类似于css样式)
fis.match('*.js', {
  useHash: false
});
//fis.media() 接口提供多种状态功能,比如有些配置是仅供开发环境下使用,有些则是仅供生产环境使用的。

fis.media('prod').match('*.js', {
  optimizer: fis.plugin('uglify-js')
});
//常用的功能组合

// 加 md5
fis.match('*.{js,css,png}', {
  useHash: true
});

// 启用 fis-spriter-csssprites 插件
fis.match('::package', {
  spriter: fis.plugin('csssprites')
});

// 对 CSS 进行图片合并
fis.match('*.css', {
  // 给匹配到的文件分配属性 `useSprite`
  useSprite: true
});

fis.match('*.js', {
  // fis-optimizer-uglify-js 插件进行压缩,已内置
  optimizer: fis.plugin('uglify-js')
});

fis.match('*.css', {
  // fis-optimizer-clean-css 插件进行压缩,已内置
  optimizer: fis.plugin('clean-css')
});

fis.match('*.png', {
  // fis-optimizer-png-compressor 插件进行压缩,已内置
  optimizer: fis.plugin('png-compressor')
});

//开发中的配置应为
fis.media('debug').match('*.{js,css,png}', {
  useHash: false,
  useSprite: false,
  optimizer: null
})

fis3.medie('prod').match('*.{js,css,png}', {
  useHash: true
}).match('*.js', {
  optimizer: fis.plugin('uglify-js')
}).match('*.css', {
  optimizer: fis.plugin('clean-css')
}).match('*.png', {
  optimizer: fis.plugin('png-compressor')
}).match('::package', {
  postpackager: fis.plugin('loader', {
    allInOne: true
  })
}).match('::package', {
  spriter: fis.plugin('csssprites')
})
前端编译器的核心功能
  1. 资源定位:获取任何开发中所使用资源的线上路径;(可以调整资源的输出路径、引入路径等,详细看http://fis.baidu.com/fis3/docs/user-dev/uri.html
  2. 内容嵌入:把一个文件的内容(文本)或者 base64 编码(图片)嵌入到另一个文件中;(对html、css、js使用__inline操作)
  3. 声明依赖:在一个文本文件内标记对其他资源的依赖关系;
fis3-postpackager-loader和fis3-hook-amd

使用以上插件进行fis3的模块化开发,前者用于依赖组件的加载,后者用于为依赖进行配置声明(类似于require.config)。此fis3模块化开发需要搭配require.js进行。

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

推荐阅读更多精彩内容

  • 前端集成解决方案要求: 模块化开发。最好能像写nodejs一样写js,很舒服。css最好也能来个模块化管理! 性能...
    Www刘阅读 2,996评论 1 20
  • 什么是fis3? FIS3 是面向前端的工程构建工具。解决前端工程中性能优化、资源加载(异步、同步、按需、预加载、...
    hold_baby阅读 4,118评论 0 4
  • 性能优化方向分类 请求数量: 合并脚本和样式表, CSS Sprites, 拆分初始化负载, 划分主域(使用“查找...
    Www刘阅读 1,759评论 3 8
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • 明武宗正德皇帝朱厚照因没有子嗣,便选了堂弟朱厚熜(嘉靖)继位,但朱厚熜是以亲王的身份去继承大统,当上皇帝后该如何定...
    一夕厘阅读 939评论 1 3