javascript - Facebook Bigpipe,做得对还是不对?

标签 javascript php servlets frameworks

实际上,我正在用 php 创建一个类似于 Java Servlet 模型的框架,但使用 Facebook Big pipeline 类似技术。

为了清楚地看一下这个Servlet(PHP Servlet)

    <?php

      class login_servlet extends Servlet{

          public function doGet($request, $response){ 

              $response->getWriter()->write('hii');   

          }   // __ end of doGet

          public function doPost($request, $response){ }  // end of doPost

      } // __ Servlet


  ?> 

所以当用户输入http://myweb.com/login

这个servlet将被调用,映射将由框架完成,框架会做这样的事情:-

$servlet_name  = genrate_servlet_name('login');

$servlet_boj = new $servlet_name(new Request(), new Response());
$servlet_obj-> init(new ServletConfig());
$servlet_obj-> service();
$servlet_obj-> destroy();

所以我们可以说单个 servlet 类似于 MVC 中的 Controller ,并且根据 doGet 或 doPost 方法将由框架调用,正如我上面使用请求和响应参数所解释的那样,但是 View 分为多个 pagelet,例如:-

正如您在图片中看到的,此页面包含 4 个小页面:-

1 个 header 2 中间偏左部分 3 中右部分(登录部分) 4页脚

所以login_servlet代码看起来像这样:-

<?php

  class login_servlet extends Servlet{

      public function doGet($request, $response){

         $writer = $response->getWriter();

         $pg_strucutre  = new PageletIndexStructure($request, $response);
         $writer->writePagelet($pg_strucutre);

         $pg = new PageletIndexHead($request, $response);
         $writer->writePagelet($pg);

         $pg = new PageletIndexLeft($request, $response);
         $writer->writePagelet($pg);

         $pg = new PageletIndexRight($request, $response);
         $writer->writePagelet($pg);

         $pg = new PageletIndexFooter($request, $response);
         $writer->writePagelet($pg);

      }   // __ end of doGet

      public function doPost($request, $response){  }  // end of doPost

  } // __ Servlet

?>

pagelet 类看起来是这样的,每个 pagelet 都必须扩展:-

<?php

   class Pagelet{

      public $template_name = '';
      public $js = array();
      public $css = array();
      public $output = null;  
      public $container_id = 'root'; // __default is root

      private $request = null;
      private $response = null;

      function __construct($request, $response){

          $this->request = $request;
          $this->response = $response;
          $this->doProcess();

          /* default  */   
      }  //  __ construct 

     public function doProcess(){

         // __ here all code will comes

     } // __doprocess

      public function render(){

         $arr = array(

            'js' => $this->js,
            'css' => $this->css,
            'content' => $this->output,
            'container_id' => $this->container_id,              
            'response_type' => 2
         );            
         return json_encode($arr);

     } // __ end of render 

   } // __ end of class


?>

客户端响应如下所示:-

<!Doctype html>
<html> 

  <head> 
     <script type="text/javascript" src="js/jquery.min.js"> </script> <script type="text/javascript" src="js/require.js" data-main="js/load.js"></script>  <script type="text/javascript" src="js/boot.js"> </script> <link rel="stylesheet"  href="css/nnj.css" /> 
 </head> 

 <body>  

     <div id="__global"> </div> <div style="position : fixed; width : 100%; height : 50px; background-color : black; bottom : 0px; left : 0px;"></div>      
     <iframe id ="__navigate" style=""> </iframe>  

     <script type="text/javascript">  boot.on_arrived({"response_type" : 1});  </script>
     <script type='text/javascript'>  boot.on_arrived({"js":["index_structure"],"css":["index_structure"],"content":"<div id=\"cntr\">     <div id=\"cntr_head\"> </div>      <div>        <div id=\"cntr_left\"> </div>                <div id=\"cntr_right\"> </div>   </div>   <div id=\"cntr_footer\"> </div></div>","container_id":"root","response_type":2}); </script> 
     <!-- <code><div id="cntr">   <div id="cntr_head"> </div>    <div>    <div id="cntr_left"> </div>        <div id="cntr_right"> </div>  </div>  <div id="cntr_footer"> </div></div></code> --> 

     <script type='text/javascript'>  boot.on_arrived({"js":[""],"css":[""],"content":"<b> This is the login page  : Enter your informations </b>","container_id":"cntr_head","response_type":2}); </script> 
     <!-- <code><b> This is the login page : Enter your informations </b></code> --> 

     <script type='text/javascript'>  boot.on_arrived({"js":[""],"css":[""],"content":"<h2>    login and join others</h2>","container_id":"cntr_left","response_type":2}); </script> 
     <!-- <code><h2>  login and join others</h2></code> --> 

     <script type='text/javascript'>  boot.on_arrived({"js":[""],"css":[""],"content":"<form action=\"/login\" method=\"post\">    Email : <input type=\"text\" name=\"email\">    <br>    Pasword : <input type=\"password\" name=\"password\">    <br>    <input type=\"submit\"></from><br><br><a href=\"/register\"> don't have account ? </a>","container_id":"cntr_right","response_type":2}); </script>
     <!-- <code><form action="/login" method="post">  Email : <input type="text" name="email">  <br>  Pasword : <input type="password" name="password">  <br>  <input type="submit"></from><br><br><a href="/register"> don't have account ? </a></code> --> 

     <script type='text/javascript'>  boot.on_arrived({"js":[""],"css":[""],"content":"<div style=\"width : 150px; text-align : left; display : inline-block;\"> About  </div><div style=\"width : 150px; text-align : left; display : inline-block;\"> help  </div><div style=\"width : 150px; text-align : left; display : inline-block;\"> Privacy  </div><div style=\"width : 150px; text-align : left; display : inline-block;\"> Terms and Conditions  </div><div style=\"width : 150px; text-align : left; display : inline-block;\"> Advertise  </div>","container_id":"cntr_footer","response_type":2}); </script> 
     <!-- <code><div style="width : 150px; text-align : left; display : inline-block;"> About </div><div style="width : 150px; text-align : left; display : inline-block;"> help </div><div style="width : 150px; text-align : left; display : inline-block;"> Privacy </div><div style="width : 150px; text-align : left; display : inline-block;"> Terms and Conditions </div><div style="width : 150px; text-align : left; display : inline-block;"> Advertise </div></code> --> <script type="text/javascript">  boot.on_arrived({"response_type" : 3});  </script> 


   </body> 
</html>

所以我的问题是我做得对还是我需要改变一些东西,,?抱歉英语不好:(,提前谢谢

最佳答案

很难回答“我这样做对吗?”这样的问题。您有什么需要具体反馈的吗?尝试问一个非常有针对性的问题。

关于 Bigpipe 的博文:https://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919

由于它不是开源的,我认为您不会找到很多有关内部结构的信息。这里有一个开放的实现:http://www.juhonkoti.net/2010/10/01/open-bigpipe-javascript-implementation 。也许这可以进一步帮助您。

另请参阅Facebook Bigpipe Technique Algorithm .

关于javascript - Facebook Bigpipe,做得对还是不对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29385303/

相关文章:

javascript - Html5 音频在我的 Javascript 代码中只播放一次

javascript - 使用js函数document.appendchild时有没有办法避免浏览器重绘?

php代码来匹配数据库中的列日期并显示客户数据

php - 使用 jQuery 或 Javascript 查找下拉选项值

java - 未在 servlet 上调用 POST 方法 - GWT 项目

spring - 如何在容器级别使遗留 webapp spring 感知 bean Autowiring 到 Servlet 中?

java - 防止对 java servlet 的重复请求

javascript - 我怎样才能让我的页面只刷新一次?

javascript - 将指令与 controllerAs 一起使用

php - Filemtime/cachetime 我哪里出错了?