webpack的一些知識

核心

  • webpack 是用來搭建前端工程的
  • 它運行在node環境中,它所做的事情,簡單來說,就是打包
  • 具體來說,就是以某個模塊作為入口,根據入口分析出所有模塊的依賴關系,然后對各種模塊進行合并、壓縮,形成最終的打包結果
  • 在webpack的世界中,一切都是模塊

體驗

按照習慣,所有的模塊均放置在 src 目錄中

  1. 安裝依賴
  2. 編寫多個模塊 隨意模塊,可以是js、圖片、音視頻,以入口模塊為起點,形成依賴關系
  3. 運行npm run build命令,進行打包
  4. 查看打包結果 ,打包結果放置在dist目錄中

不難發現,webpack給我們帶來了以下好處:

  1. 可以大膽的使用任意模塊化標準,無須擔心兼容性問題,因為webpack完成打包后,已經沒有了任何模塊化語句
  2. 可以將一些非 js 代碼也視為模塊,這樣可以對 css 、圖片等資源進行更加細粒度的劃分
  3. 在前端開發中,也可以使用npm。webpack不會運行源代碼,無論是自己寫的模塊還是通過npm安裝的模塊,webpack 一律認為是依賴,最終合并到打包結果中
  4. 非常適合開發單頁應用,單頁應用是前端用戶體驗最好的web應用,所謂單頁應用,是指只有一個html頁面,頁面中沒有任何內容,所有的內容均靠js生成,要優雅的實現單頁應用,最好依托于前端框架,比如vue、react
  • webpack 給我們開發帶來的變化遠不止于此

頁面模版

  • 對于單頁應用而言,只有一個空白的頁面,所有內容都靠 js 代碼創建
  • webpack 會自動生成一個頁面,并且在頁面中會自動加入對 js 和 css 的引用
  • 它生成頁面時,參考的是 public/index.html,其稱之為頁面模版

public目錄

  • webpack 會非常暴力的將 public 目錄中的所有文件(除頁面模板外),復制到打包結果中

開發服務器

  • 如果每次修改完代碼,都要經過 打包-> 運行,太過麻煩了
  • 在開發階段,我們可以運行 npm run serve 命令獲得更好的打包體驗
  • 該命令會讓 webpack 啟動一個開發服務器
  • 在這個階段,webpack并不會形成打包結果文件,而是把打包的內容放到內存中,當我們請求服務器時,服務器從內存中給予我們打包結果
  • 與此同時,當源碼發生變動時,webpack會自動重新打包,同時刷新頁面以訪問到最新的打包結果

文件緩存

  • 除了頁面外,其他的資源在打包完成后,文件名多了一些奇奇怪怪的字符
  • 例如:js/app-22324a23.js
  • 其中,22324a23 這樣的字符稱之為hash,它會隨著模塊內容的變化而變化
  • 源碼內容不變,hash不變;源碼內容變化,hash變化
  • 之所以這樣做,是因為生產環境中,瀏覽器會對除頁面外的靜態資源進行緩存
  • 如果不設置hash值,一旦代碼更新,瀏覽器還會使用之前緩存的結果,無法使用最新的代碼
  • **webpack會在打包時自動處理 hash 值,并不會對我們寫代碼造成任何影響,但作為一個前端開發者,有必要了解一下

資源路徑

  • 除代碼和樣式模塊外,其他模塊被視為資源模塊

  • 值得注意的是,資源模塊在源代碼中的路徑和打包后的路徑是不一樣的,這就導致了我們在編寫代碼的時候,根本無法知曉資源最終的路徑

  • 最常見的例子就是在css中使用背景圖片

  • .container {/* 背景圖使用了源碼中的路徑 */background: url('../assets/1.jpg');
    }
    
  • 這里可以正常工作,因為webpack 可以非常智能的發現這一點,對于css中的路徑,webpack在打包時,會將其自動轉為打包結果的路徑

  • 上面的例子可能被轉換為下面的代碼:

  • .container {background: url(/img/1234aa.jpg);
    }
    
  • 但是我們要通過 js 動態的使用路徑,webpack 是無法識別的

// 打包前
const url = './assets/1.png'; // 路徑無法被轉換
img.src = url;// 打包后
const url = './assets/1.png'; // 錯誤
img.src = url;
  • 正確的做法是,通過模塊化的方式導入資源,并獲取資源路徑
// 打包前
import url from './assets/1.png'; // 打包后,url得到的是打包后的路徑
img.src = url;// 打包后
const url = '/img/1234aa.png'; // 正確
img.src = url;

缺省的文件和后綴名

  • 導入模塊時,所有 js 模塊均可省略 .js ,若導入的模塊文件名為 index.js ,可省略文件名
import './home'; // home.js
import './movie'; // 若movie是一個目錄,則導入的是./movie/index.js

路徑別名

  • 隨著代碼量的增加,不可避免的是形成層級深的目錄
  • webpack 提供了別名供我們快速定位到 ./src 目錄,通常,該別名為@

js 兼容性

  • 當webpack 讀取到 js 代碼時,會自動對其進行兼容性處理
  • 具體的處理方案涉及兩個配置文件
    1. babel.config.js: 配置該文件,可以設置對哪些 js 代碼進行降級處理
    2. .browserslistrc: 配置該文件,可以設置在降級時,要兼容哪些瀏覽器,兼容的范圍越廣,降級產生的代碼就越多,自然打包后的體積就越大

打包壓縮

  • webpack 在打包時,會對所有的 js 和 css 代碼進行壓縮
  • 對于 js ,除了壓縮外,還會對其中的各種名稱進行混淆
  • 混淆的作用一是為了進一步壓縮包體積,二是為了我們的代碼更難被其他人理解利用

源碼地圖

  • source map
  • 打包后的結果是很難閱讀的
  • 如果代碼報錯,我們將難以得知出錯的代碼行
  • 可以發現,打包后都會跟上一個同名的、后綴為 .map 的文件,該文件就保存了原始代碼的內容
  • 這個內容人類是看不懂的,但是瀏覽器可以看懂
  • 代碼報錯時,瀏覽器定位到源碼地圖中的對應代碼,而不是把真實報錯的代碼展示給我們

css工程化

  • webpack 能夠識別所有的樣式代碼,包括 css、 less、sass、stylus
  • 打包時,便會將它們轉換為純正的 css
自動廠商前綴
  • css有很多兼容性問題,解決這些問題最常見的辦法就是加上廠商前綴
  • webpack 會根據 .browserlistrc 中指定的瀏覽器范圍,按需自動加上廠商前綴
css module
  • css 文件多了后,為了保證它們之間沒有沖突的類樣式
  • 靠的是 css module
  • 當樣式文件以 xxx.module.xxx 的方式命名時,webpack 會將該文件當成一個開啟了 css module 的文件
  • 然后文件中的所有類名都將被 hash 化
  • 我們在使用類名時,通過下面的方式得知打包后的類名
import './index.module.less';
dom.classList.add('container'); // ? 最終的類名可不是這個// styles 是一個對象,里面映射了源碼類名和打包類名的關系
import styles from './index.module.less';
dom.classList.add(styles.container); // ? 屬性container中記錄的就是container轉換后的類名

其實webpack 并沒有這么強大

  • 實際上,它就是通過插件(plugin) 和加載器(loader)將這些技術整合在一起
  • .browserslistrc :表達適配的瀏覽器范圍,會被工程化中的其他技術所使用
  • babel.config.js :babel的配置文件,做 js 降級處理
  • postcss.config.js :postcss 的配置文件,做css代碼轉換
  • webpack.config.js :webpack 的配置文件,整合其他工程化技術,以及配置打包細節、開發服務器、路徑別名等

對我們的影響(important)

  1. 學會訪問開發服務器查看效果
  2. 學會動態獲取資源文件路徑(import url from ‘./assets/1.jpg’)
  3. 學會省略文件和后綴名(js文件和index.js文件)
  4. 學會使用別名簡化導入代碼(import ‘@/a/a1’)
  5. 學會使用 css module(index.module.less)

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

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

相關文章

洛谷P1157 組合的輸出

深搜板子加一點點修改&#xff0c;適合初學者體會深搜&#xff0c;具體看代碼 題目鏈接 ACcode #include<bits/stdc.h>using namespace std;int a, b;bitset<50>vis;//剪枝 int d[50];void dfs(int x) {if (x b 1) {for (int i 1;i < b;i)cout << se…

HBM(High Bandwidth Memory)

選擇正確的高帶寬內存 構建高性能芯片的選擇越來越多&#xff0c;但附加內存的選擇卻幾乎沒有變化。為了在汽車、消費和超大規模計算中實現最大性能&#xff0c;選擇取決于一種或多種 DRAM&#xff0c;而最大的權衡是成本與速度。 盡管多年來人們一直在努力用更快、更便宜或更…

Linux:kubernetes(k8s)搭建mater節點(kubeadm,kubectl,kubelet)(2)

安裝k8有多種方式如&#xff1a; minikube kubeadm 二進制安裝 命令行工具 我這里就使用kubeadm進行安裝 環境 3臺centos7 master ip &#xff1a;192.168.113.120 2G運存 2內核 node1 ip &#xff1a;192.168.113.121 2G運存 2內核 node2 ip &#xff1a;192.168.1…

重構與設計模型的完美融合:構建穩定可擴展系統的關鍵步驟

在軟件開發的漫長旅程中&#xff0c;系統的穩定性和可擴展性一直是開發者們追求的目標。為了實現這一目標&#xff0c;重構和設計模型成為了不可或缺的兩個關鍵元素。本文將探討如何通過重構&#xff0c;使系統更穩定、更具可擴展性&#xff0c;并深入研究如何將重構與設計模型…

JavaEE:多線程(3):案例代碼

目錄 案例一&#xff1a;單例模式 餓漢模式 懶漢模式 思考&#xff1a;懶漢模式是否線程安全&#xff1f; 案例二&#xff1a;阻塞隊列 可以實現生產者消費者模型 削峰填谷 接下來我們自己實現一個阻塞隊列 1.先實現一個循環隊列 2. 引入鎖&#xff0c;實現線程安全 …

運用qsort函數進行快排并使用C語言模擬qsort

qsort 函數的使用 首先qsort函數是使用快速排序算法來進行排序的&#xff0c;下面我們打開官網來查看qsort是如何使用的。 這里有四個參數&#xff0c;首先base 是至待排序的數組的首元素的地址&#xff0c;num 是值這個數組的元素個數&#xff0c;size 是指每個元素的大小&am…

Python猜數字小游戲

下面這段代碼是一個簡單的數字猜測游戲&#xff0c;其中計算機已經提前計算出了414 // 23的結果并存儲在變量num中。然后&#xff0c;程序會提示用戶來猜測這個結果。 以下是代碼的主要步驟和功能&#xff1a; 初始化&#xff1a; num 414 // 23&#xff1a;計算414除以23的整…

Linux:各目錄含義

簡介 學習Linux各目錄含義之前&#xff0c;我們首先要了解一下Filesystem Hierarchy Standard&#xff08;文件系統層次結構標準&#xff09;。 FHS FHS&#xff0c;即文件系統層次結構標準&#xff08;Filesystem Hierarchy Standard&#xff09;&#xff0c;是Linux和類Un…

深入了解Redis:配置文件、動態修改和安全設置

Redis 是一個開源的內存中數據結構存儲系統&#xff0c;它可以用作數據庫、緩存和消息中間件。在使用 Redis 時&#xff0c;了解其配置選項是至關重要的。本文將詳細介紹 Redis 的配置文件和常用配置項&#xff0c;并提供一些示例來說明如何設置和修改這些配置。 Redis 配置文…

基于stm32F103的座面聲控臺燈

1.基本內容&#xff1a; 設計一個放置在桌面使用的臺燈&#xff0c;使用220v交流電供電。具備顯示屏能夠實時顯示日期&#xff08;年、月、日和星期&#xff09;&#xff0c;時間&#xff08;小時、分鐘、秒&#xff09;和溫度&#xff08;攝氏度&#xff09;&#xff1b;能夠通…

Python爬取天氣數據及可視化分析!(含源碼)

天氣預報我們每天都會關注&#xff0c;我們可以根據未來的天氣增減衣物、安排出行&#xff0c;每天的氣溫、風速風向、相對濕度、空氣質量等成為關注的焦點。本次使用python中requests和BeautifulSoup庫對中國天氣網當天和未來14天的數據進行爬取&#xff0c;保存為csv文件&…

帆軟下載PDF報錯java.lang.OutOfMemoryError: Java heap space

需求:前端選擇多條數據&#xff0c;點擊下載按鈕&#xff0c;下載帆軟報表的pdf格式。 &#xff08;目前用的是帆軟PDF下載接口&#xff0c;然后java轉成文件流&#xff0c;前端接到后端接口的文件流&#xff0c;使用axios下載blob,再創建下載鏈接&#xff0c;通過link標簽實現…

ArduinoTFTLCD應用

ArduinoTFTLCD應用 ArduinoTFTLCD應用硬件連接軟件導入庫顯示數字、字符顯示漢字方案1方案2 顯示圖片 總結 ArduinoTFTLCD應用 對于手工喜歡DIY的人來說&#xff0c;Arduino驅動的TFTLCD被很多人使用&#xff0c;此處就總結一下&#xff0c;使用的是VScode的PlatformIO插件驅動…

C# API異步方法和返回類型:提升應用程序性能和靈活性

摘要&#xff1a; 異步編程是現代應用程序開發中不可或缺的一部分。在C#中&#xff0c;異步方法允許我們在等待操作完成時繼續執行其他任務&#xff0c;從而提高應用程序的性能和響應性。本文將介紹C# API異步方法的基本概念、原理和實際應用&#xff0c;并詳細討論異步方法的返…

【機器學習】實驗5,AAAI 會議論文聚類分析

本次實驗以AAAI 2014會議論文數據為基礎&#xff0c;要求實現或調用無監督聚類算法&#xff0c;了解聚類方法。 任務介紹 每年國際上召開的大大小小學術會議不計其數&#xff0c;發表了非常多的論文。在計算機領域的一些大型學術會議上&#xff0c;一次就可以發表涉及各個方向…

RNA-Seq 筆記 [4]

***********************該筆記為初學者筆記&#xff0c;僅供個人參考謹慎搬運代碼****************************** samtools 排序壓縮和 featureCounts 生成基因計數表 SAM文件和BAM文件 1.SAM格式&#xff1a;是一種通用的比對格式&#xff0c;用來存儲reads到參考序列的比…

2024最新算法:鳑鲏魚優化算法(Bitterling Fish Optimization,BFO)求解23個基準函數(提供MATLAB代碼)

一、鳑鲏魚優化算法 鳑鲏魚優化算法&#xff08;Bitterling Fish Optimization&#xff0c;BFO&#xff09;由Lida Zareian 等人于2024年提出。鳑鲏魚在交配中&#xff0c;雄性和雌性物種相互接近&#xff0c;然后將精子和卵子釋放到水中&#xff0c;但這種方法有一個很大的缺…

BUUCTF---[極客大挑戰 2019]Upload1

1.題目描述 2.點開鏈接&#xff0c;需要上傳文件&#xff0c;要求是image&#xff0c;上傳文件后綴為jpg的一句話木馬&#xff0c;發現被檢測到了 3.換另一個木馬試試 GIF89a? <script language"php">eval($_REQUEST[1])</script> 發現可以上傳成功 4…

ctf_show筆記篇(web入門---文件包含)

目錄 文件包含 78-79&#xff1a;最基礎的文件包含&#xff0c;使用偽協議&#xff0c;大小寫繞過或者通配符繞過&#xff0c;再或者使用其他方法 ?編輯80-81&#xff1a;可采用日志文件繞過或者大小寫繞過&#xff08;81只能日志文件繞過&#xff09; ####80-86&#xff1…

『周年紀念』- 降生CSDN三周年的碎碎念

『周年紀念』- 降生CSDN三周年的碎碎念 緣起機緣迷茫厚積薄發 一轉眼又過來一年&#xff0c;自己也已經 大四即將畢業。 感覺這一年像是開了加速鍵&#xff0c;仿佛一瞬就又過去了。統計了一下發現自己在過去的這一年就發布了 2篇文章&#xff0c;2022年發布了 117篇&#x…