Module 的语法【1】 | 青训营笔记

121 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第13天

export 命令

模块功能主要由两个命令构成:exportimportexport命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。

export命令除了输出变量,还可以输出函数或类(class)

通常情况下,export输出的变量就是本来的名字,但是可以使用as关键字重命名

function v1() { ... }
function v2() { ... }

export {
  v1 as streamV1,
  v2 as streamV2,
  v2 as streamLatestVersion
};

上面代码使用as关键字,重命名了函数v1v2的对外接口。重命名后,**v2可以用不同的名字输出两次**。

import 命令

使用export命令定义了模块的对外接口以后,其他 JS 文件就可以通过import命令加载这个模块。

// main.js
import { firstName, lastName, year } from './profile.js';

function setName(element) {
  element.textContent = firstName + ' ' + lastName;
}

如果想为输入的变量重新取一个名字,import命令要使用as关键字,将输入的变量重命名。

import { lastName as surname } from './profile.js';

import命令输入的变量都是只读的,因为它的本质是输入接口。也就是说,不允许在加载模块的脚本里面,改写接口。

import {a} from './xxx.js'

a = {}; // Syntax Error : 'a' is read-only;

但是,如果a是一个对象,改写a的属性是允许的

import {a} from './xxx.js'

a.foo = 'hello'; // 合法操作

上面代码中,a的属性可以改写,并且其他模块也可以读到改写后的值。不过不建议该写法,这种写法很难查错,建议凡是输入的变量,都当作完全只读,不要轻易改变它的属性。

import命令具有提升效果,会提升到整个模块的头部,首先执行。

但是我还是建议写在最头部

foo();
import { foo } from 'my_module';

模块的整体加载

除了指定加载某个输出值,还可以使用整体加载,即用星号(*)指定一个对象,所有输出值都加载在这个对象上面。

import * as circle from './circle';

console.log('圆面积:' + circle.area(4));
console.log('圆周长:' + circle.circumference(14));

注意,模块整体加载所在的那个对象(上例是circle),应该是可以静态分析的,所以不允许运行时改变。下面的写法都是不允许的。

import * as circle from './circle';

// 下面两行都是不允许的
circle.foo = 'hello';
circle.area = function () {};