成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Webpack原理與實踐之Webpack究竟解決了什么問題?

開發 前端
Webpack所解決的問題是:如何在前端項目中更高效地管理和維護項目中的每個資源。想要搞明白webpack,就必須先對它想要解決的問題或目標有個充分的認識。

[[440682]]

本文轉載自微信公眾號「前端萬有引力」,作者一川。轉載本文請聯系前端萬有引力公眾號。

寫在前面

Webpack所解決的問題是:如何在前端項目中更高效地管理和維護項目中的每個資源。想要搞明白webpack,就必須先對它想要解決的問題或目標有個充分的認識。

模塊化的演化進程

階段1:文件劃分方式

  1. |--01-files 
  2.   |--module-01.js 
  3.   |--module-02.js 
  4.   |--index.html 
  1. <!-- index.html --> 
  2. <!DOCTYPE html> 
  3. <html lang="en"
  4. <head> 
  5.   <meta charset="UTF-8"
  6.   <meta http-equiv="X-UA-Compatible" content="IE=edge"
  7.   <meta name="viewport" content="width=device-width, initial-scale=1.0"
  8.   <title>Document</title> 
  9. </head> 
  10. <body> 
  11.   <script src="./module-01.js"></script> 
  12.   <script src="./module-02.js"></script> 
  13.   <script> 
  14.     // 直接使用全局成員 
  15.     fun()//可能存在命名沖突 
  16.     console.log(data) 
  17.     data = "onechuan";//數據可能被修改 
  18.   </script> 
  19. </body> 
  20. </html> 
  1. //module-01.js 
  2. function fun(){ 
  3.   console.log("module-01-fun"); 
  1. //module-02.js 
  2. var data = "yichuan"

在這種進行文件劃分方式中,缺點有:

  • 模塊直接在全局工作,大量模塊成員會污染全局作用域
  • 沒有私有空間,所有模塊內的成員都可以在模塊外部被訪問或修改
  • 一旦模塊增多,容易產生命名沖突
  • 無法管理模塊與模塊之間的依賴關系
  • 在維護過程中很難分辨每個成員所屬的模塊

當然,當你項目代碼少的時候可能感受不到這種方式的缺點,但是當你代碼變大的時候,這種劃分方式造成的問題會暴露地淋漓盡致。

階段2:命名空間方式

在命名空間方式中,解決命名沖突的問題外,其它問題依舊存在

  1. <script src="./module-01.js"></script> 
  2.   <script src="./module-02.js"></script> 
  3.   <script> 
  4.     module01.fun();//module-01-fun 
  5.     module02.fun();//module-02-fun 
  6.     // 模塊成員依然可以被修改 
  7.     module01.data = "onechuan" 
  8.     console.log(module01.data);//"onechuan" 
  9.   </script> 
  1. // module-01.js 
  2.  
  3. window.module01 = { 
  4.   fun:function(){ 
  5.     console.log("module-01-fun"); 
  6.   } 
  7.  
  8. // module-02.js 
  9. window.module02 = { 
  10.   data:"yichuan"
  11.   fun:function(){ 
  12.     console.log("module-02-fun"
  13.   } 

階段3:立即執行函數 IIFE

通過在文件中使用立即函數和閉包的方式,可以有效解決前面的全局作用污染的問題,而且可以通過參數明顯表明這個模塊的依賴。雖然解決了全局作用域污染問題,但是不能夠通過代碼控制模塊的加載順序的問題,不便于對模塊的管理,因為你不知道什么模塊沒有被導入,什么模塊被移除。

  1. <script src="./module-01.js"></script> 
  2. <script src="./module-02.js"></script> 
  3. <script> 
  4.   module01.fun();//module-01-fun 
  5.   module02.fun();//module-02-fun 
  6. </script> 
  1. // module-01.js 
  2. ;(function(){ 
  3.   var name = "module-01"
  4.   function fun(){ 
  5.     console.log(name+"-fun"); 
  6.   } 
  7.   window.module01 = { 
  8.     fun:fun 
  9.   } 
  10.  
  11. })() 
  12.  
  13. // module-01.js 
  14. ;(function(){ 
  15.   var name = "module-02"
  16.   function fun(){ 
  17.     console.log(name+"-fun"); 
  18.   } 
  19.   window.module02 = { 
  20.     fun:fun 
  21.   } 
  22.  
  23. })() 

模塊化規范的出現

當前是通過約定規則實現模塊化的方式,不同的開發者在實施過程中會出現一些差別。

模塊化規范的兩點標準:

  • 一個統一的模塊化標準規范
  • 一個可以自動加載模塊的基礎庫

CommonJS規范

CommonJS規范是Node.js中所遵循的模塊規范,該規范約定一個文件就是一個模塊,每個模塊都有單獨的作用域,通過module.exports到處成員,再通過require函數進行導入模塊。

AMD規范

雖然CommonJS規范使用也很方便,但是早期指定前端標準化模塊時,并沒有直接選擇CommonJS規范,而是專門為瀏覽器短重新設計了AMD規范,也就是異步模塊定義規范。

同期推出了Require.js,除了實現AMD模塊化規范,本身也是一個非常強大的模塊加載器。

  1. //AMD規范定義了一個模塊 
  2. //module01.js 
  3. define(["./module02.js"],function(){ 
  4.   return
  5.     fun:function(){ 
  6.       console.log("hello-module-02"); 
  7.     } 
  8.   } 
  9. }) 
  10.  
  11. //AMD規范載入了一個模塊 
  12. //module02.js 
  13. require(["./module01.js"],function(module01){ 
  14.   module01.fun(); 
  15. }) 

在Javascript的標準逐漸走向完善,端模塊化規范的最佳實踐方式也基本得到了統一:

  • 在Node.js環境中,遵循CommonJS規范來實現模塊化
  • 在瀏覽器環境中,遵循ES Modules規范實現模塊化

ES Modules規范是ES2015中才定義的模塊化系統,是最近幾年才制定的標準,存在環境兼容性問題,隨著webpack等一系列打包工具的流行,此規范才逐漸開始被普及。經過幾年的迭代,ES Modules規范已經成為現今最主流的前端模塊化標準。

  1. //module01.js 
  2. export default function fun(){ 
  3.   console.log("hello-module01"); 
  4.  
  5. //module02.js 
  6. import fun from "./module01.js"
  7. fun() 

模塊打包工具的出現

隨著日益復雜的項目開發,在前端應用開發過程中不僅只有JS代碼需要模塊化,HTML和CSS這些資源文件也會面臨需要被模塊化的問題。從宏觀角度看,這些文件也都應該被看做前端應用的一個模塊,只不過這些模塊的種類和用途和JS不同。

我們知道ES Modules近些年才制定的模塊化標準,因此在當前瀏覽器環境可存在兼容問題,因此需要經過模塊打包工具將ES6代碼轉為ES5代碼。

參考文章

《Webpack官方文檔》

《webpack原理與實踐》

寫在最后

前端模塊化的發展過程和最終統一的ES Modules標準使我們深入了解webpack必須掌握的基礎內容,也是現代前端開發者必不可少的基礎知識。

 

責任編輯:武曉燕 來源: 前端萬有引力
相關推薦

2021-12-20 00:03:38

Webpack運行機制

2021-12-16 22:02:28

webpack原理模塊化

2011-11-30 15:28:32

在線協作系統

2019-04-26 13:01:16

ServiceMesh微服務架構

2021-12-24 08:01:44

Webpack優化打包

2017-03-24 10:56:21

Webpack技巧建議

2017-05-02 16:29:11

Webpack技巧建議

2021-12-19 07:21:48

Webpack 前端插件機制

2021-05-11 10:56:07

DevOps開發工具

2021-12-25 22:29:04

WebpackRollup 前端

2021-12-17 00:02:28

Webpack資源加載

2021-12-22 22:44:49

Webpack熱替換模塊

2020-08-05 08:21:41

Webpack

2024-05-27 00:00:01

2009-08-04 17:27:18

Actor模型

2023-11-08 14:03:47

數據可視化數字化轉型

2014-09-28 10:28:59

Docker云計算

2020-06-15 08:06:25

ES數據

2024-09-27 11:46:51

2021-09-06 06:45:06

WebpackMindMasterEntry
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美极品少妇xxxxⅹ免费视频 | 中文字幕在线第一页 | 欧美在线视频网 | 欧美一区二区三区 | 中文字幕在线免费观看 | 成人国产在线观看 | 国产免费人成xvideos视频 | 久久久成人动漫 | 国产在线对白 | 日韩综合| 国内精品视频一区二区三区 | 99久久婷婷国产综合精品电影 | 九九热热九九 | 亚洲一区综合 | 精品一区二区免费视频 | 亚洲高清在线观看 | 国产精品久久久久久久三级 | 久久精品一区 | www.日韩欧美| 中文字幕日韩在线 | 天天噜天天干 | 一级做a爰片性色毛片 | 国产在线观看一区二区 | 国产99免费| 国产精品高潮呻吟久久av野狼 | 99精品电影| 久久精品69 | 欧美一级特黄aaa大片在线观看 | 国产亚韩 | av中文字幕在线 | 天天天天操 | 一级亚洲 | 亚洲欧美第一视频 | 在线观看av中文字幕 | 日韩一区精品 | 三级在线免费 | 中文字幕在线网 | 国产一区| 精品国产一区二区三区性色av | 国产精品久久久久久久久久久久 | 狠狠操av|