@mircode
2016-07-12T03:33:44.000000Z
字数 4107
阅读 1112
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-demofisp release -r commonfisp 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>