@mircode
2016-07-12T11:33:44.000000Z
字数 4107
阅读 845
fis
fis-plus
fis-plus 是扩展自FIS的前端集成解决方案。其提供 后端框架、前端框架、自动化工具、辅助开发工具等开发套件
FIS-PLUS 是基于 FIS,应用于后端是 PHP,模板是 Smarty 的场景。现在被大多数百度产品使用。
fis-plus 的 自动化 / 辅助开发工具 被发布为一套 npm 包,它对环境的要求是:
FIS-PLUS安装
npm install -g fis-plus
从github上,下载示例项目
https://github.com/fex-team/fis-plus-pc-demo
为了前后端开发分离,来并行开发,fis-plus 提供了一套本地环境模拟的工具,安装并初始化它后就能方便的模拟线上环境了。
fisp server init
cd pc-demo
fisp release -r common
fisp release -r home
fisp server start #启动服务器
自此,一个前端项目已经运行起来了。你可以看一下 pc-demo 的源码,其中包含两个模块。
模块 这个词会贯穿整个文档,以及整个 fis-plus 的使用。为什么会有模块这种东西? 当前端代码很多时,不得不面临分组件,分页面。为了发布迭代方便,不得不把它们分为不同的子系统。比如用户信息、首页、详情页等等。
模块 就是一个子系统,而在 fis 项目中用 namespace 和fis-conf.js来区分。每一个模块会有一个配置文件fis-conf.js,还会取名不同的namespace。这主要是为了区分模块之前的静态资源。
继续进入 home 模块,可以看看有几个目录及其文件
├── fis-conf.js
├── page
├── server.conf
├── static
├── test
└── widget
说一下这几个目录所代表的意思;
如示例中 index.tpl 如何应用 widget/header/header.tpl ? 如果用过 smarty 的你可能会想到include,但在 FIS-PLUS 中引入 widget 有个跟include 类似的插件完成,widget。
{%widget name="home:widget/header/header.tpl"%}
home:widget/header/header.tpl 这个是 FIS 中 静态资源 id
模板中如何使用 widget 目录下的静态资源
根据目录规范 widget 目录下的 js 讲被进行 组件化封装 ,根据 同名依赖 原则;
当使用某个widget下模板是,同名js,css将会被加载。
当使用某个widget下的js时,其同名css会被加载。
由于 js 进行了组件化封装,比如通过 require 或者 require.async 函数来执行其中逻辑。
{%script%}
require('/widget/a.js');
{%/script%}
如上,在模板中使用 widget 下的 js,必须放到 {%script%} {%/script%} 之间,用它来代替 js 的内联用法。
说完加载 js 的方法,css 如何引入呢?
同名依赖,被依赖
通过smarty的require插件
{%require name="home:widget/a.css"%}
fis-plus 必须要指定模块的namespace,所以静态资源id被标记为
namespace:<资源相对于模块根目录的路径>
比如:
home/static/a.js home目录为模块跟目录,home为namespace,则静态资源id就为 home:static/a.js
namespace可以为任意值,可以不跟模块根目录相同。
静态资源 id 在那些情况下使用,那些情况下必须用静态资源 id?
使用widget、require、html等smarty插件时,必须指定资源的id
require、require.async等JavaScript函数,可以使用id
/***********************************
* 一、对项目中涉及到JS和CSS以及图片进行压缩
***********************************/
fis.match('*.js', {
optimizer: fis.plugin('uglify-js')
});
fis.match('*.css', {
optimizer: fis.plugin('clean-css')
});
fis.match('*.png', {
optimizer: fis.plugin('png-compressor')
});
/***********************************
* 二、对JS和CSS以及图片添加md5指纹验证
***********************************/
fis.match('*.{js,css,png}', {
useHash: true
});
/***********************************
* 对图片进行合并,来减少请求数量
***********************************/
// 启用 fis-spriter-csssprites 插件
fis.match('::package', {
spriter: fis.plugin('csssprites')
})
fis.match('*.css', {
useSprite: true
});
fis.config.set('pack', {
'/pkg/lib.js': [
'js/lib/jquery.js',
'js/lib/underscore.js'
],
'/pkg/aio.css': '**.css'
});
fis.config.merge({
roadmap : {
path : [{
reg : '**.js', // 所有JS文件
release : '/static/js$&', // 发布目录
url : '/mm/static/js$&' // 访问路径
},{
reg : '**.css',
release : '/static/css$&',
url : '/pp/static/css$&'
},{
reg : /^\/images\/(.*\.(?:png|gif))/i,
release : '/static/pic/$1',
url : '/oo/static/baidu$&'
}
]
}
});
// 我们可以通过_inline这个标识符来实现对资源的嵌入
// HTML中嵌入资源
<img title="百度logo" src="images/logo.gif?__inline"/>
<link rel="stylesheet" type="text/css" href="demo.css?__inline">
<script type="text/javascript" src="demo.js?__inline"></script>
<link rel="import" href="demo.html?__inline">
// JavaScript中嵌入资源
__inline('demo.js');
var img = __inline('images/logo.gif');
var css = __inline('a.css');
// CSS中嵌入资源
@import url('demo.css?__inline');
// 我们可以通过添加代码注释的方式依赖声明,最后生成map.json文件
// HTML中依赖声明
<!--
@require demo.js
@require "demo.css"
-->
// JavaScript中依赖声明
/**
* @require demo.css
* @require list.js
*/
或
var $ = require('jquery');
// CSS中依赖声明
/**
* demo.css
* @require reset.css
*/
{html her="common:static/lib.js"}
{head}
{title}This is title{/title}
{/head}
{body}
...some thing
{/body}
{/html}
<!DOCTYPE html>
<html>
<head>
<title>This is title</title>
</head>
<body>
.......
<script>
BigPipe.hooks["__cb_0_1"]=function(){/*some code...*/};
BigPipe.setResourceMap({
"c8ade30":{
"src":"*lib.js的真实发布路径*",
"type":"js",
"deps":[],
"mods":["common:static/lib.js"]
}
});
BigPipe.onPageletArrive({"id":null,"children":null,"deps":{"beforedisplay":["3365e3d"],"load":[]},"hooks":{"load":["__cb_0_1"]}});
</script>
</body>
</html>