`
zccst
  • 浏览: 3319104 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

fis的实现原理和提供的三种能力

    博客分类:
  • fis
阅读更多
作者:zccst


fis原理

fis编译过程:单文件编译和打包两个阶段



1,单文件编译
parser:将其他语言编译为标准js、css,比如将前端模板、coffee-script编译为js,将less、sass编译为css。
preprocessor:在fis进行标准化处理之前进行某些修改,比如 支持image-set语法的预处理插件
standard:前面两项处理会将文件处理为标准的js、css、html语法,fis内核的标准化处理过程对这些语言进行 三种语言能力 扩展处理。这也就意味着,使用less、coffee等语法在fis系统中一样具备 资源定位、内容嵌入,依赖声明 的能力。该过程 不可扩展。
postprocessor:对文件进行标准化之后的处理,比如利用依赖声明能力实现的 js包装器插件,可以获取js文件的依赖关系,并添加define包装。
lint
test
optimize:代码优化阶段,使用 fis release命令的 --optimize 参数会调用该过程。fis内置的fis-optimizer-uglify-js插件和fis-optimizer-clean-css插件都是这类扩展。

2,打包过程
而fis的打包概念实际上是 资源备份。fis在打包期间最重要的生成物是 map.json,当使用fis release命令添加 --pack 参数时,会触发打包过程,此时,会根据fis-conf.js中的 pack节点配置将文件进行合并,然后把合并后的打包文件相关信息记录到map.json中,并生成相应文件。所以fis的打包结果并 不会再嵌入到某个文件内,而是利用map.json中的数据进行运行时打包信息查询。

fis系统的打包过程提供了4个可扩展的处理过程,它们是:

1. prepackager(打包预处理器):在打包前进行资源预处理。
2. packager(打包处理器):对资源进行打包。默认的打包器就是收集资源表,建立map.json的过程
3. spriter(csssprite处理器):对css进行sprites化处理
4. postpackager(打包后处理器):打包之后对文件进行处理,通常用来将map.json转换成其他语言的文件,比如php




fis三种能力
一、资源定位  可以有效的分离开发路径与部署路径之间的关系
在HTML中,HTML中有标签,有<img src="path"><link href="path"><script src="path">
在js中,分析js文件HTML的script标签内容。使用编译函数__uri(path)来定位资源
在css中,识别css文件或HTML的style标签内容 url(path) 以及 src=path
配置位置:
fis.config.merge({
    roadmap : {
        path : [


        ]
    }
});



二、嵌入资源 提供诸如图片base64嵌入到css、js里,前端模板编译到js文件中,将js、css、html拆分成几个文件最后合并到一起的能力。
1,在HTML嵌入图片base64,css文件,js文件,xx.html文件。后缀都加 ?__inline
2,在js中切入js文件(__inline('demo.js')),嵌入图片(__inline('images/logo.gif')),嵌入其他文本文件(var css = __inline('a.css'))
3,在css中嵌入  与html类似,凡是命中了资源定位能力的编译标记, 除了src="xxx"之外,都可以通过添加 ?__inline 编译标记都可以把文件内容嵌入进来。src="xxx"被用在ie浏览器支持的filter内,该属性不支持base64字符串,因此未做处理。
也是加__inline
@import url('demo.css?__inline');
.style {
    background: url(images/logo.gif?__inline);
}


三、依赖声明  提供了声明依赖关系的编译接口。fis在执行编译的过程中,会扫描这些编译标记,从而建立一张 静态资源关系表,它在编译阶段最后会被产出为一份 map.json 文件,这份文件详细记录了项目内的静态资源id、发布后的线上路径、资源类型以及 依赖关系 和 资源打包等信息。
1,在HTML中声明依赖
<!--
@require demo.js
@require demo.css
-->
在fis-conf.js中,通过配置useMap让HTML文件加入map.json
//fis-conf.js
fis.config.merge({
    roadmap : {
        path : [
            {
                //所有的html文件
                reg : '**.html',
                //输出到map.json表中
                useMap : true
            }
        ]
    }
});

执行 fis release --dest ./output --md5 命令对项目进行编译,查看output目录下的map.json文件,则可看到:
{
    "res" : {
        "demo.css" : {
            "uri" : "/static/css/demo_7defa41.css",
            "type" : "css"
        },
        "demo.js" : {
            "uri" : "/static/js/demo_33c5143.js",
            "type" : "js",
            "deps" : [ "demo.css" ]
        },
        "index.html" : {
            "uri" : "/index.html",
            "type" : "html",
            "deps" : [ "demo.js", "demo.css" ]
        }
    },
    "pkg" : {}
}

2,在js中声明依赖
fis支持识别js文件中的 require函数,或者 注释中的@require字段 标记的依赖关系,这些分析处理对 html的script标签内容 同样有效。
//demo.js
/**
* @require demo.css
* @require list.js
*/
var $ = require('jquery');
经过编译之后,查看产出的 map.json 文件,可以看到:
{
    "res" : {
        ...
        "demo.js" : {
            "uri" : "/static/js/demo_33c5143.js",
            "type" : "js",
            "deps" : [ "demo.css", "list.js", "jquery" ]
        },
        ...
    },
    "pkg" : {}
}

2,在css中声明依赖
fis支持识别css文件 注释中的@require字段 标记的依赖关系,这些分析处理对 html的style标签内容 同样有效。
/**
* demo.css
* @require reset.css
*/
经过编译之后,查看产出的 map.json 文件,可以看到:

{
    "res" : {
        ...
        "demo.css" : {
            "uri" : "/static/css/demo_7defa41.css",
            "type" : "css",
            "deps" : [ "reset.css" ]
        },
        ...
    },
    "pkg" : {}
}


如果您觉得本文的内容对您的学习有所帮助,您可以微信:
  • 大小: 26.8 KB
分享到:
评论

相关推荐

    前端开源库-fis3-parser-browserify

    FIS3是一个强大的前端构建工具,它提供了丰富的配置选项和插件机制,用于优化前端开发流程,包括文件编译、资源合并、压缩、自动刷新等功能。Browserify则是JavaScript模块打包工具,允许开发者使用CommonJS规范在...

    FIS管理系统(SSH)

    **FIS管理系统(SSH)详解** SSH(Struts2 + Spring + Hibernate)是...通过分析和实践这个FIS管理系统,开发者不仅能深入理解SSH框架的工作原理,还能提升实际项目开发的能力,为日后的Java Web开发打下坚实的基础。

    templatejs的fis编译插件一款javascript模板引擎

    总的来说,template.js的fis编译插件是JavaScript开发中的一个强大工具,结合FIS的构建能力,可以极大地提升前端开发效率和代码质量。通过学习和熟练掌握这一技术,开发者可以更好地应对复杂的前端模板渲染需求。

    matlab开发-使用FIS的时间周期预测

    它利用模糊规则和神经网络的训练能力,以提高预测精度和模型的适应性。ANFIS网络通常由五层结构组成,包括输入层、两个模糊化层、一个推理层和一个反模糊化层。 2. 时间序列预测: 时间序列分析是研究数据随时间...

    Java序列化的机制和原理

    ### Java序列化的机制和原理 #### 一、序列化与反序列...总结来说,Java序列化机制提供了对象序列化和反序列化的能力,使得对象可以跨网络传输或存储于磁盘上。理解序列化的原理对于开发基于网络的应用程序尤其重要。

    模糊神经网络 matlab实现

    总之,MATLAB提供了一套完整的工具集来实现模糊神经网络,从设计模糊系统、定义规则到训练和应用,为研究者和工程师提供了便利。通过理解模糊逻辑和神经网络的基本原理,并掌握MATLAB的相关函数,你可以构建自己的...

    ADS-B原理及在空中交通管制中的应用.docx

    该技术利用卫星定位系统(如GPS)和数据链通信,实现对飞行器的实时监控,从而提供精确的飞行信息。 ADS-B的核心原理是,飞行器上的设备通过GPS确定自身精确位置,并结合飞行状态信息(如速度、高度、航向等)生成...

    基于matlab编程实现的FuzzyMathematicalModel模糊数学模型.rar

    MATLAB作为一种强大的数值计算和可视化软件,提供了丰富的工具箱支持模糊逻辑系统的设计、仿真和分析。在这个基于MATLAB编程实现的FuzzyMathematicalModel项目中,我们将探讨如何利用MATLAB来构建和应用模糊数学模型...

    MATLAB实现进化算法,案例丰富【数学建模、科学计算算法】.zip

    用户不仅可以了解每种算法的基本原理,还能通过实际操作加深理解,提高问题解决能力。确保项目代码能够顺利编译和运行,意味着可以直接运行示例,观察算法的动态过程,从而更好地掌握MATLAB编程和进化算法的应用技巧...

    FIS测验和抽认卡:Flatiron最终项目

    标题 "FIS测验和抽认卡:Flatiron最终项目" 暗示这是一个与学习和测试编程知识相关的项目,特别关注的是Ruby编程语言。在Flatiron School,学生经常通过创建实际项目来巩固他们的编程技能,这个“FIS测验和抽认卡”...

    socket实现上传文件工具类

    在Java中,Socket类位于java.net包下,提供了TCP/IP通信的能力。TCP是一种面向连接的、可靠的传输协议,保证了数据的顺序和完整性。 二、文件上传原理 文件上传通常基于HTTP或FTP协议,但通过Socket我们可以自定义...

    基于BP神经网络的模糊控制算法程序,模糊神经网络的算法和原理,matlab源码.zip

    MATLAB提供了强大的工具箱,如FIS(模糊推理系统)和Neural Network Toolbox,支持模糊控制和神经网络的建模和仿真。在MATLAB环境中实现基于BP神经网络的模糊控制算法,可以分为以下几步: 1. **创建模糊系统**:...

    局域网传送文件Java实现(Server端)

    在IT行业中,网络编程是一项核心技能,特别是在分布式系统和客户端-服务器应用的开发中。...这个项目提供的Server端代码,是一个很好的学习和实践网络编程的实例,对于提升开发者在网络应用开发方面的能力大有裨益。

    补偿模糊神经网络和模糊神经网络程序整理.zip

    通过这些资源,学习者可以深入了解补偿模糊神经网络和模糊神经网络的工作原理,以及如何在MATLAB环境下实现和优化它们。这将有助于提升对复杂问题解决的能力,特别是在没有明确数学模型的情况下,如控制系统、图像...

    Java实现文件下载功能

    ### Java实现文件下载功能 ...这种能力对于构建功能丰富的Web应用程序至关重要,尤其是在需要提供文档、图片、视频等多媒体资源下载的情况下。掌握这些技术细节,将有助于开发者更高效地处理与文件相关的业务需求。

    模糊控制的MALTAB系统仿真实验报告.docx

    MATLAB 是一种强大的数值计算和建模工具,提供了模糊逻辑工具箱,使得用户能够方便地设计、分析和实现模糊控制系统。在这个MALTAB系统仿真实验报告中,我们将详细探讨模糊控制的基础概念、MATLAB下的建模过程以及...

    【国赛】【美赛】数学建模相关算法 MATLAB实现(2018年初整理).zip

    MATLAB是一种强大的数值计算软件,尤其适合处理复杂的数学问题和算法实现。 这个资源包含的内容可能涵盖了多个数学建模常用算法的MATLAB实现,例如: 1. **线性规划**:在数学建模中,线性规划常用于优化问题,如...

    MATLAB智能算法30个案例分析-实验源码(完整)

    这些源码提供了直接上手的机会,有助于提升读者的动手能力和问题解决能力,对于从事科研和工程工作的专业人士来说,是一份宝贵的资源。通过深入实践,读者可以将这些算法应用于数据分析、控制系统、图像处理等多个...

    《模糊控制及其Matlab应用》pdf

    总之,《模糊控制及其Matlab应用》通过深入浅出的理论分析和丰富的实例应用,向读者展示了模糊控制技术的原理、设计和实现方法。对于工程技术人员来说,这本书不仅提供了理论知识,还提供了Matlab环境下模糊控制设计...

    JAVA二维码算法实现

    二维码(Quick Response Code)是由日本Denso Wave公司发明的一种二维条码,它能够存储更多的信息,包括文字、数字、URL等,而且纠错能力较强。二维码由许多黑白相间的模块组成,通过特定的编码规则将信息转化为图形...

Global site tag (gtag.js) - Google Analytics