日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳解JavaScript中的模塊、Import和Export

 在互聯(lián)網(wǎng)的洪荒時(shí)代,網(wǎng)站主要用 HTML和 CSS 開發(fā)的。如果將 JavaScript 加載到頁面中,通常是以小片段的形式提供效果和交互,一般會(huì)把所有的 JavaScript 代碼全都寫在一個(gè)文件中,并加載到一個(gè) script 標(biāo)簽中。盡管可以把 JavaScript 拆分為多個(gè)文件,但是所有的變量和函數(shù)仍然會(huì)被添加到全局作用域中。

但是后來 JavaScript 在瀏覽器中發(fā)揮著重要的作用,迫切需要使用第三方代碼來完成常見任務(wù),并且需要把代碼分解為模塊化的文件,避免污染全局命名空間。

ECMAScript 2015 規(guī)范在 JavaScript 語言中引入了 module,也有了 import 和 export 語句。在本文中,我們一起來學(xué)習(xí) JavaScript 模塊,以及怎樣用 import 和 export 來組織代碼。

模塊化編程

在 JavaScript 中出現(xiàn)模塊的概念之前,當(dāng)我們想要把自己的代碼組織為多個(gè)塊時(shí),一般會(huì)創(chuàng)建多個(gè)文件,并且將它們鏈接為單獨(dú)的腳本。下面先舉例說明,首先創(chuàng)建一個(gè) index.html 文件和兩個(gè)JavaScript文件“ functions.js 和 script.js。

index.html 文件用來顯示兩個(gè)數(shù)字的和、差、乘積和商,并鏈接到 script 標(biāo)簽中的兩個(gè) JavaScript 文件。打開 index.html 并添加以下代碼:

index.html

 

 
 
 
 
  1.  
  2.  
  3.    
  4.      
  5.      
  6.  
  7.     JavaScript Modules 
  8.    
  9.  
  10.    
  11.     

    Answers

     
  12.     

     and 

     
  13.  
  14.     

    Addition

     
  15.     

     
  16.  
  17.     

    Subtraction

     
  18.     

     
  19.  
  20.     

    Multiplication

     
  21.     

     
  22.  
  23.     

    Division

     
  24.     

     
  25.  
  26.      
  27.      
  28.    
  29.  

 

 

這個(gè)頁面很簡單,就不詳細(xì)說明了。

functions.js 文件中包含將會(huì)在第二個(gè)腳本中用到的數(shù)學(xué)函數(shù)。打開文件并添加以下內(nèi)容:

functions.js

 
 
 
 
  1. function sum(x, y) { 
  2.   return x + y 
  3.  
  4. function difference(x, y) { 
  5.   return x - y 
  6.  
  7. function product(x, y) { 
  8.   return x * y 
  9.  
  10. function quotient(x, y) { 
  11.   return x / y 

最后,script.js 文件用來確定 x 和 y 的值,以及調(diào)用前面那些函數(shù)并顯示結(jié)果:

script.js

 
 
 
 
  1. const x = 10 
  2. const y = 5 
  3.  
  4. document.getElementById('x').textContent = x 
  5. document.getElementById('y').textContent = y 
  6.  
  7. document.getElementById('addition').textContent = sum(x, y) 
  8. document.getElementById('subtraction').textContent = difference(x, y) 
  9. document.getElementById('multiplication').textContent = product(x, y) 
  10. document.getElementById('division').textContent = quotient(x, y) 

保存之后在瀏覽器中打開 index.html 可以看到所有結(jié)果:

 

對(duì)于只需要一些小腳本的網(wǎng)站,這不失為一種有效的組織代碼的方法。但是這種方法存在一些問題:

  • 污染全局命名空間:你在腳本中創(chuàng)建的所有變量(sum、 difference 等)現(xiàn)在都存在于 window 對(duì)象中。如果你打算在另一個(gè)文件中使用另一個(gè)名為 sum 的變量,會(huì)很難知道在腳本的其它位置到底用的是哪一個(gè)值變量,因?yàn)樗鼈冇玫亩际窍嗤?window.sum 變量。唯一可以使變量私有的方法是將其放在函數(shù)的作用域中。甚至在 DOM 中名為 x 的 id 可能會(huì)和 var x 存在沖突。
  • 依賴管理:必須從上到下依次加載腳本來確保可以使用正確的變量。將腳本分別保存存為不同文件會(huì)產(chǎn)生分離的錯(cuò)覺,但本質(zhì)上與放在頁面中的單個(gè)  
  •  
  •  

    由于受限于 CORS 策略,必須在服務(wù)器環(huán)境中使用模塊,否則會(huì)出現(xiàn)下面的錯(cuò)誤:

     
     
     
     
    1. Access to script at 'file:///Users/your_file_path/script.js' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, chrome-untrusted, https. 

    模塊與常規(guī)腳本不一樣的地方:

    • 模塊不會(huì)向全局(window)作用域添加任何內(nèi)容。
    • 模塊始終處于嚴(yán)格模式。
    • 在同一文件中把同一模塊加載兩次不會(huì)出問題,因?yàn)槟K僅執(zhí)行一次
    • 模塊需要服務(wù)器環(huán)境。

    模塊仍然經(jīng)常與打包程序(如 Webpack)一起配合使用,用來增加對(duì)瀏覽器的支持和附加功能,但它們也可以直接用在瀏覽器中。

    接下來探索更多使用 import 和 export 語法的方式。

    命名導(dǎo)出

    如前所述,使用 export 語法允許你分別導(dǎo)入按名稱導(dǎo)出的值。以這個(gè) function.js 的簡化版本為例:

    functions.js

     
     
     
     
    1. export function sum() {} 
    2. export function difference() {} 

    這樣允許你用花括號(hào)按名稱導(dǎo)入 sum 和 difference:

    script.js

     
     
     
     
    1. import {sum, difference} from './functions.js' 

    也可以用別名來重命名該函數(shù)。這樣可以避免在同一模塊中產(chǎn)生命名沖突。在這個(gè)例子中,sum 將重命名為 add,而 difference 將重命名為 subtract。

    script.js

     
     
     
     
    1. import { 
    2.   sum as add, 
    3.   difference as subtract 
    4. } from './functions.js' 
    5.  
    6. add(1, 2) // 3 

    在這里調(diào)用 add() 將產(chǎn)生 sum() 函數(shù)的結(jié)果。

    使用 * 語法可以將整個(gè)模塊的內(nèi)容導(dǎo)入到一個(gè)對(duì)象中。在這種情況下,sum 和 difference 將成為 mathFunctions 對(duì)象上的方法。

    script.js

     
     
     
     
    1. import * as mathFunctions from './functions.js' 
    2.  
    3. mathFunctions.sum(1, 2) // 3 
    4. mathFunctions.difference(10, 3) // 7 

    原始值、函數(shù)表達(dá)式和定義、異步函數(shù)、類和實(shí)例化的類都可以導(dǎo)出,只要它們有標(biāo)識(shí)符就行:

     
     
     
     
    1. // 原始值 
    2. export const number = 100 
    3. export const string = 'string' 
    4. export const undef = undefined 
    5. export const empty = null 
    6. export const obj = {name: 'Homer'} 
    7. export const array = ['Bart', 'Lisa', 'Maggie'] 
    8.  
    9. // 函數(shù)表達(dá)式 
    10. export const sum = (x, y) => x + y 
    11.  
    12. // 函數(shù)定義 
    13. export function difference(x, y) { 
    14.   return x - y 
    15.  
    16. // 匿名函數(shù) 
    17. export async function getBooks() {} 
    18.  
    19. // 類 
    20. export class Book { 
    21.   constructor(name, author) { 
    22.     this.name = name 
    23.     this.author = author 
    24.   } 
    25.  
    26. // 實(shí)例化類 
    27. export const book = new Book('Lord of the Rings', 'J. R. R. Tolkein') 

    所有這些導(dǎo)出都可以成功被導(dǎo)入。接下來要探討的另一種導(dǎo)出類型稱為默認(rèn)導(dǎo)出。

    默認(rèn)導(dǎo)出在前面的例子中我們導(dǎo)出了多個(gè)命名的導(dǎo)出,并分別或作為一個(gè)對(duì)象導(dǎo)入了每個(gè)導(dǎo)出,將每個(gè)導(dǎo)出作為對(duì)象上的方法。模塊也可以用關(guān)鍵字 default 包含默認(rèn)導(dǎo)出。默認(rèn)導(dǎo)出不使用大括號(hào)導(dǎo)入,而是直接導(dǎo)入到命名標(biāo)識(shí)符中。

    以 functions.js 文件為例:

    functions.js

     
     
     
     
    1. export default function sum(x, y) { 
    2.   return x + y 

    在 script.js 文件中,可以用以下命令將默認(rèn)函數(shù)導(dǎo)入為 sum:

    script.js

     
     
     
     
    1. import difference from './functions.js' 
    2.  
    3. difference(1, 2) // 3 

    不過這樣做很危險(xiǎn),因?yàn)樵趯?dǎo)入過程中對(duì)默認(rèn)導(dǎo)出的命名沒有做任何限制。在這個(gè)例子中,默認(rèn)函數(shù)被導(dǎo)入為 difference,盡管它實(shí)際上是 sum 函數(shù):

    script.js

     
     
     
     
    1. import difference from './functions.js' 
    2.  
    3. difference(1, 2) // 3 

    所以一般首選使用命名導(dǎo)出。與命名導(dǎo)出不同,默認(rèn)導(dǎo)出不需要標(biāo)識(shí)符——原始值本身或匿名函數(shù)都可以用作默認(rèn)導(dǎo)出。以下是用作默認(rèn)導(dǎo)出的對(duì)象的示例:

    functions.js

     
     
     
     
    1. export default { 
    2.   name: 'Lord of the Rings', 
    3.   author: 'J. R. R. Tolkein', 

    可以用以下命令將其作為 book 導(dǎo)入:

    functions.js

     
     
     
     
    1. import book from './functions.js' 

    同樣,下面的例子演示了如何將匿名箭頭函數(shù)導(dǎo)出為默認(rèn)導(dǎo)出:

    functions.js

     
     
     
     
    1. export default () => 'This function is anonymous' 

    可以這樣導(dǎo)入:

    script.js

     
     
     
     
    1. import anonymousFunction from './functions.js' 

    命名導(dǎo)出和默認(rèn)導(dǎo)出可以彼此并用,例如在這個(gè)模塊中,導(dǎo)出兩個(gè)命名值和一個(gè)默認(rèn)值:

    functions.js

     
     
     
     
    1. export const length = 10 
    2. export const width = 5 
    3.  
    4. export default function perimeter(x, y) { 
    5.   return 2 * (x + y) 

    可以用以下命令導(dǎo)入這些變量和默認(rèn)函數(shù):

    script.js

     
     
     
     
    1. import calculatePerimeter, {length, width} from './functions.js' 
    2.  
    3. calculatePerimeter(length, width) // 30 

    現(xiàn)在默認(rèn)值和命名值都可用于腳本了。

    總結(jié)

    模塊化編程設(shè)計(jì)允許我們把代碼分成單個(gè)組件,這有助于代碼重用,同時(shí)還可以保護(hù)全局命名空間。一個(gè)模塊接口可以在原生 JavaScript 中用關(guān)鍵字 import 和 export 來實(shí)現(xiàn)。


    分享標(biāo)題:詳解JavaScript中的模塊、Import和Export
    分享鏈接:http://m.5511xx.com/article/djoshdc.html