[关闭]
@mircode 2016-07-12T11:33:44.000000Z 字数 4107 阅读 845

FIS-PLUS前端工程构建工具

fis fis-plus


一、序言

fis-plus 是扩展自FIS的前端集成解决方案。其提供 后端框架、前端框架、自动化工具、辅助开发工具等开发套件

FIS-PLUS 是基于 FIS,应用于后端是 PHP,模板是 Smarty 的场景。现在被大多数百度产品使用。

二、快速入门

1、安装

fis-plus 的 自动化 / 辅助开发工具 被发布为一套 npm 包,它对环境的要求是:

FIS-PLUS安装

  1. npm install -g fis-plus

FIS

2、初始化本地环境

从github上,下载示例项目
https://github.com/fex-team/fis-plus-pc-demo

为了前后端开发分离,来并行开发,fis-plus 提供了一套本地环境模拟的工具,安装并初始化它后就能方便的模拟线上环境了。

  1. fisp server init

3、发布

  1. cd pc-demo
  2. fisp release -r common
  3. fisp release -r home

4、预览

  1. fisp server start #启动服务器

运行截图

5、示例解说

自此,一个前端项目已经运行起来了。你可以看一下 pc-demo 的源码,其中包含两个模块。

模块 这个词会贯穿整个文档,以及整个 fis-plus 的使用。为什么会有模块这种东西? 当前端代码很多时,不得不面临分组件,分页面。为了发布迭代方便,不得不把它们分为不同的子系统。比如用户信息、首页、详情页等等。

模块 就是一个子系统,而在 fis 项目中用 namespace 和fis-conf.js来区分。每一个模块会有一个配置文件fis-conf.js,还会取名不同的namespace。这主要是为了区分模块之前的静态资源。

5.1 目录结构说明

继续进入 home 模块,可以看看有几个目录及其文件

  1. ├── fis-conf.js
  2. ├── page
  3. ├── server.conf
  4. ├── static
  5. ├── test
  6. └── widget

说一下这几个目录所代表的意思;

5.2 page如何引入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会被加载。

5.3 加载JS

由于 js 进行了组件化封装,比如通过 require 或者 require.async 函数来执行其中逻辑。

{%script%}
require('/widget/a.js');
{%/script%}
如上,在模板中使用 widget 下的 js,必须放到 {%script%} {%/script%} 之间,用它来代替 js 的内联用法。

5.4 加载css

说完加载 js 的方法,css 如何引入呢?

同名依赖,被依赖
通过smarty的require插件
{%require name="home:widget/a.css"%}

5.5 静态资源id

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

  1. /***********************************
  2. * 一、对项目中涉及到JS和CSS以及图片进行压缩
  3. ***********************************/
  4. fis.match('*.js', {
  5. optimizer: fis.plugin('uglify-js')
  6. });
  7. fis.match('*.css', {
  8. optimizer: fis.plugin('clean-css')
  9. });
  10. fis.match('*.png', {
  11. optimizer: fis.plugin('png-compressor')
  12. });
  13. /***********************************
  14. * 二、对JS和CSS以及图片添加md5指纹验证
  15. ***********************************/
  16. fis.match('*.{js,css,png}', {
  17. useHash: true
  18. });
  19. /***********************************
  20. * 对图片进行合并,来减少请求数量
  21. ***********************************/
  22. // 启用 fis-spriter-csssprites 插件
  23. fis.match('::package', {
  24. spriter: fis.plugin('csssprites')
  25. })
  26. fis.match('*.css', {
  27. useSprite: true
  28. });
  29. fis.config.set('pack', {
  30. '/pkg/lib.js': [
  31. 'js/lib/jquery.js',
  32. 'js/lib/underscore.js'
  33. ],
  34. '/pkg/aio.css': '**.css'
  35. });
  36. fis.config.merge({
  37. roadmap : {
  38. path : [{
  39. reg : '**.js', // 所有JS文件
  40. release : '/static/js$&', // 发布目录
  41. url : '/mm/static/js$&' // 访问路径
  42. },{
  43. reg : '**.css',
  44. release : '/static/css$&',
  45. url : '/pp/static/css$&'
  46. },{
  47. reg : /^\/images\/(.*\.(?:png|gif))/i,
  48. release : '/static/pic/$1',
  49. url : '/oo/static/baidu$&'
  50. }
  51. ]
  52. }
  53. });
  54. // 我们可以通过_inline这个标识符来实现对资源的嵌入
  55. // HTML中嵌入资源
  56. <img title="百度logo" src="images/logo.gif?__inline"/>
  57. <link rel="stylesheet" type="text/css" href="demo.css?__inline">
  58. <script type="text/javascript" src="demo.js?__inline"></script>
  59. <link rel="import" href="demo.html?__inline">
  60. // JavaScript中嵌入资源
  61. __inline('demo.js');
  62. var img = __inline('images/logo.gif');
  63. var css = __inline('a.css');
  64. // CSS中嵌入资源
  65. @import url('demo.css?__inline');
  66. // 我们可以通过添加代码注释的方式依赖声明,最后生成map.json文件
  67. // HTML中依赖声明
  68. <!--
  69. @require demo.js
  70. @require "demo.css"
  71. -->
  72. // JavaScript中依赖声明
  73. /**
  74. * @require demo.css
  75. * @require list.js
  76. */
  77. var $ = require('jquery');
  78. // CSS中依赖声明
  79. /**
  80. * demo.css
  81. * @require reset.css
  82. */
  83. {html her="common:static/lib.js"}
  84. {head}
  85. {title}This is title{/title}
  86. {/head}
  87. {body}
  88. ...some thing
  89. {/body}
  90. {/html}
  91. <!DOCTYPE html>
  92. <html>
  93. <head>
  94. <title>This is title</title>
  95. </head>
  96. <body>
  97. .......
  98. <script>
  99. BigPipe.hooks["__cb_0_1"]=function(){/*some code...*/};
  100. BigPipe.setResourceMap({
  101. "c8ade30":{
  102. "src":"*lib.js的真实发布路径*",
  103. "type":"js",
  104. "deps":[],
  105. "mods":["common:static/lib.js"]
  106. }
  107. });
  108. BigPipe.onPageletArrive({"id":null,"children":null,"deps":{"beforedisplay":["3365e3d"],"load":[]},"hooks":{"load":["__cb_0_1"]}});
  109. </script>
  110. </body>
  111. </html>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注