ES 6 系列 - Module 的语法
es 6 大幅度优化了模块化编程的规范。
写在前面:在 es6 之前,说起 js 的模块化,一般都避不开 CommonJs 和 AMD 两种方案。这两种方案,前者应用于服务器,后者应用于浏览器。而 es 6 通过 export 和 import 这两个关键字,完全取代上面两种方案,且使用起来更简单。
一、export 命令
出口,用于规定模块的对外接口(这就意味着数据必须被包装成对象的格式)。
一个模块就是一个独立的文件,该文件内部的所有变量,外部无法获取。如果希望能获取到内部的某个变量,就必须使用 export 将变量输出:
1 2 3 4 | // profile.js export var firstName = 'Michael' ; export var lastName = 'Jackson' ; export var year = 1958; |
通常写成,也建议这样写:
1 2 3 4 5 6 | // profile.js var firstName = 'Michael' ; var lastName = 'Jackson' ; var year = 1958; export {firstName, lastName, year}; |
以及输出函数或者类:
1 2 3 4 5 6 7 8 | function v1() { ... } function v2() { ... } export { v1 as streamV1, v2 as streamV2, v2 as streamLatestVersion }; |
export 输出时,只有三种固定格式,其他均会报错:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // 写法一 export var m = 1; // 声明时输出 // 写法二 var m = 1; export {m}; // 包装成数据对象输出 // 写法三 var n = 1; export {n as m}; // 使用别名输出,基本上相当于第二种 // 报错 export 1; // 报错 var m = 1; export m; |
还有一点就是,export 输出的接口,与其对应的值是动态绑定关系,即通过接口,可以获取到模块内部实时的值:
1 2 3 4 5 | export var foo = 'bar' ; setTimeout(() => foo = 'xyz' , 500); // 输出变量 foo, 值为 bar , 500 ms 后变成 xyz |
二、import 命令
入口,加载 export 的模块中的变量、方法等。
1 2 3 4 5 6 | // main.js import {firstName, lastName, year} from './profile.js' ; function setName(element) { element.textContent = firstName + ' ' + lastName; } |
当然,引入的变量也可以修改变量名:
1 | import { lastName as surname } from './profile.js' ; |
一个规范:import 进来的变量、方法、对象本身无法修改,但是,如果是对象的话,其中的某个属性还是可以修改的,但是,从规范上,不要进行任何修改,将引入的全部当做只读,否则改 bug 会很头疼。
如果 export 时未采用 {xxx,xxx} 方式,那么在 import 时,想要引入所有值,可以使用 * 来代替:
1 2 3 4 5 6 7 8 9 10 11 12 13 | // main.js import { area, circumference } from './circle' ; console.log( '圆面积:' + area(4)); console.log( '圆周长:' + circumference(14)); // 可以简写成 import * as circle from './circle' ; console.log( '圆面积:' + circle.area(4)); console.log( '圆周长:' + circle.circumference(14)); |
三、export default 命令
使用 import 的时候会有一个问题,如果不知道需要加载的模块中的变量名或者函数名,那就很尴尬。小模块没什么,点进去翻翻就知道,但是像 Vue、ElementUI 这种框架的时候,想要快速上手,先去翻翻文档?
1 2 3 4 5 6 7 8 9 | // export-default.js export default function () { console.log( 'foo' ); } // import-default.js import customName from './export-default' ; customName(); // 'foo' |
如上例所示,通过 export default 出来的通常在 import 时候不需要 {},且 import 时可以任意命名。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现