其他
在拆分 JS/TS 代码并需要公开/私有边界时用模块模式实现…
需要把 JavaScript/TypeScript 代码组织成可复用、可维护且具有私有作用域的模块时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
在拆分 JS/TS 代码并需要公开/私有通用
解决思路
- 使用 ES2015 `import`/`export` 语法定义模块。
- 对多个要暴露的值使用命名导出(named exports):在函数或变量声明前加 `export`,例如 `export function add(x, y) { return x + y; }`。
- 导入命名导出时使用花括号和 `from` 指定相对路径,例如 `import { add, multiply, subtract, square } from "./math.js";`。
- 不添加 `export` 的值保持为模块私有,例如 `const privateValue = "This is a value private to the module!";`;只有显式导出的值才能在模块外访问,从而减少全局作用域污染和命名冲突。
- 当导入名与本地值冲突时,用 `as` 重命名导入值,例如 `import { add as addValues, multiply as multiplyValues, subtract, square } from "./math.js";`。
- 对模块的主要值使用默认导出,且每个模块只能有一个默认导出,例如 `export default function add(x, y) { return x + y; }`。
- 导入默认导出时不使用花括号,例如 `import add, { multiply, subtract, square } from "./math.js";`;默认导出的导入名可与导出名不同。
- 用 `import * as math from "./math.js";` 导入模块的所有导出(命名导出和默认导出),通过 `math.default(...)`、`math.multiply(...)` 等访问;注意这样做可能不必要地导入值。
- 在 React 中将组件拆分为单独文件模块,例如为 `List` 组件建 `TodoList.js`、为自定义按钮建 `Button.js`、为自定义输入建 `Input.js`。
- 在 React 组件模块中导入 UI 库默认组件,添加自定义 `styles` 后导出自定义组件,供应用其他部分直接导入使用。
- 利用模块作用域在不同组件文件中复用同名变量(如 `style` 对象),避免命名冲突。
- 使用动态 `import("module")` 按需加载模块:`import("module").then((module) => { module.default(); module.namedExport(); });`。
- 或使用 `async/await` 动态导入:`(async () => { const module = await import("module"); module.default(); module.namedExport(); })();`。
- 给 `import()` 传入表达式或模板字面量以动态加载模块,例如 const res = await import(`../assets/dog${num}.png`);,避免硬编码模块路径。
- 若需在所有 JavaScript 运行时使用 ES2015 模块,使用 Babel 等转译器(`https://babeljs.io/`)。
适用边界 · 注意事项
- 当 ES2015 原生模块与静态 `import`/`export` 可用时,优先使用静态导入,以获得更好的工具支持和 tree-shaking。
- 当基于 IIFE 的模块模式仅用于封装,而代码库已使用 bundler 时,不必使用该模式。
- 对于琐碎脚本,模块开销会增加不必要的复杂性。