模塊化

我那進了"模塊化研究"小組.所以嘞.研究模塊化以及如何讓項目的模塊化更加合理和高效是我們小組的主要目的.

首先,在實行模塊化之前,得先鞏固模塊化開發的理論基礎,因為理論是實踐的基礎。
只有這樣,在過程中理論與實踐相結合,才有可能達到最滿意的效果.

什么是模塊化?

  • 模塊化就是為了減少系統耦合度,提高高內聚,減少資源循環依賴,增強系統框架設計。
  • 讓開發者便于維護,同時也讓邏輯相同的部分可復用
  • 模塊化開發:針對js、css,以功能或業務為單元組織代碼。js方面解決獨立作用域、依賴管理、
    api暴露、按需加載與執行、安全合并等問題,css方面解決依賴管理、組件內部樣式管理等問題。

任何事物都有一個過程,那么模塊化的過程通俗點講就是:

模塊化的過程就是:
  • 1、拆分
    將整個系統按功能,格式,加載順序,繼承關系分割為一個一個單獨的部分.
    注意:拆分的粒度問題,可復用問題,效率問題.如何這些問題處理的不好,就有可能出現不想要的后果。
  • 2、歸納
    將功能或特征相似的部分組合在一起,組成一個資源塊.
  • 3、總結
    將每個資源塊按找需求,功能場景以及目錄約束放到固定的地方以供調用.

模塊的歷程

模塊化的發展也是從草根一步一步走過來的。從最開始到現在成熟方案:

  1. namespace
  2. sass,less
  3. AMD&CMD
  4. html模版
  5. grunt,gulp,webpack
  6. FIS,YUI,KISSY

在亙古年代,機智的人們為了處理javascript的命名沖突,功能塊管理等等,在js中使用了namespace。我們可以說這是最原始的模塊化管理模式。
如下:

// 使用namespace之前
var name={};
var name2={};// 使用namespace之后
var nameSpace={}; nameSpace.branchOne={ name:{} }; nameSpace.branchTwo={ name:{} };

添加命名空間,達到拆分js邏輯的目的。

到了現代,處理css的模塊化的有sass,less等工具。根據其提供的語法,便可以有效將css拆分為不同的塊。
還有隨著AMDCMD的出現,javascrip中namespace機制便已經被淘汰殆盡。不過目前我們的項目組中那部分還沒有遷移過來的老代碼還在默默的使用著這種“古老”的方式。根據模塊加載的工具類庫,實現js邏輯的模塊化加載的方式越來越稱為主流。其中的好處大家可以查一查,不在這里就不贅述咯。
但是,最重要的一點必須要提比namespace更加利于維護和復用
在html中也存在著各種前端和后端的模版。就像php中的smarty(我們現在就在用)。前端中的juicer,underscore等等。它們同樣的也可以將html按功能特點拆分抽離為單獨的html塊。
不過,上面的只是將js,css,html單獨的進行進行模塊化處理,并沒有一個統一的完整的實現功能模塊劃分,而spmwebpack這些工具恰恰做了這些事。它們可以將js,html,css以及其他靜態資源按照開發者的意愿拆分為單獨的模塊,抽離的也更加完整。
上面的工具雖然可以幫助開發者們完成模塊化,但是它們也僅僅只是一個單獨的模塊化工具,并沒有形成一個十分成熟的前端模塊化方案。而fis,yui,kissy這些框架提供了囊括上述全部的功能。可以幫助開發者實現從頭到尾的模塊化。

此外,需要注意的是,前端的模塊化并不應該只專注于某一項(js,css,html)的模塊化,而應該是對項目整體進行解耦,抽離,組裝。從而達到項目整體模塊化的目的。

如何實現?

因為模塊是按功能進行分類的,所以可以先將模塊分為兩類:

  • 公共模塊(用于促進代碼復用)
  • 業務模塊(用于提升可維護性)

目前,我們產品的V3版本的模塊是通過:

  1. 把耦合密集的歸為一個模塊
  2. 模塊間通過固定的接口交互
  3. 模塊內部實現自由發揮

這3個規則來區分和調用的。

主流的模塊化是什么?

什么是主流的模塊化哪?我接下來就用我們項目組用依賴fis的fisp來粗略的說一下fis的模塊化。

1、html的模塊化分割

將偶合度比較高的頁面片段進行單獨拆分,模塊布局作為公開的接口,進行html片段的繼承 復用與拼裝.
每個單獨的html片段使用單獨并且對應的css片段,html中的圖片可以按照相關性放到模塊文件下的一個單獨的圖片文件夾里.
舉個例子:

當我們在打開外鏈頁的時候,右側圈住的那部分就是一個模塊。那么在html中,它的結構是什么哪?
我們有一個base.tpl是一個最外頭的模版,結構如下:

還有一個html的主要框架lqyout.tpl

一個功能模塊share.tpl

最后哪,就到了我們廣告的模塊?personal.tpl

細心的同學可能會發現,這些結構是一層一層的嵌套的。有大到小的分割。由最外頭(base.tpl)->主結構(layout.tpl)->功能結構(share.tpl)->具體廣告模塊(personal.tpl)
這樣哪,就會有效的組織頁面。

html模塊化可以實現多人協同開發頁面.各司其職.有效提高頁面的開發效率,和維護成本. 可以有效減少文件沖突,文件錯誤.
其中,頁面模塊代碼作用域的控制通過css文件來控制。某類具有高度耦合的頁面使用自身的css文件。

2、css的模塊化

根據視覺布局,定義通用的css 以及單個html片段css

3、JS的模塊化

鑒于目前主流的模塊加載器,fis也提供了一個模塊加載器叫mod.js。用法和requirejs,seajs差不多。我們會按照功能將js分割并放到對應的位置。針對于模塊化加載fis有一點做的比較好
為了協調異步環境下模塊開發與性能間的矛盾,我們必須在工程階段就具備依賴分析的能力,把具備依賴關系的資源進行打包。就算不打包,也希望像 F.I.S 那樣有個記錄依賴關系的map.json,可以照單抓藥,一次性地把需要的依賴項加載下來。

因此,在開發期解析模塊依賴、合并代碼、甚至重寫資源路徑都得在工程化的層面完成。工程化和模塊化變成了容易耦合且不得不耦合的兩個話題。

上文提到的基本的原理,真正實施起來還是存在很多問題,模塊粒度問題,公共模塊與普通模塊的區分,繼承模塊是否值得繼承等等,頁面模塊如何劃分。
  • 首先,了解你的項目,通過畫網站樹狀圖了解你網站的總體結構和頁面模塊。
  • 其次,理清結構邏輯和視覺邏輯,結構邏輯就是看你的頁面由那些模塊組成,視覺邏輯了解可繼承模塊,布局邏輯(網格布局或者非網格布局)
目錄結構:

按照相似性 可以將css html js 以及其他的靜態資源放到一個一個文件夾中.當然,因為標準的確實,至于模塊化的文件如何組織就見仁見智了.
我們的目錄是這樣的:

一個單獨的模塊放到一個單獨的文件夾里,這個模塊的css,html,js以及其他靜態資源也都放到一起,便于管理。
結構差不多可以像這樣:

組件化:

組件化開發 :在模塊化基礎上,以頁面小部件(component)為單位將頁面小部件的js、css、html代碼片段放在一起進行開發、維護,組件單元是資源獨立的,
組件在系統內可復用。比如頭部(header)、尾部(footer)、搜索框(searchbar)、導航(menu)、對話框(dialog)等,甚至一些復雜的組件比如下載(download)等。
通常業務會針對組件化的js部分進行必要的封裝,解決一些常見的組件渲染、交互問題。實現高內聚,低耦合.
就拿我們的會員中心來說,整體是一個大的組件。目錄結構如下:

上述的模塊化特點,目前我們百度網盤使用的FIS已經將這些概念全部實現.而且做的還相當不錯.
好了,正經的模塊化介紹就到此結束。接下來,我為大家闡述一種另類的模塊化.

換一種思路的模塊化

就拿上面的百度網盤外鏈的單文件分享來說:
每次有用戶請求,上述的每個html塊都要經過php的smarty引擎在服務器端組合成一個完整的html在返回給瀏覽器端,不僅如此,js、css以及其他靜態資源都是.server端一天要做幾十萬次這種重復的操作。它好累!!!
不過,針對于前端開發者來說,fisp做的已經足夠了。它確實已經實現了完整的模塊化。但是僅僅只是針對開發者而已
有沒有想過,對于瀏覽器來說,這么一個同樣的功能,每次都是重新加載一個內容和結構都差不多的html,如果能在這塊做點什么東西,就像把模塊化的思想用到瀏覽器上。那么,這個缺口是不是大有可為
所以,實現針對于瀏覽器的模塊化可以說是有必要的.從針對于開發者的模塊化轉換到針對瀏覽器的模塊化.這是一個嘗試的革命路線.

轉載于:https://www.cnblogs.com/yebai/p/10129535.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449975.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449975.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449975.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1566:基礎練習 十六進制轉八進制

題目地址&#xff1a;https://acmore.cc/problem/LOCAL/1566 1 #include <iostream>2 #include <string>3 4 using namespace std;5 6 string HexToBin(string s) //16進制轉2進制7 {8 string str "";9 for (int i 0; i < s.size(); i) 10…

利用fastjson對json轉map的操作

String str "{\"0\":\"zhangsan\",\"1\":\"lisi\",\"2\":\"wangwu\",\"3\":\"maliu\"}"; //第一種方式 Map maps (Map)JSON.parse(str); System.out.println("這個是用J…

推薦書籍

五百本編程書籍推薦【信息化類】 書號書名作者出版時間定價對應頁碼TP02041企業資源計劃&#xff08;ERP&#xff09;教程羅鴻2006-1&#xffe5;28.00—TP02031ERP理論、方法與實踐周玉清 等2005-12&#xffe5;39.00—TP01059ERP原理設計實施&#xff08;第3版&#xff09;羅…

Linux diffstat命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Linux diffstat命令根據diff的比較結果&#xff0c;顯示統計數字。 diffstat讀取diff的輸出結果&#xff0c;然后統計各文件的插入&…

java命令--jmap命令使用(查找內存泄漏對象)

轉自&#xff1a;https://www.cnblogs.com/kongzhongqijing/articles/3621163.html jdk安裝后會自帶一些小工具&#xff0c;jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java進程(或核心文件、遠程調試服務器)的共享對象內存映射或堆內存細節。 jmap命令可以獲得運行…

tr069相關協議說明

截圖自easycwmp官網&#xff1a;http://easycwmp.org/轉載于:https://www.cnblogs.com/kiss-passion/p/10362029.html

如何revert一個merged branch上所有的改動

開發過程中如果想刪除之前merged的某個branch&#xff0c;并且在merge過該分支之后又進行了多次的提交&#xff0c;可以通過以下命令進行&#xff1a; git revert -n merge_commit_id -m 1 注&#xff1a;該方法適合merge過分支后&#xff0c;沒有基于該branch內容做修改的情況…

Beta 沖刺(6/7)

隊名 火箭少男100組長博客 林燊大哥作業博客 Beta 沖鴨鴨鴨&#xff01;成員沖刺階段情況 林燊&#xff08;組長&#xff09; 過去兩天完成了哪些任務 協調組內工作最終測試文稿編寫展示GitHub當日代碼/文檔簽入記錄(組內共享)接下來的計劃 協助開發組完成標簽制作展示視頻制作…

Linux find命令、Linux rmdir命令、Linux ls命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Linux find命令用來在指定目錄下查找文件。任何位于參數之前的字符串都將被視為欲查找的目錄名。如果使用該命令時&#xff0c;不設置任…

Android Bluetooth BLE相關開發資源匯總

Android開啟藍牙開關 轉載自Android&#xff1a;Bluetooth 的打開和關閉 檢查系統藍牙是否開啟 BluetoothManager bluetoothManager (BluetoothManager) this. getSystemService(Context.BLUETOOTH_SERVICE); BluetoothAdapter mBluetoothAdapter bluetoothManager.getAdapt…

__invoke,try{}catch(){},microtime(),is_callable()

<?php /*1.對象本身不能直接當函數用&#xff0c;如果被當做函數用&#xff0c;會直接回調__invoke方法* 2.驗證變量的內容能否作為函數調用* 3.try{}catch(Exception $e){}catch(){}finally{}* 4.microtime()函數返回當前時間戳和微妙數* */ class httpException extends …

H.264中的I_PCM模式

H.264中的I_PCM模式 I_PCM是一種幀內編碼模式&#xff0c;在該模式下&#xff0c;編碼器直接傳輸圖像的像素值&#xff0c;而不經過預測和變換。在一些特殊的情況下&#xff0c;特別是圖像內容不規則或者量化參數非常低時&#xff0c;該模式比常規的操作&#xff08;幀內預測…

RxPermissions 源碼解析之舉一反三

[toc] RxPermissions 源碼解析 簡介 RxPermissions 是基于 RxJava 開發的用于幫助 在Android 6.0 中處理運行時權限檢測的框架。在 Android 6.0 中增加了對危險權限的動態申請&#xff0c;而不是像 Android 6.0 之前的默認全部獲取的方式。 原始動態權限的獲取 如果按照以往的獲…

總結Selenium WebDriver中一些鼠標和鍵盤事件的使用

在使用 Selenium WebDriver 做自動化測試的時候&#xff0c;會經常模擬鼠標和鍵盤的一些行為。比如使用鼠標單擊、雙擊、右擊、拖拽等動作&#xff1b;或者鍵盤輸入、快捷鍵使用、組合鍵使用等模擬鍵盤的操作。在 WebDeriver 中&#xff0c;有一個專門的類來負責實現這些測試場…

最快浮點數取絕對值

做視頻算法10多年&#xff0c;經常要算絕對值&#xff0c;整數的絕對值有快速算法&#xff0c;但浮點數的絕對值沒看到有快速算法&#xff0c;經常不段發現&#xff0c;得到如下浮點數的快速算法&#xff1a; 快6倍多&#xff0c; #include <Windows.h> #include <ios…

Linux ln命令、軟鏈接和硬鏈接的區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Linux ln命令是一個非常重要命令&#xff0c;它的功能是為某一個文件在另外一個位置建立一個同步的鏈接。 當我們需要在不同的目錄&…

Android應用開發——文件目錄

Android 存儲位置及 API 一、內部存儲 應用安裝后都會在Android 根目錄生成 /data/data/packagename&#xff0c;當前應用讀取不需要讀寫權限 注意&#xff1a; 有些開發者可能看到過應用的根目錄為 /data/user/0/packagename 的情況&#xff0c;這里解釋一下&#xff0c;And…

git常用命令及沖突解決

2019獨角獸企業重金招聘Python工程師標準>>> git常用命令 git config --global user.name chenhongjiang git config --global user.email 123qq.com git init 建立廠庫 git status 查看狀態 git add . 添加當前目錄 git add a.php 添加文件…

C 語言常見問題集

從 http://c-faq-chn.sourceforge.net/ccfaq/index.html 轉載過來&#xff0c;學習C的好助手。 目錄1. 前言2. 聲明和初始化 2.1 我如何決定使用那種整數類型&#xff1f;2.2 64 位機上的 64 位類型是什么樣的&#xff1f;2.3 怎樣定義和聲明全局變量和函數最好&#xff1f;2.4…

【題解】quake

【題解】\(quake\) 題目大意 我們共有報酬\(f\)元&#xff0c;一條邊有它的價值\(w_i\),有它的建造時間\(t_i\)。要求建一些邊&#xff0c;生成一顆樹。求最大的利潤率。 數據范圍 \(n\le 400\) \(m\le10000\) \(Solution\) 實際上\(n,m\)出到\(\le 100000\)應該也是沒問題的。…