FIS(Front-end Integrated Solution ),是百度的前端集成解决方案。最近几天在研究前端构建的东西,就顺便了解了下,果断各种高大上,可以到FIS官网围观感受一下。如果对fis还不熟悉的童鞋,可以跑下官网的小demo体验一下。

好了,这篇文章不是fis的科普文,官方文档已经挺详细了。这里主要讲下FIS单文件编译的优化(optimize)环节。

FIS单文件编译-optimize

FIS详细运行原理这里不展开,有兴趣的可以看下官方文档。我们只是简单地看下单文件编译的其中一个环节:optimize(文件优化。从optimize这个单词就大致可以猜到是做什么的,比如js、css、图片文件的压缩等。(下图为FIS官方配图)

FIS optimize原理

那么FIS是如何做到这一点的呢?

其实很简单。拿官网的demo来说,假设我们在运行 fis release 的时候加上 --optimize 参数,那么所有的css、js、图片文件都会被优化(文件压缩)。

FIS的系列插件中,以fis-optimizer 开头的插件都是用来完成文件优化这一任务的,比如 fis-optimizer-uglifiy-js、fis-optimizer-clean-css 等。因为FIS已经默认内置并配置好了 fis-optimizer-uglifiy-js、fis-optimizer-clean-css等插件,所以运行时检测到 --optimizer 参数时,就会调用相应的插件,完成对js、css、图片文件的优化。

fis release -d output --optimize

内窥optimizer插件——以fis-optimizer-uglify-js为例

在前端构建中,js文件的压缩绝对是非常重要的一环。在FIS内置插件中,js文件压缩这个重任是由fis-optimizer-uglify-js来完成的。那么,我们就来看看它的源码,千万不要吓到。

相信各位看官的第一反应跟我差不多,都是大喊一声what the fuck,竟然只有这么几行代码。当然,这里并没有任意贬低的色彩,而是由衷地赞叹,这插件实现得相当精妙(由fis的架构设计决定的)。

/*
* fis
* http://fis.baidu.com/
*/ 'use strict'; var UglifyJS = require('uglify-js'); module.exports = function(content, file, conf){
conf.fromString = true;
return UglifyJS.minify(content, conf).code;
};

站在巨人的肩膀上——自定义js文件压缩插件

小标题起得有点标题党啦,之所以会写这篇文章,是因为想要了解FIS插件的配置、自定义,在官方文档间绕来绕去才找到了一点门路,觉得有必要备忘一下。

FIS默认的js压缩插件用的是fis-optimizer-uglify-js,如果我们想用自己定义的插件,比如 fis-optimizer-test 呢?(请原谅我随便起了个名字)。很简单,首先改下项目配置(fis-conf.js),指定js压缩采用 fis-optimizer-test这个插件。

fis.config.merge({
modules : {
optimizer : {
//js后缀文件会经过fis-optimizer-test插件的压缩优化
js : 'test'
}
}
});

插件指定好了,那这个插件从哪来呢?原谅我又偷懒了,只是在 fis-optimizer-uglify-js插件 的同级目录下,将 fis-optimier-uglify-js 这个目录复制了一遍,然后将index.js的内容改成下面这样子。(项目实战中真有这样的插件就逆天了。。。)

/*
* fis
* http://fis.baidu.com/
*/ 'use strict'; module.exports = function(content, file, conf){
return content+'\nvar nick ="程序猿小卡"';
};

再次运行之前的构建命令

fis release -d output --optimize

看看被压缩后的demo.js,就可以看到区别了。堪称史上最逆天的js代码压缩工具,无任何代码优化功能,还乱插代码。。。

console.log('inline file');

function hello(argument) {
var nick = 'casper';
var age = 26;
}
var nick ="casper"

写在后面

FISd的官方文档算是比较详细,设计细节的描述也不少,所以本文就不打算成体系地从头到尾把FIS的设计原理讲一遍了,仅仅是挑一些小点出来备忘而已。

ps:前文的插图来自FIS的官方wiki,不算盗图吧~~如果涉及盗图还请提醒下~~

fis入门-单文件编译之文件优化(optimize)的更多相关文章

  1. # Clion中编译多个cpp(实现单文件编译)

    Clion中编译多个cpp(实现单文件编译) 在不做任何配置情况下,Clion工程下只能有一个main()函数,新建多个cpp会导致报main()函数重复定义的错误,所以默认情况下无法在一个工程下编译 ...

  2. # codeblocks 使用技巧+伪单文件编译

    codeblocks 使用技巧+伪单文件编译 shift+F2打开和隐藏左侧工作空间 F2 打开和隐藏下面控制台 CTRL+Shift+c 注释,CTRL+Shift+x取消注释 view->p ...

  3. javac编译单文件、多文件引入jar包、-cp解决无法加载主类问题

     引言:很多人用ide集成开发环境用的多了,对dos命令编译多个java文件或引入jar包都变得陌生了,java不同于其他解释语言,如ruby.php 都有require,直接引入即可运行代码,但ja ...

  4. ASP.Net Web Form<一> aspx文件编译及呈现

    对比复习下JSP 1.jsp的本质是Servlet ,会在第一次被访问时会被翻译成一个类文件,从此对这个页面的访问都是由这个类文件执行后进行输出. aspx 本质是IHttpHandler 2.jsp ...

  5. 浅谈独立使用NDK编译库文件(Android)

    阅读前准备 这是一篇相对入门的文章.文中会涉及到少许NDK的知识,但个人认为对初学者来说都相对比较实用,因为都是在平时项目中遇到的(目前自己也是初学者).一些其他高深的技术不再本文探讨范围之内(因为我 ...

  6. C预编译, 预处理, C/C++头文件, 编译控制,

    在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...

  7. 一键编译go文件命令.bat

    一键编译go文件命令.bat    , 请新建 一键编译go文件命令.bat    文件,放到你的xxx.go文件目录下 ( 欢迎加入go语言群: 218160862 , 群内有实践) 点击加入 @e ...

  8. [转]嵌入式SQC文件编译

      Src Url:http://blog.csdn.net/cws1214/article/details/12996351   A.预编译部分  1.预编译DB2篇 1.1 什么是DB2预编译 在 ...

  9. OC方法和文件编译

    OC方法和文件编译 一.OC方法 (一)对象方法 (1)对象方法以-开头如 -(void)xx; (2)对象方法只能又对象来调用 (3)对象方法中可以访问当前对象的成员变量 (4)调用格式   [对象 ...

随机推荐

  1. "System.OutOfMemoryException" exception when you execute a query in SQL Server Management Studio (转自MSDN)

    Symptoms When you use Microsoft SQL Server Management Studio (SSMS) to run an SQL query that returns ...

  2. cdn刷新和对应的浏览器现象

    1.浏览器手动点刷新,会发起网络请求,从cdn判断last-modify时间是否一致,未过期则返回304,如果已经过期则返回200,重新请求 关键在于发起的网络请求中'If-Modified-Sinc ...

  3. Spine Skeleton Animation(2D骨骼动画)

    骨骼动画 首先我们来看到底什么是骨骼动画: 在早期的机器上,渲染本身已经占用了很多CPU资源,因此,对于渲染,往往采取的是一种空间换时间的策略,以避免在模型的渲染中继续加重CPU的负担.帧动画模型在这 ...

  4. 【转】Nginx学习---负载均衡的原理、分类、实现架构,以及使用场景

    [原文]https://www.toutiao.com/i6593604356799463944/ [原文]https://www.toutiao.com/i6592741060194075143/ ...

  5. 拉格朗日插值和牛顿插值 matlab

    1. 已知函数在下列各点的值为   0.2 0.4 0.6 0.8 1.0   0.98 0.92 0.81 0.64 0.38 用插值法对数据进行拟合,要求给出Lagrange插值多项式和Newto ...

  6. 【解决方案】chrome打开新标签页自动打开chrome://newtab并且跳转到谷歌香港

    简述天,昨天开始遇到这个问题,还没有留心,结果今天多次使用chrome的时候,就发现有些不对了..打开chrome的新标签页,结果出现了自动跳转的问题我自动跳转的是下面这个网页:https://www ...

  7. Python返回数组(List)长度的方法

    其实很简单,用len函数: >>> array = [0,1,2,3,4,5]>>> print len(array) 同样,要获取一字符串的长度,也是用这个len ...

  8. win10系统上Python和pycharm的安装及配置

    1.https://www.python.org/downloads/windows/进入官网下载需要的Python安装包(以2.7版本为例) 2.http://www.jetbrains.com/p ...

  9. Redis系列五:redis键管理和redis数据库管理

    一.redis键管理 1 键重命名 rename oldKey newkey //格式rename oldKey newKey //若oldKey之前存在则被覆盖set name james :set ...

  10. BZOJ5018:[SNOI2017]英雄联盟(背包DP)

    Description 正在上大学的小皮球热爱英雄联盟这款游戏,而且打的很菜,被网友们戏称为「小学生」.现在,小皮球终于受不了网友们的嘲讽,决定变强了,他变强的方法就是:买皮肤! 小皮球只会玩N个英雄 ...