tailor 官方demo 中提供了一个multi fragment 的demo,这个比较简单,就是使用不同的
后端server 做为fragment ,然后使用 html tag 进行加载就可以了。

multi fragment 说明

  • 调用格式
 
        <h2>Fragment 1:</h2>
        <fragment src="http://localhost:8081" primary id="custom-id"></fragment>
        <h2>Fragment 2:</h2>
        <fragment async src="http://localhost:8082"></fragment>
        <div>All done!</div>
  • 后端服务
    就是一个简单的node http server,格式如下:
 
const fragment1 = http.createServer(
    serveFragment('fragment1', 'http://localhost:8081')
);
fragment1.listen(8081);
 
 
  • fragment 创建说明
    fragment2 使用了异步处理,fragment3 使用基础模版同时设置了超时处理
 
'use strict';
const url = require('url');
const jsHeaders = {
    'Content-Type': 'application/javascript',
    'Access-Control-Allow-Origin': '*'
};
const defineFn = (module, fragmentName) => {
    return `define (['${module}'], function (module) {
        return function initFragment (element) {
            element.className += ' fragment-${fragmentName}-${module}';
            element.innerHTML += ' ' + module;
        }
    })`;
};
const defineFnPromise = (module, fragmentName) => {
    return `define (['${module}'], function (module) {
        return function initFragment (element) {
            // Lazy rendering on fragment
            return new Promise((res, rej) => {
                setTimeout(() => {
                    element.className += ' fragment-${fragmentName}-${module}';
                    element.innerHTML += ' ' + module;
                    return res();
                }, 200)
            })
        }
    })`;
};
module.exports = (fragmentName, fragmentUrl, modules = 1, delay = false) => (
    request,
    response
) => {
    const pathname = url.parse(request.url).pathname;
    switch (pathname) {
        case '/module-1.js':
            if (delay) {
                return setTimeout(() => {
                    response.writeHead(200, jsHeaders);
                    response.end(defineFn('js1', fragmentName));
                }, 500);
            } else {
                response.writeHead(200, jsHeaders);
                response.end(defineFn('js1', fragmentName));
            }
            break;
        case '/module-2.js':
            response.writeHead(200, jsHeaders);
            response.end(defineFnPromise('js2', fragmentName));
            break;
        case '/module-3.js':
            response.writeHead(200, jsHeaders);
            response.end(defineFn('js3', fragmentName));
            break;
        case '/fragment.css':
            // serve fragment's CSS
            response.writeHead(200, { 'Content-Type': 'text/css' });
            response.end(`
                .fragment-${fragmentName} {
                    padding: 30px;
                    margin: 10px;
                    text-align: center;
                }
                .fragment-${fragmentName}-js1 {
                    
                }
                .fragment-${fragmentName}-js2 {
                    color: blue;
                }
                .fragment-${fragmentName}-js3 {
                    text-decoration: underline
                }
            `);
            break;
        default:
            const moduleLinks = [];
           //  默认的处理,为了提供css 以及js 处理,tailor 会使用loadcss 加载css资源
            for (var i = 0; i < modules; i++) {
                moduleLinks[i] = `<${fragmentUrl}/module-${i +
                    1}.js>; rel="fragment-script"`;
            }
            // serve fragment's body
            response.writeHead(200, {
                Link: `<${fragmentUrl}/fragment.css>; rel="stylesheet",${moduleLinks.join(
                    ','
                )}`,
                'Content-Type': 'text/html'
            });
            response.end(`
                <div class="fragment-${fragmentName}">
                    Fragment ${fragmentName}
                </div>
            `);
    }
};
 
 
  • js fragment 定义说明
    就是一个amd 个格式的js,demo 使用了一个 requirejs 兼容的包iamdee 替换amd 加载处理
    格式如下:
    以下的调用了其他模块,其他模块的定义在模版文件中,js fragment 如下:
 
const defineFn = (module, fragmentName) => {
    return `define (['${module}'], function (module) {
        return function initFragment (element) {
            element.className += ' fragment-${fragmentName}-${module}';
            element.innerHTML += ' ' + module;
        }
    })`;
};
 
 

异步格式

const defineFnPromise = (module, fragmentName) => {
    return `define (['${module}'], function (module) {
        return function initFragment (element) {
            // Lazy rendering on fragment
            return new Promise((res, rej) => {
                setTimeout(() => {
                    element.className += ' fragment-${fragmentName}-${module}';
                    element.innerHTML += ' ' + module;
                    return res();
                }, 200)
            })
        }
    })`;
};
 
 

amd 模块定义
base-template.html

 
        define('js1', function () {
            return 'js1';
        });
        define('js2', function () {
            return 'js2';
        });
 
 

模版的使用

demo 使用了基础模版,通过slot 进行占位符处理,demo 主要是处理fragment3

  • 模版使用
<body>
+     <slot name="body-start"></slot>
fragment3 模版文件:
+ <title slot="head">Test Page</title>
+ <h2 slot="body-start">Fragment 3</h2>
+ <fragment slot="body-start" src="http://localhost:8083" timeout="1000"></fragment>
 
 
  • fetchTemplate 处理
    在tailor 初始化处理的时候
 
const tailor = new Tailor({
    amdLoaderUrl: AMD_LOADER,
    maxAssetLinks: 2,
+ fetchTemplate: fetchTemplateFs(
        path.join(__dirname, 'templates'),
        baseTemplateFn
    )
});
 
 

运行效果

说明

multi fragment &&custom amd 这个demo 是一个比较全的使用tailor 的例子,好多方便的功能我们都能看到

参考资料

https://www.npmjs.com/package/iamdee
https://github.com/zalando/tailor
https://github.com/zalando/tailor/tree/master/examples/multiple-fragments-with-custom-amd

tailor multi fragment && cutom-amd script demo 说明的更多相关文章

  1. linux sheel script demo

    demo1 (输入/输出) 1.1. target : 输入姓.名, 输出姓名 1.2. create directory mkdir ~/bin 1.3. create & edit she ...

  2. MySQL5.7: sql script demo

    -- MyISAM Foreign Keys显示不了外键,MyISAM此为5.0 以下版本使用 InnoDB 为5.0以上版本使用 drop table IF EXISTS city; CREATE ...

  3. SQLite: sql script demo

    如果有成熟的架构,如何根据数据库关系的表.视图等,进行代码生成架构?减少写代码的时间? -- 考虑主键外键 -- create database geovindu; use geovindu; --2 ...

  4. Android android-common 常用功能和工具集合

    本文内容 环境 android-common 项目结构 演示 android-common 参考资料 android-common 主要包括如下内容: 缓存,包括图片缓存.预取缓存.网络缓存. 公共 ...

  5. 使用tailor 轻松方便的集成web 框架react&&vue

    tailor 是一款很方便的layout 服务,类似facebook 的bigpipe,我们可以使用此工具 方便的集成各类web 框架,实现micro-fronteds 开发 参考demo https ...

  6. Android的Fragment的第一种声明方式

    Android的Frangment的第一种声明方式 实际效果图如下: 项目结构图如下: fragment1: package com.demo.fragementfirst; import andro ...

  7. Fragment管理工具类

    Fragment相关→FragmentUtils.java→Demo addFragment : 新增fragment removeFragment : 移除fragment replaceFragm ...

  8. ViewPager+fragment的使用

    如图我在一个继承FragmentActivity的类中嵌套了3个fragment分别能实现3个不同的界面,默认展现第一个,在第一个的fragment中有个ViewPager在ViewPager中嵌套了 ...

  9. AMD包下载及使用

    AMD下载 下载地址 选择837.zip下载即可,将837.zib考入相应的文件夹下,并解压缩 wget http://netlib.org/toms/837.zip unzip 837.zip cd ...

随机推荐

  1. linux 系统监控、诊断工具之 lsof 用法简介

    1.lsof 简介 lsof 是 Linux 下的一个非常实用的系统级的监控.诊断工具. 它的意思是 List Open Files,很容易你就记住了它是 "ls + of"的组合 ...

  2. C++输出数组名

    1.如果C++输出的数组是char类型的,那么输出的就是数组中的元素. 2.如果使用的是其他类型的数组作为输出的话,那么就是一个16进制的地址. 3.还是那句话,对数组的操作,很多时候都是指针的操作, ...

  3. C++基础知识:类的静态成员

    1.普通成员变量通过对象名能够访问public成员变量每个对象都可以有只属于自己的成员变量成员变量不能在对象之间共享 2.从命名空间的角度:类的静态成员只是类这个命名空间中的全局变量和全局函数不同之处 ...

  4. Linux alias别名命令

    首先介绍一下命令的别名,怎么查看的呢? 咱们使用which命令就可以查看的到它完整的命令是怎样的 [root@master ~]# which ls alias ls='ls --color=auto ...

  5. SUSE_LINUX 11 SP3 安装 IBM MQ 7.5

    0.环境介绍 mq7.5 suse linux 11 1. 上传安装包 上传安装包到 softWare/CI79IML.tar.gz 2. 安装证书 sh ./mqlicense.sh 输入 1 同意 ...

  6. normalization 阅读笔记

    https://zhuanlan.zhihu.com/p/33173246 阅读笔记 1. normalization whiting - PCA 2. Internal Covariate Shif ...

  7. L319 Zigbee test coding- field test fail-base on EFR32MG1

    1 Test coding Zigbee  test of Tx power and frequency for every channel. Testing Procedure1) Power up ...

  8. winform 与百度搜索智能提示

    private void textBox1_TextChanged(object sender, EventArgs e) { listBox1.Items.Clear(); if (string.I ...

  9. python检测网络延迟

    #!/usr/bin/env python # coding: utf-8 # coding: cp950 ''' Create Date: 2012-11-06 Version: 1.0 Descr ...

  10. php操作redis(转)

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis支持的数据类型有 Stirng(字符串), Lis ...