注册 登录

清河洛

ES6中的模块

qingheluo2023-04-21清河洛345
在ES6之前,JavaScript一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来其他语言都有这项功能,如Ruby的require、Python的import,甚至连CSS都有@import,这对开发大型的、复杂的项目形成了巨大障碍在ES6之前,社区制定了一些模块加载方案,如CommonJS 和 AMD 两种,但它们都只能“运行时加载”如CommonJS模块就是对象,输入时必须查找对象属性 // CommonJS模块 let { stat, end } = require('fs'); // 等同于 let _fs =...

在ES6之前,JavaScript一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来

其他语言都有这项功能,如Ruby的require、Python的import,甚至连CSS都有@import,这对开发大型的、复杂的项目形成了巨大障碍

在ES6之前,社区制定了一些模块加载方案,如CommonJS 和 AMD 两种,但它们都只能“运行时加载”

如CommonJS模块就是对象,输入时必须查找对象属性
// CommonJS模块
let { stat, end } = require('fs');

// 等同于
let _fs = require('fs');
let stat = _fs.stat;
let end = _fs.end;

上面代码实质是整体加载fs模块的所有方法,生成一个对象(_fs),然后再从这个对象上面读取指定方法
这种加载称为“运行时加载”,因为只有运行时才能得到这个对象,导致完全没办法在编译时做“静态优化”

ES6模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量,它通过export命令显式指定输出的代码,再通过import命令输入

// ES6模块
import { stat, end } from 'fs';

上面代码实质是从fs模块仅加载指定方法,其他方法不加载
这种加载称为“编译时加载”或者静态加载,可以在编译时就完成模块加载,效率高

除了静态加载带来的好处,ES6模块还有以下好处:

不再需要UMD模块格式了,将来服务器和浏览器都会支持ES6模块格式
将来浏览器的新API就能用模块格式提供,不再必须做成全局变量或者navigator对象的属性
不再需要对象作为命名空间(如Math对象),未来这些功能可以通过模块提供

ES6的模块功能实现得相当简单并且高效,完全可以取代之前社区制定的一些模块加载方案,成为浏览器和服务器通用的模块解决方案

ES6的模块默认并且强制开启严格模式,无论有没有在模块头部加上"use strict"语句

ES6中的模块功能主要由两个命令构成:export和import

export命令用于规定模块的对外接口,一个模块就是一个独立的文件,该文件内部的所有变量,外部无法获取,必须使用export关键字输出该允许外部能够读取模块内部的指定变量

import命令用于输入其他模块提供的功能

ES6中的export模块导出命令

ES6中的import模块导入命令



网址导航