javascript專欄介紹模組、Import和Export的用法
##推薦(免費):javascript(影片)
在網路的洪荒時代,網站主要用HTML和CSS 開發的。如果將 JavaScript 載入到頁面中,通常是以小片段的形式提供效果和交互,一般會把所有的 JavaScript 程式碼全都寫在一個檔案中,並載入到一個script 標籤中。儘管可以把 JavaScript 拆分為多個文件,但是所有的變數和函數仍然會被加入到全域作用域中。
module,也有了 import 和 export 語句。在本文中,我們一起來學習 JavaScript 模組,以及怎麼用 import 和
export 來組織程式碼。
模組化程式設計
在JavaScript 中出現模組的概念之前,當我們想要把自己的程式碼組織為多個區塊時,一般會建立多個文件,並將它們連結為單獨的腳本。以下舉例說明,先建立一個index.html 檔案和兩個JavaScript檔案「
functions.js 和
script.js。
index.html 檔案用來顯示兩個數字的和、差、乘積和商,並連結到
script 標籤中的兩個JavaScript 檔案。開啟
index.html 並加入以下程式碼:
index.html
nbsp;html> <meta> <meta> <title>JavaScript Modules</title> <h1>Answers</h1> <h2> <strong></strong> and <strong></strong> </h2> <h3>Addition</h3> <p></p> <h3>Subtraction</h3> <p></p> <h3>Multiplication</h3> <p></p> <h3>pision</h3> <p></p> <script></script> <script></script>這個頁面很簡單,就不詳細說明了。
functions.js 檔案中包含將會在第二個腳本中使用到的數學函數。開啟檔案並新增以下內容:
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 檔案用來決定x 和y 的值,以及呼叫前面那些函數並顯示結果:
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)儲存之後在瀏覽器中開啟
index.html 可以看到所有結果:
、
difference 等)現在都存在於
window 物件中。如果你打算在另一個檔案中使用另一個名為
sum 的變量,會很難知道在腳本的其它位置到底用的是哪一個值變量,因為它們用的都是相同的
window.sum 變量。唯一可以使變量私有的方法是將其放在函數的作用域中。甚至在DOM 中名為
x 的
id 可能會和
var x 有衝突。
之後又出現了一些模組解決方案:CommonJS 是一種在Node.js 實現的同步方法,非同步模組定義(AMD)是一種非同步方法,還有支援前面兩種樣式的通用方法——通用模組定義(UMD)。
這些解決方案的出現使我們可以更輕鬆地以
套件的形式共享和重複使用程式碼,也就是可以分發和共享的模組,例如 npm。但由於有許多解決方案,而且都不是 JavaScript 原生的,所以需要依靠 Babel、Webpack 或 Browserify之類的工具才能在瀏覽器中使用。 由於多檔案方法存在許多問題,且解決方案很複雜,所以開發人員對把模組化開發的方法引入 JavaScript 語言非常感興趣。於是 ECMAScript 2015 開始支援 JavaScript
module。 module 是一组代码,用来提供其他模块所使用的功能,并能使用其他模块的功能。 export 模块提供代码,import 模块使用其他代码。模块之所以有用,是因为它们允许我们重用代码,它们提供了许多可用的稳定、一致的接口,并且不会污染全局命名空间。 模块(有时称为 ES 模块)现在可以在原生 JavaScript 中使用,在本文中,我们一起来探索怎样在代码中使用及实现。 原生 JavaScript 模块 JavaScript 中的模块使用 接下来把前面的的 functions.js 在 把 script.js 注意:要通过在花括号中命名单个函数来导入。 为了确保代码作为模块导入,而不是作为常规脚本加载,要在 index.html 由于受限于 CORS 策略,必须在服务器环境中使用模块,否则会出现下面的错误: 模块与常规脚本不一样的地方: 模块仍然经常与打包程序(如 Webpack)一起配合使用,用来增加对浏览器的支持和附加功能,但它们也可以直接用在浏览器中。 接下来探索更多使用 命名导出 如前所述,使用 functions.js 这样允许你用花括号按名称导入 script.js 也可以用别名来重命名该函数。这样可以避免在同一模块中产生命名冲突。在这个例子中, script.js 在这里调用 使用 script.js 原始值、函数表达式和定义、异步函数、类和实例化的类都可以导出,只要它们有标识符就行: 所有这些导出都可以成功被导入。接下来要探讨的另一种导出类型称为默认导出。 默认导出 在前面的例子中我们导出了多个命名的导出,并分别或作为一个对象导入了每个导出,将每个导出作为对象上的方法。模块也可以用关键字 以 functions.js 在 script.js 不过这样做很危险,因为在导入过程中对默认导出的命名没有做任何限制。在这个例子中,默认函数被导入为 script.js 所以一般首选使用命名导出。与命名导出不同,默认导出不需要标识符——原始值本身或匿名函数都可以用作默认导出。以下是用作默认导出的对象的示例: functions.js 可以用以下命令将其作为 functions.js 同样,下面的例子演示了如何将匿名箭头函数导出为默认导出: functions.js 可以这样导入: script.js 命名导出和默认导出可以彼此并用,例如在这个模块中,导出两个命名值和一个默认值: functions.js 可以用以下命令导入这些变量和默认函数: script.js 现在默认值和命名值都可用于脚本了。 总结 模块化编程设计允许我们把代码分成单个组件,这有助于代码重用,同时还可以保护全局命名空间。一个模块接口可以在原生 JavaScript 中用关键字 import
和 export
关键字:
import
:用于读取从另一个模块导出的代码。export
:用于向其他模块提供代码。functions.js
文件更新为模块并导出函数。在每个函数的前面添加 export
。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
必须始终位于文件的顶部,然后再写其他代码,并且还必须包括相对路径(在这个例子里为 ./
)。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)
index.html
中的 script
标签中添加type="module"
。任何使用 import
或 export
的代码都必须使用这个属性:<script>
</script>
<script>
</script>
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.
window
)作用域添加任何内容。import
和 export
语法的方式。export
语法允许你分别导入按名称导出的值。以这个 function.js
的简化版本为例:export function sum() {}
export function difference() {}
sum
和 difference
:import {sum, difference} from './functions.js'
sum
将重命名为 add
,而 difference
将重命名为 subtract
。import {
sum as add,
difference as subtract
} from './functions.js'
add(1, 2) // 3
add()
将产生 sum()
函数的结果。*
语法可以将整个模块的内容导入到一个对象中。在这种情况下,sum
和 difference
将成为 mathFunctions
对象上的方法。import * as mathFunctions from './functions.js'
mathFunctions.sum(1, 2) // 3
mathFunctions.difference(10, 3) // 7
// 原始值
export const number = 100
export const string = 'string'
export const undef = undefined
export const empty = null
export const obj = {name: 'Homer'}
export const array = ['Bart', 'Lisa', 'Maggie']
// 函数表达式
export const sum = (x, y) => x + y
// 函数定义
export function difference(x, y) {
return x - y
}
// 匿名函数
export async function getBooks() {}
// 类
export class Book {
constructor(name, author) {
this.name = name
this.author = author
}
}
// 实例化类
export const book = new Book('Lord of the Rings', 'J. R. R. Tolkein')
default
包含默认导出。默认导出不使用大括号导入,而是直接导入到命名标识符中。functions.js
文件为例:export default function sum(x, y) {
return x + y
}
script.js
文件中,可以用以下命令将默认函数导入为 sum
:import sum from './functions.js'
sum(1, 2) // 3
difference
,尽管它实际上是 sum
函数:import difference from './functions.js'
difference(1, 2) // 3
export default {
name: 'Lord of the Rings',
author: 'J. R. R. Tolkein',
}
book
导入:import book from './functions.js'
export default () => 'This function is anonymous'
import anonymousFunction from './functions.js'
export const length = 10
export const width = 5
export default function perimeter(x, y) {
return 2 * (x + y)
}
import calculatePerimeter, {length, width} from './functions.js'
calculatePerimeter(length, width) // 30
import
和 export
来实现。
以上是一起看看 JavaScript 中的模組、Import和Export的詳細內容。更多資訊請關注PHP中文網其他相關文章!