javascript 模块化开发(exportimport与JavaScript模块机制)

在ES6之前,JavaScript中并没有在语言标准中提供模块定义规范,这对开发规模较大、较复杂的应用造成一定的影响。而在非语言层面,一些开源社区制定了模块定义规范,主要有CommonJS和AMD两种。在ES6中,定义了"import"和"export"两种语法声明,从而在语言面实现了模块功能。

1. ECMAScript 6的模块化

1.1 ECMAScript 6之前的模块化

JavaScript最初被设计时并不是用来大型应用的,所以在其设计中也并没有模块化标准。随着其应用越来越广泛,一些开源社区和开发者提出了一些模块标准,如:CommoneJS模块化、异步模块定义(AMD)等。这些规范在提出后得到了广泛关注,并逐步被应用到了一些企业级的大型应用。

CommoneJS模块化:该标准最成功的应用是Node.js(Node.js在CommoneJS的基础上就进行了一定的扩展)。其主要特点是语法简洁,模块使用同步加载机制,主要使用在服务器端。

异步模块定义(AMD):该标准的典型应该是RequireJS。其主要特点是模块使用异步加载,主要使用在浏览器端。

1.2 ES6模块机制

ECMAScript 6基于"export"和"import",定义了模块的导出和导入规范,在语言标准层面实现了模块机制。该标准的目标是创建一种能够兼容CommoneJS和AMD两标准的规范,即可以像CommoneJS一样语法简洁、使用单一的接口且支持循环依赖,又可以像AMD支持异步加载和可配置的模块加载。

  • 声明语法(定义引入与导出)

  • 编程式加载接口(API):用于配置如何加载模块和按条件加载模块

  • ES6的模块机制具有以下特点:

    • 简洁的语法。语法将比CommoneJS更简单,只使用"export"和"import"实现模块的导出和导入

      • 使用export关键字定义导出对象,这个关键字可以无限次使用

      • 使用import关键字引入导入对象,这个关键字可导入任意数量的模块

    • 模块结构可以做静态分析。这使得在编译时就能确定模块的依赖关系,以及输入和输出的变量

    • 模块支持异步加载

    • 为加载模块提供编程支持,可以按需加载

    • 比CommonJS更优秀的循环依赖处理

    1.3 支持状况

    ES6为JavaScript带来了模块机制,但ES6的模块机制在当前所有的浏览器及Node.js中均不受支持。但我们可以通过一些编译器来对ES6语法进行转换,从而利用这些新特性给我们项目带来便利:

    • Babel-Babel是一个ES6语法转换为ES5语法的转换器,其支持对ES6模块语法的转换,包括:异步加载、状态隔离、顶级命名空间隔离等

    • es6-module-transpiler -将ES6模块编译为AMD规范或者CommonJS规范的模块

    • ES6 module loader-能支持动态加载ES6风格的模块

    • Traceur-Google开发的JS转换编译器,目的在于支持更多的JavaScript特性包括ES6模块

    2. "export"与模块导出

    2.1 "export"概述

    "export"语法声明用于导出函数、对象、指定文件(或模块)的原始值。"export"有两种模块导出方式:命名式导出(名称导出)和定义式导出(默认导出),命名式导出每个模块可以多个,而默认导出每个模块仅一个。

    "export"可能会有以下几种形式的导出语法:

    javascript 模块化开发(exportimport与JavaScript模块机制)(1)

    • name1… nameN-导出的“标识符”。导出后,可以通过这个“标识符”在另一个模块中使用"import"引用

    • default-设置模块的默认导出。设置后"import"不通过“标识符”而直接引用默认导入

    • *-继承模块并导出继承模块所有的方法和属性

    • as-重命名导出“标识符”

    • from-从已经存在的模块、脚本文件…导出

    2.2 模块导出相关介绍

    命名式导出

    模块可以通过export前缀关键词声明导出对象,导出对象可以是多个。这些导出对象用名称进行区分,称之为“命名式导出”。

    javascript 模块化开发(exportimport与JavaScript模块机制)(2)

    我们可以使用"*"和"from"关键字来实现的模块的继承:

    javascript 模块化开发(exportimport与JavaScript模块机制)(3)

    模块导出时,可以指定模块的导出成员。导出成员可以认为是类中的公有对象,而非导出成员可以认为是类中的私有对象:

    javascript 模块化开发(exportimport与JavaScript模块机制)(4)

    模块导出时,我们可以使用"as"关键字对导出成员进行重命名:

    javascript 模块化开发(exportimport与JavaScript模块机制)(5)

    默认导出

    默认导出也被称做“定义式导出”。命名式导出可以导出多个值,但在在import引用时,也要使用相同的名称来引用相应的值。而默认导出每个导出只有一个单一值,这个输出可以是一个函数、类或其它类型的值,这样在模块import导入时也会很容易引用。

    javascript 模块化开发(exportimport与JavaScript模块机制)(6)

    命名式导出与默认导出

    默认导出可以理解为另一种形式的命名导出,默认导出可以认为是使用了"default"名称的命名导出。

    下面两种导出方式是等价的:

    javascript 模块化开发(exportimport与JavaScript模块机制)(7)

    2.3 "export"使用示例

    使用名称导出一个模块时:

    javascript 模块化开发(exportimport与JavaScript模块机制)(8)

    在另一个模块(脚本文件)中,我们可以像下面这样引用:

    javascript 模块化开发(exportimport与JavaScript模块机制)(9)

    使用默认导出一个模块时:

    javascript 模块化开发(exportimport与JavaScript模块机制)(10)

    在另一个模块(脚本文件)中,我们可以像下面这样引用,相对名称导出来说使用更为简单:

    javascript 模块化开发(exportimport与JavaScript模块机制)(11)

    3. "import"

    3.1 "import"概述

    import语法声明用于从已导出的模块、脚本中导入函数、对象、指定文件(或模块)的原始值。import模块导入与export模块导出功能相对应,也存在两种模块导入方式:命名式导入(名称导入)和定义式导入(默认导入)。

    "import" 可能会有以下几种形式的导入语法:

    javascript 模块化开发(exportimport与JavaScript模块机制)(12)

    • name-从将要导入模块中收到的导出值的名称

    • member, memberN-从导出模块,导入指定名称的多个成员

    • defaultMember-从导出模块,导入默认导出成员

    • alias, aliasN-别名,对指定导入成员进行的重命名

    • module-name-要导入的模块。是一个文件名

    • as-重命名导入成员名称(“标识符”)

    • from-从已经存在的模块、脚本文件等导入

    3.2 模块导入相关介绍

    命名式导入

    我们可以通过指定名称,就是将这些成员插入到当作用域中。导出时,可以导入单个成员或多个成员:

    javascript 模块化开发(exportimport与JavaScript模块机制)(13)

    通过*符号,我们可以导入模块中的全部属性和方法。当导入模块全部导出内容时,就是将导出模块('my-module.js')所有的导出绑定内容,插入到当前模块('myModule')的作用域中:

    javascript 模块化开发(exportimport与JavaScript模块机制)(14)

    导入模块对象时,也可以使用as对导入成员重命名,以方便在当前模块内使用:

    javascript 模块化开发(exportimport与JavaScript模块机制)(15)

    导入多个成员时,同样可以使用别名:

    javascript 模块化开发(exportimport与JavaScript模块机制)(16)

    导入一个模块,但不进行任何绑定:

    javascript 模块化开发(exportimport与JavaScript模块机制)(17)

    默认导入

    在模块导出时,可能会存在默认导出。同样的,在导入时可以使用import指令导出这些默认值。

    直接导入默认值:

    javascript 模块化开发(exportimport与JavaScript模块机制)(18)

    也可以在命名空间导入和名称导入中,同时使用默认导入:

    javascript 模块化开发(exportimport与JavaScript模块机制)(19)

    javascript 模块化开发(exportimport与JavaScript模块机制)(20)

    3.3 "import"使用示例

    导入一个二级文件,用于在当前模块中进行AJAX JSON请求:

    javascript 模块化开发(exportimport与JavaScript模块机制)(21)

    来自:http://itbilu.com

    交流群:564850876

    ,

    免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

      分享
      投诉
      首页