從273二手車的M站點初探js模塊化編程

来源:http://www.cnblogs.com/sword-successful/archive/2016/08/28/5816310.html
-Advertisement-
Play Games

前言 這幾天在看273M站點時被他們的頁面交互方式所吸引,他們的首頁是採用三次載入+分頁的方式。也就說分為大分頁和小分頁兩種交互。大分頁就是通過分頁按鈕來操作,小分頁是通過下拉(向下滑動)時非同步載入數據。 273這個M站點是產品推薦我看的。第一眼看這個產品時我就再想他們這個三次載入和翻頁按鈕的方式, ...


前言

      這幾天在看273M站點時被他們的頁面交互方式所吸引,他們的首頁是採用三次載入+分頁的方式。也就說分為大分頁和小分頁兩種交互。大分頁就是通過分頁按鈕來操作,小分頁是通過下拉(向下滑動)時非同步載入數據。

      273這個M站點是產品推薦我看的。第一眼看這個產品時我就再想他們這個三次載入和翻頁按鈕的方式,那麼小分頁的pageIndex是怎麼計算的。所以就順便看了下源碼。 提到看源碼時用到了Chrome瀏覽器的格式化工具(還是朋友推薦我的,不過這個格式化按鈕的確不明顯,不會的話自行百度)。

 

三次載入和分頁思路分析

 

 

 

    1、從頁面最底部的分頁數量來看,只設置了25頁而不是隨著翻頁數量的變化而動態設置,也就是說只能看到最新的25頁數據。再換句話說這裡的分頁數量是固定死的,無法查看歷史數據。

    2、從第一張圖中可以看出,每頁的首屏數據是【同步的方式載入】。

    3、從第三張圖中可以看出,當你第二次下拉和第三次下拉時從右邊的報文中看出,第二次和第三次分別是【非同步刷新】載入數據。在NetWork中看出,非同步載入數據時請求ajax.php?module=getCarSalePost. POST請求。重點就在POST請求的數據上。 第二次請求的POST數據:page:2、filter:/car/、need_bak。

 

非同步記載數據時page是怎麼計算的?

      filter不用說是大分頁每次的頁碼和其他附加條件。need_bak沒搞懂是什麼參數。OK,那看到這裡無非就是搞清楚這個page是怎麼計算的,通常我們都是分頁公式,(pageIndex-1)* pageSize。Skip()、 Take()之類的方法。 一開始我就鑽了個牛角尖,忘了他每頁的【首屏數據是同步方式載入】的,這就計算了好幾次公式都不對。OK。思路通了就開始看他們的源碼。F12. 格式化、下斷點。

      從ajax.php?module=getCarSalePost關鍵字搜索,很容易就找到上面這段代碼。當然我最關心的就是這個方法的第二句代碼:s=3*n-(3-i)。還有就是ajax的success事件中他們用到了history.replaceState({page:999},"","#"+s);  改變地址url而頁面不刷新的。 HTML5 API新增的pushState()和replaceState()。n代表什麼? i又是什麼值呢?

n就是大分頁的頁碼。第二頁那n=2. i的變數在下麵找到定義i=2也就是說他這裡的計算是從小分頁第二頁開始的。 第一頁也就是是首屏是同步的方式記載的。看到這裡基本上這個三次載入和分頁的思路就摸清楚了。     

      分析完這個我又整體看到了下他們的代碼發現用到了define關鍵字。這就又開始瞭解下js模塊化編程。

 

初探js模塊化編程(CommonJs、AMD規範、CMD規範)

      初次接觸js模塊化編程是在學習node.js的過程,require、exports。眾所周知node.js是採用了CommonJs。 

      在接觸CommonJs、AMD、CMD前我們先瞭解下什麼是模塊化、模塊化開發。

      模塊化是指在解決某一個複雜問題或者一系列的雜糅問題時,依照一種分類的思維把問題進行系統性的分解以之處理。模塊化是一種處理複雜系統分解為代碼結構更合理,可維護性更高的可管理的模塊的方式。可以想象一個巨大的系統代碼,被整合優化分割成邏輯性很強的模塊時,對於軟體是一種何等意義的存在。對於軟體行業來說:解耦軟體系統的複雜性,使得不管多麼大的系統,也可以將管理,開發,維護變得“有理可循”。

      還有一些對於模塊化一些專業的定義為:模塊化是軟體系統的屬性,這個系統被分解為一組高內聚,低耦合的模塊。那麼在理想狀態下我們只需要完成自己部分的核心業務邏輯代碼,其他方面的依賴可以通過直接載入被人已經寫好模塊進行使用即可。        首先,既然是模塊化設計,那麼作為一個模塊化系統所必須的能力:         1、定義封裝的模塊。         2、定義新模塊對其他模塊的依賴。         3、可對其他模塊的引入支持。    

AMD和CMD

       node.js中的模塊化編程就是參照CommonJs實現的。在CommonJs中有一個全局方法require()。用於載入模塊。 有了服務端模塊以後,很自然大家就希望在瀏覽器端也有模塊化編程。而且最好兩者能夠相容,在服務端和客戶端都能運行。

      CommonJs規範雖好但卻不適合瀏覽器環境,因為require是同步方式運行,每引用一個lib就必須等待載入完成,也就是說載入時間過程的話瀏覽器就會假死,整個應用會停頓在哪裡。因此,瀏覽器端的模塊不能採用不同的方式記載,只能採用非同步的方式記載,這就是AMD規範誕生的背景。

      AMD(Asynchronous Module Definition)意思就是非同步模塊定義。它採用非同步的方式載入,模塊的載入不影響後面語句的運行。所有依賴這個模塊的語句,都定義在一個回調函數中,等到載入完成之後,這個回調函數才會運行。

     目前採用AMD規範實現的Javascript庫 require.js。

     require.js 主要解決兩個問題:

        1、  多個js可能有依賴關係,被依賴的文件需要早於依賴它的文件載入到瀏覽器

        2、  Js載入的時候瀏覽器會停止渲染頁面,載入文件越多,頁面失去響應時間越長。

      CMD(Common Module Definition),該規範明確了模塊的基本書寫格式和基本交互原則。在CMD規範中,一個文件就是一個模塊,基本定義如下:

define(factory) 。define是一個全局函數用來定義模塊,接受參數factory,factory可以是一個函數,也可以是一個對象或字元串。define({"foo":"bar"})。

 

    AMD和CMD又是什麼區別呢?  AMD是提前執行,CMD是延遲執行。AMD速度快,會浪費資源,預先載入所有的依賴,直到使用的時候才執行。CMD只有真正使用才載入依賴,性能較差,直到使用時才定義依賴。

 

總結

      瞭解了CommonJs、AMD、CMD的基本概念後還需要對其代表的典型框架投入使用,如requirejs、seajs。 主鍵改造項目中純function的現狀和項目迭代因人為差異帶來的成本。

 

參考資料

http://www.cnblogs.com/skylar/p/4065455.html
https://github.com/seajs/seajs/issues/277
https://www.douban.com/note/283566440/
http://blog.chinaunix.net/uid-26672038-id-4112229.html

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 學習過Hibernate框架的伙伴們很容易就能簡單的配置各種映射關係(Hibernate框架的映射關係在我的blogs中也有詳細的講解),但是在Mybatis框架中我們又如何去實現 一對多的關係映射呢? 其實很簡單 首先我們照常先準備前期的環境(具體解釋請 參考初識Mybatis進行增、刪、改、查 ...
  • 學習了Hibernate和Mybatis,但是一直不太清楚他們兩者的區別的聯繫,今天在網上翻了翻,就做了一下總結,希望對大家有幫助! 原文:http://blog.csdn.net/firejuly/article/details/8190229 第一章 Hibernate與MyBatis Hibe ...
  • 在Lua中,我們可以通過table+function來模擬實現類。 而要模擬出類,元表(metatable)和__index元方法是必不可少的。 為一個表設置元表的方法: table = {} metatable = {} setmetatable(table, metatable) 或者 tabl ...
  • 此第一次接觸Mybatis框架確實是有點不適應,特別是剛從Hibernate框架轉轉型過來,那麼為什麼要使用Mybatis框架,Mybatis框架和Hibernate框架又有什麼異同呢? 這個問題在我的另一篇blogs中有專門的講解,今天我主要是帶著大家來探討一下如何簡單的使用Mybatis這個框架 ...
  • 某互聯網公司廣告平臺技術架構 演化 水平擴展一切 並行化,非同步調用 演化 Randy的可擴展架構7原則 • 按功能分區(Partition by Function) • 水平切分 • 避免事務 • 非同步解耦 • 次序流改進為非同步 • 虛擬化所有層次 • 適當使用緩存 原則 • 先業務,後技術;先邏輯... ...
  • 首發於: "https://mingjiezhang.github.io/" 。 在JavaScript中,this對象是運行時基於函數的執行環境(也就是上下文)綁定的。 從react中的demo說起 Facebook最近一次更新react時,將es6中的class加入了組件的創建方式當中。Face ...
  • 一、引用 二、調用示例 1、彈出基本消息框: 2、彈出模態消息框: 3、彈出帶【確定】和【取消】按鈕的模態消息框,並設置寬度位為200px: 4、點擊【取消】按鈕,不讓消息框關閉: 5、在消息框關閉時執行自定義邏輯: 6、讓消息框彈出後在指定時間後自動關閉,此時不會顯示右上角的“x”關閉按鈕,以及【 ...
  • × 目錄 [1]註釋節點 [2]文檔類型 前面的話 把註釋節點和文檔類型節點放在一起是因為IE8-瀏覽器的一個bug。IE8-瀏覽器將標簽名為"!"的元素視作註釋節點,所以文檔聲明也被視作註釋節點。本文將詳細介紹這兩部分的內容 註釋節點 【特征】 註釋在DOM中是通過Comment類型來表示,註釋節 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...