export/import导出/导入模块
默认情况下,JavaScript中在模块内的所有声明都是本地的,外部无法访问。如果需要公开模块中部分声明的内容,并让其它模块加以使用,这个时候就需要导出功能,最简单的方式是添加export关键字导出模块。
可以导出的内容包括类、函数以及var、let和const修饰的变量。export命令可以出现在模块的任何位置,只要处于模块顶层就可以。如果处于块级作用域内,就会报错,import命令也是如此。
使用export命令定义了模块的对外接口以后,其他 JS 文件就可以通过import命令加载这个模块。
import命令具有提升效果,会提升到整个模块的头部,首先执行。由于import是静态执行,所以不能使用表达式和变量,这些只有在运行时才能得到结果的语法结构。
一、default导入导出 default import/export
每个模块仅有一个default的导出,导出内容可以是一个function、class,object等。因为这种方式被当做主要的导出内容,导入方式最为简单。
// there is no semi-colon here
export default function() {}
export default class {}
class A extends Component{
export default A;
//对应的import示例。
import A from './requireTest'
//default export, 输入 lodash 模块
import _ from 'lodash';
//一条import语句中,同时输入默认方法和其他变量
import _, { each } from 'lodash';
//上述代码对应的export语句
export default function (obj) {
// ···
export function each(obj, iterator, context) {
// ···
export { each as forEach };
注意:一个模块仅仅只允许导出一个default对象,实际导出的是一个default命名的变量进行重命名,等价语句如下。所以import后可以是任意变量名称,且不需要{}。
import any from './requireTest'
import {default as any } from './requireTest'
二、named 导入导出
需要特别注意的是,export命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。另外,export语句输出的接口,与其对应的值是动态绑定关系,即通过该接口,可以取到模块内部实时的值。
import命令接受一对大括号,里面指定要从其他模块导入的变量名。大括号里面的变量名,必须与被导入模块(profile.js)对外接口的名称相同。如果想为输入的变量重新取一个名字,import命令要使用as关键字,将输入的变量重命名。
import后面的from指定模块文件的位置,可以是相对路径,也可以是绝对路径,.js路径可以省略。如果只是模块名,不带有路径,那么必须有配置文件,告诉 JavaScript 引擎该模块的位置。
// profile.js
//第一种export
export var firstName = 'Michael';
export function f() {};
//第二种export,优先使用这种写法
var firstName = 'Michael';
export {firstName};
function f() {}
export {f};
//main.js
import { firstName, f } from './profile';
import { firstName as surname } from './profile';
三、重命名导入导出
export { myFunction }; // exports a function declared earlier
export const foo = Math.sqrt(2); // exports a constant
import不同模块的导出内容时,必须保持命名的唯一性。此时可以用重命名来解决,包括以下两类。
//导出的时候重命名
function v1() { ... }
function v2() { ... }
export {
v1 as streamV1,
v2 as streamV2,
v2 as streamLatestVersion //可以用两个不同的名称导出相同的值
//导入的时候重命名
// 这两个模块都会导出以`flip`命名的东西。同时导入两者,需要将其中一个的名称改掉。
import {flip as flipOmelet} from "eggs.js";
import {flip as flipHouse} from "real-estate.js";
四、export和import的复合写法
如果在一个模块之中,先输入后输出同一个模块,import语句可以与export语句写在一起。
export { foo, bar } from 'my_module';