10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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:475069
用户头像

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

关注

评论

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

融合创新,智领未来 | 华为云云原生精彩亮相2024华为云开源开发者论坛

华为云开源

云原生 开发者大会 华为云开源

荆门正规等保测评机构有吗?在哪里?

行云管家

等保 等保测评 荆门

英特尔携手行业合作伙伴,共拓医健融合之道

E科讯

HarmonyOS 5.0应用开发——属性动画

高心星

arkui HarmonyOS NEXT HarmonyOS5.0 属性动画

CAD测坐标功能常见问题集锦

在路上

cad cad看图 CAD测量

BSC项目开发:构建区块链应用的全面指南

区块链软件开发推广运营

交易所开发 链游开发 公链开发 代币开发

用腾讯云AI代码助手开发一款数据库敏感信息检查工具

CodeBuddy

数字孪生赋能BMS:开启电池管理新纪元

DevOps和数字孪生

签约快讯|天润融通签约问界

天润融通

利用淘宝1688 API接口,构建高效淘宝代购与集运解决方案

代码忍者

代购商城系统

法国 mixtral一种具有开放权重的高质量稀疏专家混合模型

测试人

软件测试

【NeurIPS'24】阿里云 PAI 团队论文被收录为 Spotlight,并完成主题演讲分享

阿里云大数据AI技术

人工智能 阿里云 论文 NeurlPS

蛋糕、面包加工厂MES智能化生产管理

万界星空科技

mes 万界星空科技 面包行业 蛋糕行业 食品加工行业

Python随机抽取Excel数据并在处理后整合为一个文件

不在线第一只蜗牛

Python Excel

多功能代码编辑器BBEdit for Mac 激活版

小玖_苹果Mac软件

垃圾清理应用卸载工具CleanMyMac X for Mac

小玖_苹果Mac软件

【DevOps系列】企业度量难题破解:全面解析度量平台的核心能力

嘉为蓝鲸

DevOps 效能洞察 研发效能度量

TiDB 优化器 | 执行计划管理及实践

PingCAP

数据库 TiDB 优化器

外行如何速成专家?Embedding之BM25、splade稀疏向量解读

Zilliz

Milvus embedding向量 BM25 稀疏向量 splade

比特币网络及其经济基础的演变:从零到十万美元的非凡历程

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

技术揭秘:图形工作站、个人电脑和服务器的硬件差异

青椒云云电脑

图形工作站

会议通知:人工智能通识教育与实践发展暨和鲸科技AI通识课解决方案发布会

ModelWhale

人工智能 大数据 高校课改 通识课

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