写点什么

ECMAScript 6 模块超越 CommonJS 和 AMD

  • 2014-09-24
  • 本文字数:1517 字

    阅读完需:约 5 分钟

Axel Rauschmayer 博士正式公布了 ECMAScript 6(ES6)模块语法的最终细节。

Rauschmayer 在文章“ ECMAScript 6 模块:最终语法”中详细描述了完整的 ES6 模块系统,包括 ECMAScript 6 模块、模块元数据和 ECMAScript 6 模块加载器的 API 等。

据 Rauschmayer 所述,ES6 模块的目标是创建一种让 CommonJS 和 AMD 用户都感到满意的格式,由于这种模式是内置于语言之中的,因此其能力超越了 CommonJS 和 AMD。

在 ES6 中有两种导出方式:命名导出(每个模块有多个导出值)和默认导出(每个模块只有一个导出值)。通过在模块声明前面加入 export 关键字作为前缀,一个模块就可以通过命名导出方式导出多个值,并通过不同的名称对它们进行区分。

Rauschmayer 说:

虽然可以通过其他方式命名导出值,但是我觉得此种方式尤其方便:只需关注编写本模块自身的代码,避免了受其他模块的影响,然后使用关键字标记你想导出的值。

如果你愿意,你也可以选择导入整个模块,然后通过属性标注引用其命名导出值。

ES6 的默认导出是最重要的导出值,Rauschmayer 称,默认导出是非常容易进行导入的。他特别提到导出单个值在前端开发中很普遍,通常的做法是每个模块对应一个模型,由构造函数 / 类作为其模型。

ES6 还提供了在模块内获取当前模块信息(例如模块的 URL)的方法。在以下实例中,module 关键字表示该元数据将作为模块被导入,代码如下:

复制代码
import {url} from this module;
console.log(url);

还可以通过对象访问元数据:

复制代码
import * as metaData from this module;
console.log(metaData.url);

除了提供模块的声明式语法之外,ES6 还包括编程 API,让开发人员通过编程方式使用模块和脚本,并配置模块加载。针对该 API,Rauschmayer

加载器负责处理模块的标识符(import…from 后面的字符串 ID)、加载模块等等,其构造函数是 Reflect.Loader。每个平台会在全局变量 System(系统加载器)中保持一个自定义的实例,系统加载器实现自己独特的模块加载方式。

Rauschmayer 还提到,加载器 API(目前该特性的实现仍在进行中)为配置提供了许多钩子。我们可以通过加载器 API“自定义加载过程”,比如:

  • 在导入时校验模块(如使用 JSLint 或 JSHint)
  • 在导入时自动转换模块(包括 CoffeeScript 或 TypeScript 代码)
  • 使用遗留模块(AMD、Node.js)

Rauschmayer 说,可配置的模块加载过程是 Node.js 和 CommonJS 的所缺乏的功能之一。

对于 ES6 模块语法的最终细节,JavaScript 社区的反应大部分是积极正面的。

在 Reddit 上,有一场关于 ECMAScript 6 模块:最终语法的讨论,用户 brtt3000评论说:“我很喜欢,它看起来包含了所有重要的部分,而且语法也很不错”。在Hacker News 上,来自 The Hackerati 的软件工程师 Alan Johnson 评论道:“ES6 使人耳目一新”。

但在某些方面,ES6 也存在困惑和忧虑。

Evan Winslow 对 Rauschmayer 的文章作了如下评价,他说

如果默认导出本身就是一种命名导出,那如何选择使用默认导出呢?这是否意味着命名导出是推荐的方式,而默认导出只是其一种对命名导出的一种特殊运用呢?如果你使用 System.import 方法异步加载模块,必须用.default 才能获得默认导出。这让人感觉有些混乱。

Rauschmayer 对此回复说:

JS 模块社区五花八门,而 ES6 又需要支持所有用例。这意味着 ES6 比其本身要稍微复杂,但这也预示着存在统一社区的可能性。

希望为 ES7+ 提供建议的 InfoQ 读者请移步 ECMAScript 6 Github

查看英文原文: ECMAScript 6 Modules Go Beyond CommonJS and AMD


感谢邵思华对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-09-24 00:474974
用户头像

发布了 28 篇内容, 共 11.4 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

【干货】2024年下半年最受欢迎的50篇数据库主题文章+文档

墨天轮

MySQL 数据库 oracle sql 性能优化

和鲸协办!2025 4C大赛AI通识教育实验创新微课赛道 Q&A × 培训预告重磅来袭!

ModelWhale

线上机器CPU占用高分析实践

京东零售技术

项目管理全流程平台(源码+文档+部署+讲解)

深圳亥时科技

如何在 NocoBase 中实现注册用户审核

NocoBase

开源 低代码 教程 无代码 注册用户审核

开源低代码平台与 Vue.js

伤感汤姆布利柏

即时通讯安全篇(十五):详解硬编码密码的泄漏风险及其扫描原理和工具

JackJiang

网络编程 即时通讯 IM

和鲸协办!2025 4C大赛大数据主题赛赛事 Q&A × 培训预告重磅来袭!

ModelWhale

大数据 数据应用 数据要素 中国大学生计算机设计大赛

鸿蒙APP的测试

北京木奇移动技术有限公司

鸿蒙app 软件外包公司 APP外包公司

千校关注!和鲸科技重磅发布人工智能通识课,助力高校一周内实现课程落地开花

ModelWhale

AI 人工智能通识课 DeepSeek 人工智能通识

项目调度管理系统(源码+文档+部署+讲解)

深圳亥时科技

MarsCode 编程助手模型升级至豆包大模型1.5,同时支持切换DeepSeek R1 / V3!

Trae

AI编程 豆包MarsCode DeepSeek DeepSeek v3 DeepSeek-R1

Golang赋能金融科技后端架构的高效与安全构建

xuyinyin

满血版数据库复制工具——NineData

NineData

解决方案 迁移 同步 数据复制 NineData

京东、蚂蚁集团领衔,国内互联网大厂入局人形机器人赛道!

机器人头条

科技 蚂蚁集团 人形机器人 具身智能 京东集团

制造业上了MES后,生产过程透明化,实时掌握生产动态

万界星空科技

制造业 mes 制造业工厂 生产管理MES系统

DeepSeek冲击(含本地化部署实践)

京东零售技术

vivo HTTPDNS 端到端体验优化实践

vivo互联网技术

网络协议 运维工程师 httpdns 移动端

Deepseek为技术降本增效注入新动力,促进繁荣发展

xuyinyin

ECMAScript 6模块超越CommonJS和AMD_JavaScript_James Chesters_InfoQ精选文章