當前觀點:前端工程化
2023-03-18 12:13:15 來源:嗶哩嗶哩
1
聽新聞

編譯

工程化是一個編譯和打包的過程。

首先,什么是編譯?


(資料圖)

舉個例子,當我們需要執(zhí)行一個java文件。

在前端工程化以前,作為一門解釋型語言,JavaScript是不需要像Java這樣經過編譯這個過程,它可以在瀏覽器中直接運行。

那么,為什么現(xiàn)在不這么做了?

瀏覽器兼容性問題

開發(fā)人員編寫的不再是純粹的JavaScript

解釋第一點:

事實上,JS的版本每年都在升級,tc39每年都會收集意見稿對JS標準做出一些改動,增加一些特性,刪除一些特性,其中最著名的版本就是ES2015(ES6)。

但JS的迭代跟Java的迭代不同,這個過程并不由開發(fā)者決定。

在Java中,只要開發(fā)者不主動升級JDK,那么Java新版本的改動就不會影響到開發(fā)者的代碼,代碼的運行結果也始終不會脫離期望。

但在JS中,這個過程由瀏覽器廠商和用戶決定,開發(fā)者并不能知道自己的代碼會被作為什么版本的JS來執(zhí)行。

假如,開發(fā)者為了方便開發(fā),在自己的代碼中使用了ES2022的新特性,但用戶使用的是廠商在2020年發(fā)布的瀏覽器,那么,你費盡心血編寫的代碼,將不能得到所期望的結果。

而且,瀏覽器廠家并不是只有Google,瀏覽器內核也并不是只有blink,不同內核,甚至相同內核不同版本的瀏覽器對JavaScript的執(zhí)行能力也不一致。

我們需要一個工具,來將兼容性不那么良好的高版本JS,編譯成兼容性相對更加優(yōu)秀的低版本JS。

這樣的話,即可以在開發(fā)中使用新特性來簡化開發(fā),也能確保在低版本瀏覽器中能夠被正確地執(zhí)行。

它就是babel。

解釋第二點:

所有的網頁歸根結底由HTML(結構)、CSS(樣式)、JS(交互)組成。

但直接編寫上述三種文件來滿足現(xiàn)代網頁的開發(fā)需求是難以實現(xiàn)的,主要問題在于:

現(xiàn)代網頁結構異常復雜,動則成千上萬個dom,難以拆分

樣式表命名空間復雜,權限比重不清

操作dom的api并不是那么易于使用,且弱類型的JS難以維護

為了解決上述問題才有了React、Vue、Angluar、Svelet、Solid等前端框架。而這些框架為了解決上述問題提出了自己的代碼格式:react的jsx、vue的sfc,它們是JS又不是JS。

為了解決JS弱類型難以維護的問題,Microsoft提出了TypeScript,同樣的,.ts是JS又不是JS。

目錄結構

為了在不同框架下保持統(tǒng)一,前端項目在目錄結構上有一些不成文的約定

根目錄下:

public目錄,這個目錄中的文件會保持原樣輸出到打包好的代碼中

dist目錄,打包好的代碼默認輸出到這個目錄出,若不存在則構建工具會自動生成它

src目錄,所有源代碼(除index.html外),都應該存放在此目錄中

src目錄下:

assets目錄,存放圖片、字體、樣式表等網頁需要引用的靜態(tài)資源。注意,資源雖然是靜態(tài)的,但仍會在打包過程中被編譯,構建工具會使用一段hash重命名這些資源,資源的路徑也會被改變。

api目錄,存放發(fā)送網絡請求相關代碼,比如封裝axios,react-query部分的代碼。

components目錄:存放公共組件,多次被引用才算公共組件,只被一個位置引用的組件不應該出現(xiàn)在這里

hooks目錄:存放公共hook。注意,hook對項目框架是有依賴的,并不能跨平臺使用。

pages目錄:存放網頁代碼,每個網頁都應該是一個目錄。

routes目錄:存放路由表,及路由配置代碼。

stores目錄:存放全局狀態(tài)機,比如pinia、redux相關代碼。

types目錄:存放.d.ts聲明文件。

utils目錄:存放公共函數(shù),不同于公共hook。公共函數(shù)不對框架有依賴,這部分代碼應當是跨平臺的。

入口文件:整個應用程序的入口文件

根組件:框架的根節(jié)點

路徑別名

在引入一個自定義模塊,或是使用靜態(tài)資源文件的時候,都會需要使用到路徑。

引用資源時,相對路徑不應當被濫用。如下:

使用路徑別名,改變上面這種丑陋的引用方式。

有些構建工具默認配置了上述約定,而有些則需要手動配置。

配置路徑別名(vite舉例)

打包

正如前面提到的,所有的網頁最終給到用戶的一定是HTML、CSS、JS。

構建工具會將我們編寫好的.ts、.tsx、.jsx、.vue、.scss、.less等文件編譯成.js和.css。

需要注意:

有些打包工具會將有引用關系的模塊直接編譯為單個.js。這往往會造成編譯出的.js過大,從而影響用戶打開網頁的速度。

對于體積較大的npm包,最好在打包時進行分包。

必要時可以打包生成gzip,用以提高網頁的加載速度。(需要nginx開啟支持)

標簽:

責編:

精彩推送


湖南省| 册亨县| 台前县| 绿春县| 弥勒县| 乡城县| 东城区| 土默特左旗| 砀山县| 庄浪县| 吉首市| 白河县| 马龙县| 安顺市| 确山县| 浦江县| 房山区| 兴义市| 宣城市| 石楼县| 山丹县| 瑞金市| 景宁| 马尔康县| 阳曲县| 阿城市| 丹凤县| 长白| 吉木萨尔县| 永济市| 裕民县| 汕头市| 新竹县| 福泉市| 安庆市| 交口县| 民丰县| 开江县| 彰化县| 遂平县| 延川县|