前端工程化思考與實踐(二)

来源:http://www.cnblogs.com/jinyuGu/archive/2017/12/05/7985713.html
-Advertisement-
Play Games

4. 前端工程化開發實踐 由於Nodejs 、npm的環境搭建往上很多,這裡就不過多介紹它們了。 這裡我們將更多介紹FIS3、RequireJS 、r.js。 4.1 模塊化開發: 4.1.1 開發目錄結構 左圖為開發目錄結構, 右圖中新增js 目錄、fis-conf.js文件,js 目錄用來存放r ...


4.         前端工程化開發實踐

由於Nodejs npm的環境搭建往上很多,這裡就不過多介紹它們了

這裡我們將更多介紹FIS3RequireJS r.js

 

4.1    模塊化開發:

4.1.1            開發目錄結構

   

左圖為開發目錄結構,

* 右圖中新增js 目錄、fis-conf.js文件,js 目錄用來存放require.js的頁面級入口文件

4.1.2            HTML文件的模塊化處理

任何頁面都可以拆分為若幹組件,在開發環境下,可以迅速定位組件位置,修改組件

FIS3為我們提供了方便的資源嵌入功能http://fis.baidu.com/fis3/docs/user-dev/inline.html

簡單來說,我們可以如同模板開發一樣去寫HTML頁面,例如:

 

這個首頁頁面本身的樣式和代碼極少,頁面內容都是由” ?__inline”功能從其他頁面引入了,

如:banner.html

 

當文件編譯時,FIS3會自動幫我們把這些地方替換為文件中的HTML代碼:

編譯後的index.html

 

可以看到,FIS3幫我們將banner.html中的代碼完成寫入了index.html

這裡我們完成了簡單的頁面代碼模塊化分離,但是這遠遠還不夠,因為我們的頁面還需要包括CSS文件,JS文件,以及一系列的圖片文件等等。那麼這些東西該這麼完成模塊化分離,然後再打包呢。對於CSS我們就需要用到LESS的,js則需要Requirejs的幫助。

 

 

4.1.3            JS文件的模塊化處理了

這裡我們需要使用到Requirejs,前面提到過,它是AMD模式的一個實現。由於js語言的歷史原因,它在很長一段時間都算不上一個嚴謹的言語,不過經過多年來的不斷努力,人們提出了許多增強它,規範它的方案,這些規範的目的都是為了 JavaScript 的模塊化開發,特別是在瀏覽器端的。目前這些規範的實現都能達成瀏覽器端模塊化開發的目的。

Requirejs 首先需要一個requirejs.config的配置,該配置的目的在於確定文件間的依賴關係,設定各個文件的別名,設定文件的載入順序等等。

 

上面是一個簡單的配置,baseUrl定義了一個相對文件所在目錄的相對路徑,paths設置了相關文件的別名,shim規定文件間的依賴關係,比如baseUI模塊依賴jquery模塊,因此,baseUI需要在jquery載入完後載入。http://www.requirejs.cn/ 詳細配置選項查看這裡。

對於requirejs.config 定義的位置,我嘗試過三種方式:

每個入口文件中都定義一次

統一到config.js中去定義,在載入時優先require這個文件,然後在回調函數裡面在寫頁面的依賴

這樣做到時解決了冗餘的問題,但是require的嵌套顯然不太符合作者的初衷.

統一到config.js中去定義,然後加require.jsconfig.js打包到一起,在引用入口文件前就同步調用了。

這樣做相當於全局定義了require.config並且在頁面中同步調用,一定是會在入口文件前,解決了之前的問題

* 註意require.configshim只用做兩個功能,一個是表明依賴順序關係,一個是載入不符合AMD規範的js文件。不要用作模塊載入。

接下來就是入口文件和模塊文件的編寫,入口文件我認為應該是每個一個,這樣能保證不會載入多餘的文件進來。當然,在特殊情況下,可以不同頁面引用同一個,靈活應用。

對於模塊文件,我推薦的書寫方式如下,在對象中定義方法,並將對象作為介面暴露,提供給其他模塊使用


* 特別提示一點,無論是入口文件,還是模塊文件,只要是需要使用的依賴就要寫到依賴數組中,不要想著a依賴過b,我現在只要寫依賴a那邊b也自動依賴了,這樣是違反requirejs的初衷的。

 

4.1.4            css文件的模塊化處理

目前來說,有兩種方式來對css文件做模塊化處理

利用LESS@import引入模塊

利用FIS3的“聲明依賴”功能引入模塊

 

兩者區別在於@import會在LESS文件編譯階段將引用的LESS文件加入該文件中,而@require是在文件打包階段將各個css文件合併到一起。

 

1.1.5            圖片的處理

FIS3fis-spriter-csssprites插件即可幫助我們生成頁面級別的雪碧圖

 

4.2   自動構建和優化

4.2.1            FIS3 介紹

FIS3 是基於文件對象進行構建的。

FIS3有自己的內置語法,實現了“內容嵌入”,“定位資源”,“聲明依賴”三個功能。

FIS3 編譯的整個流程都是通過配置文件fis-conf.js來控制的。

FIS3 定義了一種類似 CSS 配置方式。固化了構建流程,以期讓工程構建變得簡單。

FIS3 提供了文件指紋的功能,通過分析文件大小,在文件名中添加MD5碼,來解決文件更新時的瀏覽器緩存問題。

以上是我對FIS3一點理解,詳細的教程請移步FIS3網站查看。

FIS3教程http://fis.baidu.com/fis3/docs/beginning/intro.html

* 強烈建議跟著教程走一遍,對FIS3有一點瞭解後再繼續往下看

目前使用到的最重要的幾個功能:

FIS3編譯功能,通過配置文件fis-conf.js我們可以輕鬆的告訴FIS3該如何去處理我們的前端文件,具體語法和使用方法請查看教程

在這個HTML文件中我們引用了一個CSS文件,一個LESS文件,同步引用了html5.jsrequire.js以及config.js,此外我們還通過Requirejs非同步引入了一個模塊名為index_mainjs模塊。

那麼根據上面fis-conf.js中的配置,我們的文件將會構建成什麼樣子呢。

首先,我們的配置命中了當前目錄及其子目錄下的所有.less文件,並且調用了插件fis-parser-less插件將.less文件轉換為.css文件後輸出。

然後我們在文件打包階段調用了fis-postpackager-loader插件,用過allInOne這個配置,將頁面中同步引用的CSS文件、JS文件分別打包。這裡我們同步引用的js文件有html5.jsrequire.js以及config.js

但是仔細看,在我們HTML代碼中有個<!--ignore-->的註釋,這裡就是為了告訴FIS3,打包時請忽略這個文件,因此FIS3打包會跳過html5.js,然後打包require.jsconfig.js。並將其輸出為 libs/require_conf.js文件。(由於html5.js需要dom載入前調用,所以不打包它)

對於CSS文件,我們在html文件中引入了一個reset.css,同時我們通過前面一步編譯出了一個index.css,所以這裡FIS3會把這兩個文件打包,然後輸出到index.html_aio.css

文件中,配置中的${filepath}就代表當前文件路徑

 

FIS3給我們提供了一個本地的簡易Nodejs伺服器,使用命令行 fis3 server start就可以啟動。並且該服務一直存在後臺,不關機/重啟 或者 主動停止服務,該服務不會關閉,另外使用命令行fis3 server open可以打開伺服器所在文件夾,給我們前端開發提供了一個非常方便的伺服器環境。一般來說我們可以通過127.0.0.1:3000來訪問這個本地伺服器。

 

FIS3的有強大的監視自動刷新功能,當你的文件夾下任何文件發生變動時,FIS3會自動刷新頁面並且,重新編譯文件。這個功能需要fis3 release –wL來激活。

 

 

4.2.2            使用r.js

在使用FIS3的過程中,發現非同步的JS文件的打包,FIS3的庫目前支持還不足,所以我決定暫時使用r.js去替代。

當我在用FIS3打包整個項目之前,我會先用r.jsrequirejs的依賴進行打包。如果FIS3一樣,我們需要編寫一個配置文件來告訴他改如何打包,配置文件命名為build.js

 

以上是一個簡單的build.js配置,更多配置可以參考http://www.chenliqiang.cn/node/22

* 前面提到過require.config中最好不要通過shim依賴模塊,這是因為這會造成打包後多次拉取文件,因此全部放在require的依賴數組中處理。

這裡配置完後,我們通過 node r.js –o build.js 進行打包,生成的新文件夾temp-build

 

 

4.2.3            使用FIS3

使用完r.js,我們開始使用FIS3構建整個項目

 

 

在這個配置文件中,我們設定了兩套構建規則,如同CSS語言中的媒體查詢一樣。我們這裡使用media來配置第二套構建規則。

在命令行中輸入fis3 release可以開始執行構建

如果我要執行第二套方案只需要寫為fis3 release temp 即可

 

上圖中的-d命令代表修改輸出目錄到../temptestFIS3構建時還有其他參數可以選擇,具體可以參考FIS3的文檔。

完成構建後我們可以看到,我們頁面的請求數減少了,並且文件都帶上了MD5指紋

           

 

4.2.4            使用過程中遇到的問題

由於我們使用了文件指紋,所以每個文件的文件名中間會插入一個表示文件大小的MD5碼。

比如index.js會變成index_d82af77.js,根據FIS3“定位資源”的規則,構建時FIS3會自動替換掉html中的scriptlinkstylevideoaudioembed等標簽的srchref屬性中的值,但是使用Requirejs時在data-main中的非同步引入的文件和在config.js中配置的路徑就沒有那麼好運了。

解決方法:

u前面有提到全局配置require.config,事先就將data-main中文件路徑用模塊名替代。這樣能解決data-main中路徑無法替換的問題。

u這裡可以使用FIS3提供的資源定位能力,在config.js中使用__uri()函數解決該問題

 

5.    結語

這篇文章寫於去年4月,由於沒有註冊博客園的賬號,因此現在才發佈過來。一年多的時間前端工程領域的變化很大,我們團隊也經歷了FIS、grunt到現在webpack的變化,我也希望通過這篇基礎文章 ,拋磚引玉,讓大牛們更多來分享下你們的前端工程化經驗。

 

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • (註:反編譯不是讓各位開發者去對一個應用破解搞重裝什麼的,主要目的是為了促進開發者學習,借鑒好的代碼,提升自我開發水平。) 2017年12月1日新版本apktool用法: 把要解壓的apk文件放在自己任意一個盤的目錄下,在apk的目錄下,按住shift+滑鼠右鍵打開cmd黑視窗 如下圖:接下來輸入官 ...
  • Android SDK版本號 與 API Level 對應關係如下表: Code name Version API level (no code name) 1.0 API level 1 (no code name) 1.1 API level 2 2008 年9月發佈的Android第一版 Cu ...
  • 最近一直在研究monkey測試。網上資料很多,但都是一個抄一個的。原創的很少 我把檢查app記憶體泄漏的情況梳理一下: 參考資料: Monkey測試策略:https://testerhome.com/topics/597 Android Monkey測試詳細介紹:http://www.jikexuey ...
  • 本章目標 一、掌握基本UI組件中文本和圖像組件的使用 二、掌握基本UI組件中各種按鈕類型組件的使用 一、UI組件介紹 Android的UI組件分為兩大類: 1、佈局組件(ViewGroup)。 --用來定義界面組件之間的位置和關係 2、交互組件(View)。 --用來實現與用戶的交互。 二、文本控制項 ...
  • DOM 是為了操作文檔出現的 API,document 是其的一個對象; BOM 是為了操作瀏覽器出現的 API,window 是其的一個對象。 使用下圖講解: 歸DOM管的: E區:即document 歸BOM管的: A區:瀏覽器的地址欄,書簽欄等 B區:右鍵菜單 C區:document載入時的狀 ...
  • 1. 標準盒模型: 因為 ,所以,同樣寬度的內容因為 和`padding box sizing:border box content_box_width = width` 。 2. 彈性盒模型: 彈性佈局相比傳統的塊佈局要簡潔很多,但是實現原理差別挺大的。首先,要想進行彈性佈局,要設置 ,確定彈性容 ...
  • SVG作為時下比較新穎的技術標準,已經建立了很多基於SVG的前端項目。由於SVG在繪製路徑上非常靈活,我們將很多網頁上的元素使用SVG來繪製而成,有各種人物、小圖標、小動畫等等。今天我們收集了10個非常新奇有趣的SVG繪製動畫,這些動畫大部分都是使用SVG結合一定的CSS3特性實現而成,效果讓人大為 ...
  • 以前遇到一個問題,頁面編碼沒問題,後臺返回的編碼也沒問題,但是ajax返回的json就是不講道理的亂碼,查看過http響應頭信息發現請求編碼與頁面編碼不一致 網上搜了好多方法,包括改編碼,重新建頁面都不行! 最後解決方法: 加上了 contentType: "application/x-www-fo ...
一周排行
    -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# ...