HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

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

关注

评论

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

克服云安全挑战的5种方法

云计算

跨越异构鸿沟,Redis 迁移同步过程中的挑战与解决方案

京东科技开发者

云计算 大数据

入驻infoQ了

SwiftDD

平台写手

《你越迷茫,越要去闯》读书笔记

SwiftDD

读书笔记

万字长文带你解读Redisson分布式锁的源码

鄙人薛某

Java redis 分布式锁 redisson

理解RocketMQ

awen

RocketMQ 翻译 消息中间件

react代码切割之路由懒加载

前端小猪

React webpack

话题讨论 | 各地都有什么特别的元宵节活动?

happlyfox

社会话题 话题讨论 28天写作 2月春节不断更 话题王者

一文带你了解GaussDB(DWS) 的Roach逻辑备份实现原理

华为云开发者联盟

容灾 备份 GaussDB(DWS) 逻辑备份 Roach

手把手教你爬取优酷电影信息-2

happlyfox

学习 28天写作 2月春节不断更

水墨屏开发设备,旧 Kindle 改造而成

HelloGitHub

开源 硬件 kindle

让 AI “潜入”物流中心,你的快递很快就到!

华为云开发者联盟

华为 AI 数字化 物流 智慧物流

全面开放!华为云GaussDB(for openGauss)正式商用发布

华为云开发者联盟

数据 华为云 GaussDB 云数据库 GaussDB(for openGauss)

前端HTML5面试官和应试者一问一答

我是哪吒

html 程序员 大前端 28天写作 2月春节不断更

手把手教你爬取优酷电影信息-1

happlyfox

学习 爬虫 28天写作 2月春节不断更

只有两颗糖,什么时候给——再谈峰终定律

Justin

心理学 28天写作 游戏设计

太秀了!用Excel也能实现和Python数据分析一样的功能!

JackTian

Python 数据分析 Excel 2月春节不断更 实操案例

智慧党建APP开发,智慧党建平台的功能

13530558032

视频号直播和 PageRank 算法 [待完善]

小匚

机器学习

(28DW-S8-Day6)区块链如何解决双重支付及防篡改

mtfelix

比特币 区块链 防篡改 28天写作 双重支付

区块链电子证照共享平台--基于区块链的电子证照存证

13530558032

我看JAVA 之 Object & JNI

awen

Java jni Object

Jira Software Data Center 可以免费使用高级路线图啦!

Atlassian

DevOps 敏捷 Atlassian Jira

基于matlab的控制系统与仿真5-simulink仿真模型

AXYZdong

matlab 2月春节不断更

区块链数字版权平台--为内容版权保驾护航

13530558032

Linux入门篇 —— Linux软件安装(YUM & RPM & 源码)

若尘

Linux 源码 RPM安装 rpm yum

当深度学习遇上图: 图神经网络的兴起!

博文视点Broadview

你是不是一个害怕失去,而拒绝开始的人?

SwiftDD

读书笔记 工作体会

用Vue3构建企业级前端应用,TS能让你更轻松点

华为云开发者联盟

Vue 大前端 Vue3 ts 框架

为您收录的操作系统系列 - 线程小常识

鲁米

线程

Kafka.08 - 消息交付可靠性保障

insight

kafak 2月春节不断更

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