fis系列-swig自定义标签之widget

Posted by hubcarl on 16-03-19

在做一个很复杂的页面时,我们希望把页面分割成模块, 模块包括所需要的css/js/html/images等, 这样可以做到页面复杂简单化和规范化.这样就要介绍swig 自定义widget标签

widget标签:

用于页面模块分割,把一个复杂的页面分割成多个模块(widget),每个widget包含js/css/images资源, 有了widget 我们就可以知道每个模块依赖的css和js,这样为后续按需加载提供了可能.

一个widget包括 images, css, js, html 等, 它们放在统一文件夹下面, 同时文件夹的名字和css/js/html的文件夹的名字保持一致.保证一致的作用是在进行widget引用时,

同名的css/js会自动加载到页面中, 同时引用文件路径时可以简化写法.

一、 widget目录结构:

- [list-item 目录]
        - [list-item.js js文件]
        - [list-item.css css文件]
        - [list-item.tpl htm模板]

二、 模板类:包含 tpl, 可以选择性的添加 js 和 css 文件,同名的 js 和 css 会被自动加载。

模板类文件,可以在模板中通过 widget 标签引用。如

{# widget "widget/menu/menu.tpl" #}  

三、 js 类:

主要包含 js 文件,放在此目录下的文件一般都会自动被 amd define 包裹,可选择性的添加同名 css 文件,会自动被引用。此类组件,可以在 tpl 或者 js 中通过 require 标签引用。

    {# require "client/views/page/news/index/index.js" #}
    {# script #}
        console.log('>>>>test>>>>>');
        require('client/views/page/news/index/index.js');
    {# endscript #}

四、 纯 css 类:

只是包含 css 文件。比如 compass. 同样也是可以通过 require 标签引用。

五、 页面引入widget:

{# widget "widget/news/index/index.tpl" p1="111" p2="222" p3="333" #}

widget/news/index/index.tpl 内容:

    {# for item in list #}
    <li>
        <div class="point">+</div>
        <div class="card">
            <h2><a href="/detail/" target="_blank"></a></h2>
            <div>
                <ul class="actions">
                    <li>
                        <time class="timeago"></time>
                    </li>
                    <li class="tauthor">
                        <a href="#" target="_blank" class="get">Sky</a>
                    </li>
                    <li><a href="#" class="kblink-8007">+收藏</a></li>
                    <li>
                        <span class="timeago">widget datasource: total:  visitCount:</span>
                    </li>
                    <li>
                        <span class="timeago">widget attr:__</span>
                    </li>
                </ul>
            </div>
        </div>
    </li>
    {# endfor #}
    {# script #}
        require('./index.js');
    {# endscript #}

index.tpl 页面中引入widget, 这里会自动加载index.tpl同名index.css和 index.js. 其中 p1, p2,p3 这些键值对会自动生成swig 局部目标变量, 这样同一widget,可以传递不同的局部变量控制内容显示

六、 widget的高级用法

{# widget “widget/header/header.html” mode=”pipeline” id=”header” #}

采用 bigpipe 方案,允许你在渲染页面的时候,提前将框架输出,后续再把耗时的 pagelet 通过 chunk 方式输出到页面,以加速网页渲染。widget mode属性有以下值:

  • sync 默认就是此模式,直接输出。
  • quicking 此类 widget 在输出时,只会输出个壳子,内容由用户自行决定通过 js,另起请求完成填充,包括静态资源加载。
  • async 此类 widget 在输出时,也只会输出个壳子,但是内容在 body 输出完后,chunk 输出 js 自动填充。widget 将忽略顺序,谁先准备好,谁先输出。
  • pipeline 与 async 基本相同,只是它会严格按顺序输出。

要让 bigpipe 正常运行,需要前端引入 pagelet.js, 另外 pagelet 为 quickling 模式,是不会自动加载的,需要用户主动去调用 pagelet.load 方法,才会加载并渲染