gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

詳細(xì)了解javascript中的modules、import和export

詳細(xì)了解javascript中的modules、import和export

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

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

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

模塊化編程

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

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

index.html

<!DOCTYPE html> <html lang="en">   <head>     <meta charset="utf-8" />     <meta name="viewport" content="width=device-width, initial-scale=1.0" />      <title>JavaScript Modules</title>   </head>    <body>     <h1>Answers</h1>     <h2><strong id="x"></strong> and <strong id="y"></strong></h2>      <h3>Addition</h3>     <p id="addition"></p>      <h3>Subtraction</h3>     <p id="subtraction"></p>      <h3>Multiplication</h3>     <p id="multiplication"></p>      <h3>pision</h3>     <p id="pision"></p>      <script src="functions.js"></script>     <script src="script.js"></script>   </body> </html>

這個(gè)頁(yè)面很簡(jiǎn)單,就不詳細(xì)說(shuō)明了。

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

functions.js

function sum(x, y) {   return x + y }  function difference(x, y) {   return x - y }  function product(x, y) {   return x * y }  function quotient(x, y) {   return x / y }

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

script.js

const x = 10 const y = 5  document.getElementById('x').textContent = x document.getElementById('y').textContent = y  document.getElementById('addition').textContent = sum(x, y) document.getElementById('subtraction').textContent = difference(x, y) document.getElementById('multiplication').textContent = product(x, y) document.getElementById('pision').textContent = quotient(x, y)

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

詳細(xì)了解javascript中的modules、import和export

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

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

在 ES6 把原生模塊添加到 JavaScript 語(yǔ)言之前,社區(qū)曾經(jīng)嘗試著提供了幾種解決方案。第一個(gè)解決方案是用原生 JavaScript 編寫(xiě)的,例如將所有代碼都寫(xiě)在 objects 或立即調(diào)用的函數(shù)表達(dá)式(IIFE)中,并將它們放在全局命名空間中的單個(gè)對(duì)象上。這是對(duì)多腳本方法的一種改進(jìn),但是仍然存在將至少一個(gè)對(duì)象放入全局命名空間的問(wèn)題,并沒(méi)有使在第三方之間一致地共享代碼的問(wèn)題變得更加容易。

之后又出現(xiàn)了一些模塊解決方案:CommonJS 是一種在 Node.js 實(shí)現(xiàn)的同步方法,異步模塊定義(AMD)是一種異步方法,還有支持前面兩種樣式的通用方法——通用模塊定義(UMD)。

這些解決方案的出現(xiàn)使我們可以更輕松地以的形式共享和重用代碼,也就是可以分發(fā)和共享的模塊,例如 npm。但是由于存在許多解決方案,并且都不是 JavaScript 原生的,所以需要依靠 Babel、Webpack 或 Browserify之類的工具才能在瀏覽器中使用。

由于多文件方法存在許多問(wèn)題,并且解決方案很復(fù)雜,所以開(kāi)發(fā)人員對(duì)把模塊化開(kāi)發(fā)的方法引入 JavaScript 語(yǔ)言非常感興趣。于是 ECMAScript 2015 開(kāi)始支持 JavaScript module

module 是一組代碼,用來(lái)提供其他模塊所使用的功能,并能使用其他模塊的功能。 export 模塊提供代碼,import 模塊使用其他代碼。模塊之所以有用,是因?yàn)樗鼈冊(cè)试S我們重用代碼,它們提供了許多可用的穩(wěn)定、一致的接口,并且不會(huì)污染全局命名空間。

模塊(有時(shí)稱為 ES 模塊)現(xiàn)在可以在原生 JavaScript 中使用,在本文中,我們一起來(lái)探索怎樣在代碼中使用及實(shí)現(xiàn)。

原生 JavaScript 模塊

JavaScript 中的模塊使用importexport 關(guān)鍵字:

  • import:用于讀取從另一個(gè)模塊導(dǎo)出的代碼。
  • export:用于向其他模塊提供代碼。

接下來(lái)把前面的的 functions.js 文件更新為模塊并導(dǎo)出函數(shù)。在每個(gè)函數(shù)的前面添加 export

functions.js

export function sum(x, y) {   return x + y }  export function difference(x, y) {   return x - y }  export function product(x, y) {   return x * y }  export function quotient(x, y) {   return x / y }

script.js 中用 import 從前面的 functions.js 模塊中檢索代碼。

注意import 必須始終位于文件的頂部,然后再寫(xiě)其他代碼,并且還必須包括相對(duì)路徑(在這個(gè)例子里為 ./)。

script.js 中的代碼改成下面的樣子:

script.js

import { sum, difference, product, quotient } from './functions.js'  const x = 10 const y = 5  document.getElementById('x').textContent = x document.getElementById('y').textContent = y  document.getElementById('addition').textContent = sum(x, y) document.getElementById('subtraction').textContent = difference(x, y) document.getElementById('multiplication').textContent = product(x, y) document.getElementById('pision').textContent = quotient(x, y)

注意:要通過(guò)在花括號(hào)中命名單個(gè)函數(shù)來(lái)導(dǎo)入。

為了確保代碼作為模塊導(dǎo)入,而不是作為常規(guī)腳本加載,要在 index.html 中的 script 標(biāo)簽中添加type="module"。任何使用 importexport 的代碼都必須使用這個(gè)屬性:

index.html

<script    type="module" src="functions.js"> </script> <script    type="module" src="script.js"> </script>

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

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ì)出問(wèn)題,因?yàn)槟K僅執(zhí)行一次
  • 模塊需要服務(wù)器環(huán)境。

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

接下來(lái)探索

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
国产美女无遮挡网站| 亚洲制服在线观看| 日韩中文字幕免费在线| 波多野结衣乳巨码无在线| 九九九九九伊人| 欧洲熟妇精品视频| 欧美日韩亚洲一| 免费黄色日本网站| 中文字幕久久av| 亚洲综合20p| 欧洲美女亚洲激情| 激情伊人五月天| gai在线观看免费高清| 成年人视频大全| 国产日产欧美视频| 日韩成人av免费| 18黄暴禁片在线观看| 久久亚洲中文字幕无码| 日韩视频在线免费播放| av之家在线观看| 日韩va在线观看| 成人午夜免费在线| 国产淫片免费看| 色呦呦网站入口| 999这里有精品| 久久久久国产一区| 另类小说第一页| 国产 porn| 黄色手机在线视频| 成人性生生活性生交12| 欧美一级免费播放| youjizz.com在线观看| 激情五月五月婷婷| japanese在线播放| 无码粉嫩虎白一线天在线观看| 深夜做爰性大片蜜桃| www.-级毛片线天内射视视| 一级片黄色免费| eeuss中文| 可以看毛片的网址| 黑鬼大战白妞高潮喷白浆| 免费无码国产v片在线观看| 成人在线激情网| 嫩草影院国产精品| 在线观看17c| 男人揉女人奶房视频60分| 久久久久免费精品| 日本特级黄色大片| 国内精品在线观看视频| 国产第一页视频| 国产高清免费在线| 成人免费毛片网| 秋霞在线一区二区| 在线免费视频a| 久久久久99精品成人片| 亚洲欧美另类动漫| 黄色网在线视频| 在线a免费观看| 国产成人免费高清视频| 久激情内射婷内射蜜桃| 人妻丰满熟妇av无码区app| 国产视频一区二区视频| 日韩成人精品视频在线观看| 日韩视频在线免费播放| 美女av免费在线观看| 99视频在线视频| 日韩精品在线中文字幕| 中文字幕无码不卡免费视频| 亚洲天堂网2018| 亚洲自偷自拍熟女另类| 亚洲av毛片在线观看| 精品www久久久久奶水| 51自拍视频在线观看| 日本黄色播放器| 中文字幕国内自拍| 欧美少妇性生活视频| 国产a级片免费观看| 亚洲一区二区福利视频| 欧美a级黄色大片| 777精品久无码人妻蜜桃| 欧美极品欧美精品欧美图片| 在线免费观看视频黄| 黄色高清视频网站| 国产91在线视频观看| 99视频在线免费| 国产男女免费视频| 国产小视频精品| 国产视频九色蝌蚪| 午夜激情视频网| 任你操这里只有精品| 免费看啪啪网站| 亚洲国产日韩欧美在线观看| 男人天堂新网址| 国产福利片一区二区| 国产精品人人妻人人爽人人牛| 免费不卡av在线| 丰满人妻一区二区三区53号| 精品久久久久久久免费人妻| a级黄色一级片| www.av蜜桃| 欧美成人免费在线观看视频| ijzzijzzij亚洲大全| 久久精品一二三四| 最近中文字幕免费mv| 久久久国产精华液999999 | 亚洲小视频在线播放| 成人三级视频在线播放| 狠狠爱免费视频| 国产乱叫456| 久久精品影视大全| 国产精品一区二区小说| 天天色综合社区| 国产精品区在线| 国产5g成人5g天天爽| 亚洲一级片免费观看| 国产一区二区片| 久久综合色视频| av网站在线不卡| 国产精品av免费| 欧美日韩在线视频一区二区三区| 久久亚洲中文字幕无码| www.日本xxxx| 九九九久久久久久久| 隔壁人妻偷人bd中字| 天天影视综合色| 999久久欧美人妻一区二区| 一本久道中文无码字幕av| 久久人人爽av| 国产亚洲黄色片| 久久撸在线视频| 欧美精品久久久久久久久久久| 丝袜老师办公室里做好紧好爽 | 青青草免费在线视频观看| 免费欧美一级视频| 色乱码一区二区三区熟女| 黄色片一级视频| www.99riav| 欧美极品少妇无套实战| 欧美成人乱码一二三四区免费| 国产 欧美 日本| 91免费视频黄| 北条麻妃亚洲一区| 国产传媒免费观看| 免费成年人高清视频| www.com操| 中国黄色片一级| 亚洲欧美日本一区二区| 日韩一区二区三区久久| 国产wwwxx| 国产在线观看中文字幕| 999在线精品视频| 中国一级黄色录像| www.久久com| 欧美中文字幕在线观看视频| 美女av免费观看| www国产精品内射老熟女| 五月天婷婷激情视频| 丁香婷婷激情网| 欧美 国产 精品| 青青青在线视频播放| 久久精品免费网站| 国产又大又长又粗又黄| 成年女人18级毛片毛片免费| 久久久久免费看黄a片app| 天天爽夜夜爽一区二区三区| 午夜av中文字幕| www.欧美日本| 欧美 日韩 国产精品| 中文字幕国产传媒| 国产二区视频在线播放| 日本不卡一区二区三区四区| 成人羞羞国产免费网站| 最新中文字幕久久| 亚洲乱码国产一区三区| 成人免费观看cn| 日本a级片在线播放| 99精品视频免费版的特色功能| 亚洲熟妇国产熟妇肥婆| a天堂资源在线观看| 欧美aaa在线观看| 911av视频| 毛毛毛毛毛毛毛片123| 国产在线视频三区| 特级西西444www| 亚洲 欧洲 日韩| 国内外成人免费在线视频| 天天干在线影院| 天天看片天天操| 亚洲一级片免费观看| 免费观看国产视频在线| 亚洲中文字幕无码一区二区三区| 日本不卡一区二区在线观看| 夜夜夜夜夜夜操| 中文字幕55页| 毛片在线视频播放| 国产免费成人在线| 五月花丁香婷婷| 白白操在线视频| 牛夜精品久久久久久久| 手机在线观看日韩av|