Module Pattern
前言
大家好,我是 Johnny,今天要紀錄分享的是 Patterns 筆記系列的 Module Pattern
介紹
Module 模式是一種將程式碼拆分的基礎模式,在 Javascript 的 ES2015 Modules 是一套內建的模組化方式,以下是一個常見的 math.js
模組,透過 export
將多個函數作為模組的方法輸出
// math.js
const privateValue = "This is a value private to the module!";
export function add(x, y) {
return x + y;
}
export function multiply(x) {
return x * 2;
}
export function subtract(x, y) {
return x - y;
}
export function square(x) {
return x * x;
}
import { add, multiply, subtract, square } from "./math.js";
/* Error: privateValue is not defined */
console.log(privateValue);
透過模組化的方式,我們可以保證一些模組內的變數不會互相污染
export default
export default
是一種內建的 export 單位
export default function add(x, y) {
return x + y;
}
export function multiply(x) {
return x * 2;
}
export function subtract(x, y) {
return x - y;
}
export function square(x) {
return x * x;
}
default 關鍵字是作為預設輸出的對象
import add, { multiply, subtract, square } from "./math.js";
add(7, 8);
multiply(8, 9);
subtract(10, 3);
square(3);
或是我們可以透過 import * as xxx
的方式,將所有模組輸出整合為一體進行使用
import * as math from "./math.js";
math.default(7, 8);
math.multiply(8, 9);
math.subtract(10, 3);
math.square(3);
Dynamic Import
在 js 當中,除了透過 import X from 'xxx';
進行模組引用,也可以透過 import()
關鍵字,對模組進行動態的引入,提升模組載入的靈活度及載入效率
import("module").then((module) => {
module.default();
module.namedExport();
});
// Or with async/await
(async () => {
const module = await import("module");
module.default();
module.namedExport();
})();
當然也可以對圖片進行動態載入
import React from "react";
export function DogImage({ num }) {
const [src, setSrc] = React.useState("");
async function loadDogImage() {
const res = await import(`../assets/dog${num}.png`);
setSrc(res.default);
}
return src ? (
<img src={src} alt="Dog" />
) : (
<div className="loader">
<button onClick={loadDogImage}>Click to load image</button>
</div>
);
}
結論
透過 module 模組化的開發方式,我們可以很輕易的拆分程式碼,並且降低程式碼的命名污染,JS 由於歷史包袱因素,從最早的 AMD 模組(RequireJS)到後來 Nodejs 大行其道時的 CommonJS,到後來大家透過 Webpack 把 ESM 語法轉為 Nodejs 後打包成瀏覽器 JS,到現在原生 JS 瀏覽器的 ESM(ViteJS),要把整個 JS 模組化歷史講完實在太多內容,歡迎有興趣的夥伴動手深入瞭解摟~今天就介紹到這邊,下次見拉=V=.