[Render] Module Pattern
Intrioduction
- 當程式庫隨著開發越來越龐大, 保持代碼的maintainable和separated變得越來越重要
- module pattern可以分割程式碼變得smaller或reusable的片段
- module 可將文件中的某些值保密(private)
- module 裡面宣告的值, 默認 scope 就會在此 module 範圍裡, 要
export
特定的value,此 value 才能在 module 被使用
- 減少值在其他程式庫被使用時的命名衝突(name collisions), 因為此值不能用在全域(global scope)
ES2015 Modules
- 使用
export
keyword匯出 value, 要使用 module 的 value 則用import
, 藉由將想保密的值放在 module 另一方面也可以降低污染全域變數的風險(overwrite values, naming collisions), 且每個 module 只可以有一個export default
- import module from 'module', default name 可自行命名
- import { module } from 'module'
- 當import name 與 local values相同時, 可用
as
重新命名import name
- 用asterisk
*
可以import所有export, 存成物件後調用, 要注意是有可能導入不必要的value, 但不會導入private value除非你有export此value
React
- 用react開發應用程式通常會需要處理大量的component, 我們會將各個component寫在他自己的file內, 為每個component創建一個module
demo todo-list
- 注意:Button.js 和 Input.js 都有一個 style 物件, 由於 style 物件有他自己的 module-scoped, 因此在個別檔案中可以重複使用這個名稱不會有命名衝突(name collision)
Static import
- 缺點:
- page loadind time較長
- 可能使用者還沒需要 module 時就先匯入
- 無法根據用戶輸入 or 外部接收數據…較彈性方式導入 module
Dynamic import( ES2020 (ES11) 提供的 import()
)讓module匯入更彈性
- 讓
import module
更彈性, 當需要時動態匯入 module, 比方說 click
再匯入 demo
Reference
modules-dynamic-imports