自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Webpack原理與實(shí)踐之Webpack究竟解決了什么問(wèn)題?

開(kāi)發(fā) 前端
Webpack所解決的問(wèn)題是:如何在前端項(xiàng)目中更高效地管理和維護(hù)項(xiàng)目中的每個(gè)資源。想要搞明白webpack,就必須先對(duì)它想要解決的問(wèn)題或目標(biāo)有個(gè)充分的認(rèn)識(shí)。

[[440682]]

本文轉(zhuǎn)載自微信公眾號(hào)「前端萬(wàn)有引力」,作者一川。轉(zhuǎn)載本文請(qǐng)聯(lián)系前端萬(wàn)有引力公眾號(hào)。

寫(xiě)在前面

Webpack所解決的問(wèn)題是:如何在前端項(xiàng)目中更高效地管理和維護(hù)項(xiàng)目中的每個(gè)資源。想要搞明白webpack,就必須先對(duì)它想要解決的問(wèn)題或目標(biāo)有個(gè)充分的認(rèn)識(shí)。

模塊化的演化進(jìn)程

階段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";//數(shù)據(jù)可能被修改 
  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"

在這種進(jìn)行文件劃分方式中,缺點(diǎn)有:

  • 模塊直接在全局工作,大量模塊成員會(huì)污染全局作用域
  • 沒(méi)有私有空間,所有模塊內(nèi)的成員都可以在模塊外部被訪問(wèn)或修改
  • 一旦模塊增多,容易產(chǎn)生命名沖突
  • 無(wú)法管理模塊與模塊之間的依賴關(guān)系
  • 在維護(hù)過(guò)程中很難分辨每個(gè)成員所屬的模塊

當(dāng)然,當(dāng)你項(xiàng)目代碼少的時(shí)候可能感受不到這種方式的缺點(diǎn),但是當(dāng)你代碼變大的時(shí)候,這種劃分方式造成的問(wèn)題會(huì)暴露地淋漓盡致。

階段2:命名空間方式

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

  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:立即執(zhí)行函數(shù) IIFE

通過(guò)在文件中使用立即函數(shù)和閉包的方式,可以有效解決前面的全局作用污染的問(wèn)題,而且可以通過(guò)參數(shù)明顯表明這個(gè)模塊的依賴。雖然解決了全局作用域污染問(wèn)題,但是不能夠通過(guò)代碼控制模塊的加載順序的問(wèn)題,不便于對(duì)模塊的管理,因?yàn)槟悴恢朗裁茨K沒(méi)有被導(dǎo)入,什么模塊被移除。

  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. })() 

模塊化規(guī)范的出現(xiàn)

當(dāng)前是通過(guò)約定規(guī)則實(shí)現(xiàn)模塊化的方式,不同的開(kāi)發(fā)者在實(shí)施過(guò)程中會(huì)出現(xiàn)一些差別。

模塊化規(guī)范的兩點(diǎn)標(biāo)準(zhǔn):

  • 一個(gè)統(tǒng)一的模塊化標(biāo)準(zhǔn)規(guī)范
  • 一個(gè)可以自動(dòng)加載模塊的基礎(chǔ)庫(kù)

CommonJS規(guī)范

CommonJS規(guī)范是Node.js中所遵循的模塊規(guī)范,該規(guī)范約定一個(gè)文件就是一個(gè)模塊,每個(gè)模塊都有單獨(dú)的作用域,通過(guò)module.exports到處成員,再通過(guò)require函數(shù)進(jìn)行導(dǎo)入模塊。

AMD規(guī)范

雖然CommonJS規(guī)范使用也很方便,但是早期指定前端標(biāo)準(zhǔn)化模塊時(shí),并沒(méi)有直接選擇CommonJS規(guī)范,而是專(zhuān)門(mén)為瀏覽器短重新設(shè)計(jì)了AMD規(guī)范,也就是異步模塊定義規(guī)范。

同期推出了Require.js,除了實(shí)現(xiàn)AMD模塊化規(guī)范,本身也是一個(gè)非常強(qiáng)大的模塊加載器。

  1. //AMD規(guī)范定義了一個(gè)模塊 
  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規(guī)范載入了一個(gè)模塊 
  12. //module02.js 
  13. require(["./module01.js"],function(module01){ 
  14.   module01.fun(); 
  15. }) 

在Javascript的標(biāo)準(zhǔn)逐漸走向完善,端模塊化規(guī)范的最佳實(shí)踐方式也基本得到了統(tǒng)一:

  • 在Node.js環(huán)境中,遵循CommonJS規(guī)范來(lái)實(shí)現(xiàn)模塊化
  • 在瀏覽器環(huán)境中,遵循ES Modules規(guī)范實(shí)現(xiàn)模塊化

ES Modules規(guī)范是ES2015中才定義的模塊化系統(tǒng),是最近幾年才制定的標(biāo)準(zhǔn),存在環(huán)境兼容性問(wèn)題,隨著webpack等一系列打包工具的流行,此規(guī)范才逐漸開(kāi)始被普及。經(jīng)過(guò)幾年的迭代,ES Modules規(guī)范已經(jīng)成為現(xiàn)今最主流的前端模塊化標(biāo)準(zhǔn)。

  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() 

模塊打包工具的出現(xiàn)

隨著日益復(fù)雜的項(xiàng)目開(kāi)發(fā),在前端應(yīng)用開(kāi)發(fā)過(guò)程中不僅只有JS代碼需要模塊化,HTML和CSS這些資源文件也會(huì)面臨需要被模塊化的問(wèn)題。從宏觀角度看,這些文件也都應(yīng)該被看做前端應(yīng)用的一個(gè)模塊,只不過(guò)這些模塊的種類(lèi)和用途和JS不同。

我們知道ES Modules近些年才制定的模塊化標(biāo)準(zhǔn),因此在當(dāng)前瀏覽器環(huán)境可存在兼容問(wèn)題,因此需要經(jīng)過(guò)模塊打包工具將ES6代碼轉(zhuǎn)為ES5代碼。

參考文章

《Webpack官方文檔》

《webpack原理與實(shí)踐》

寫(xiě)在最后

前端模塊化的發(fā)展過(guò)程和最終統(tǒng)一的ES Modules標(biāo)準(zhǔn)使我們深入了解webpack必須掌握的基礎(chǔ)內(nèi)容,也是現(xiàn)代前端開(kāi)發(fā)者必不可少的基礎(chǔ)知識(shí)。

 

責(zé)任編輯:武曉燕 來(lái)源: 前端萬(wàn)有引力
相關(guān)推薦

2021-12-20 00:03:38

Webpack運(yùn)行機(jī)制

2021-12-16 22:02:28

webpack原理模塊化

2021-12-24 08:01:44

Webpack優(yōu)化打包

2011-11-30 15:28:32

在線協(xié)作系統(tǒng)

2019-04-26 13:01:16

ServiceMesh微服務(wù)架構(gòu)

2017-03-24 10:56:21

Webpack技巧建議

2021-12-19 07:21:48

Webpack 前端插件機(jī)制

2017-05-02 16:29:11

Webpack技巧建議

2021-12-17 00:02:28

Webpack資源加載

2021-12-25 22:29:04

WebpackRollup 前端

2020-08-05 08:21:41

Webpack

2021-12-22 22:44:49

Webpack熱替換模塊

2021-05-11 10:56:07

DevOps開(kāi)發(fā)工具

2024-05-27 00:00:01

2009-08-04 17:27:18

Actor模型

2021-09-06 06:45:06

WebpackMindMasterEntry

2021-12-21 14:00:25

WebpackDevServer的開(kāi)發(fā)

2021-05-31 05:36:43

WebpackJavaScript 前端

2021-04-19 10:45:52

Webpack熱更新前端

2024-09-27 11:46:51

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)