CD-HIT结果解读:聚类文件(.clstr)格式与统计分析方法
2026/7/27 20:51:24
ES6(ECMAScript 2015)引入的模块系统(Modules)是 JavaScript 历史上最重要的特性之一。它解决了长期存在的全局变量污染、依赖管理混乱等问题,为现代前端工程化奠定了基础。
本文将系统讲解 ES6 模块的导入/导出语法、运行机制、常见误区及最佳实践,助你写出清晰、高效、可维护的模块化代码。
<scriptsrc="utils.js"></script><scriptsrc="app.js"></script><!-- 顺序敏感!utils 必须在 app 前 --><!-- 所有变量挂载到全局 window,易冲突 -->import/export声明依赖关系;🔑核心原则:每个文件就是一个模块(需在
<script type="module">或构建工具中使用)。
可导出多个值(变量、函数、类等),名称必须匹配。
// math.jsexportconstPI=3.14159;exportfunctionadd(a,b){returna+b;}exportclassCalculator{...}// 或统一导出constsubtract=(a,b)=>a-b;functionmultiply(a,b){returna*b;}export{subtract,multiply};✅特点:
export;export { foo as bar }。每个模块只能有一个默认导出,常用于导出主功能(如组件、类、函数)。
// Button.vue (伪代码)exportdefaultfunctionButton(props){return`<button>${props.text}</button>`;}// 或constMyComponent={...};exportdefaultMyComponent;✅特点:
export default expression。// utils.jsexportdefaultfunctionmain(){...}exportconsthelper=()=>{...};⚠️ 虽合法,但易造成 API 混乱,建议统一使用命名导出或仅用默认导出。
// 方式1:逐个导入import{PI,add}from'./math.js';// 方式2:重命名(避免冲突)import{addassum,subtractasminus}from'./math.js';// 方式3:导入所有为命名空间对象import*asMathUtilsfrom'./math.js';MathUtils.add(1,2);// 调用方式// 名称可自定义importButtonfrom'./Button.js';importMyCompfrom'./MyComponent.js';// 默认导出在前,命名导出在后importButton,{variant,size}from'./Button.js';// 仅运行模块代码(如初始化、副作用)import'./polyfills.js';import'./analytics.js';// 初始化埋点用于按需加载、条件加载或懒加载,返回 Promise。
// 动态导入语法constmodule=awaitimport('./math.js');console.log(module.add(1,2));// 条件加载if(featureFlag){const{newFeature}=awaitimport('./new-feature.js');newFeature();}// React 懒加载组件constLazyComponent=React.lazy(()=>import('./LazyComponent'));✅优势:
import/export必须在顶层作用域,不能在条件语句或函数内:// ❌ 错误!if(true){import{foo}from'./foo.js';// SyntaxError}✅ 解决方案:使用动态导入实现条件加载。
命名导出是只读的实时引用,不是值拷贝:
// counter.jsexportletcount=0;exportfunctionincrement(){count++;}// main.jsimport{count,increment}from'./counter.js';console.log(count);// 0increment();console.log(count);// 1 —— 自动更新!⚠️ 默认导出是值拷贝(除非导出的是引用类型)。
.js扩展名:// ✅ 正确import{foo}from'./utils.js';// ❌ 错误(浏览器会 404)import{foo}from'./utils';HTML 中必须声明type="module":
<scripttype="module"src="./main.js"></script>否则浏览器会当作传统脚本执行,导致
import报错。
// 推荐export{Button,IconButton,LinkButton};// 而非exportdefault{Button,IconButton,LinkButton};as重命名解决冲突import{debounceas_debounce}from'lodash';import{debounceasmyDebounce}from'./utils';用index.js聚合子模块,简化导入路径:
// components/index.jsexport{defaultasButton}from'./Button/Button.js';export{defaultasModal}from'./Modal/Modal.js';// 使用import{Button,Modal}from'./components';moment.js→dayjs);import是解构赋值// 错误理解import{foo}from'./mod';// 不是解构!// 正确:这是静态导入声明,绑定到模块的导出import Whatever from 'lib')。import{PI}from'./math.js';PI=3;// ❌ TypeError: Assignment to constant variable.命名导入是只读绑定!
| 场景 | 推荐做法 |
|---|---|
| 导出多个工具函数/类 | 命名导出 |
| 导出单一主组件/类 | 默认导出 |
| 需要 Tree-shaking | 避免* as,使用具体命名导入 |
| 条件加载/懒加载 | 动态import() |
| 统一 API 入口 | Barrel 文件(index.js) |
| 浏览器原生使用 | 带.js扩展名 +type="module" |
💡记住:
“显式优于隐式,静态优于动态,命名优于默认”—— 这是写出高质量模块化代码的核心思想。
掌握 ES6 模块,是迈向现代 JavaScript 开发的第一步。合理使用import/export,让你的代码更清晰、更安全、更高效!