ES6模块化

作者: 好奇男孩 | 来源:发表于2018-05-13 12:43 被阅读27次
  • ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。

ES6 模块

  • 通过export命令显式指定输出的代码,再通过import命令输入。
// ES6模块
import { stat, exists, readFile } from 'fs';
  • 从fs模块加载 3 个方法,其他方法不加载。这种加载称为“编译时加载”或者静态加载,即 ES6 可以在编译时就完成模块加载

ES6 的模块自动采用严格模式

export 命令

  • export命令用于规定模块的对外接口
  • 一个模块就是一个独立的文件。该文件内部的所有变量,外部无法获取。如果你希望外部能够读取模块内部的某个变量,就必须使用export关键字输出该变量
// profile.js
export var firstName = 'Michael';
export var lastName = 'Jackson';
export var year = 1958;
// profile.js
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;

export {firstName, lastName, year};
  • export命令除了输出变量,还可以输出函数或类(class)
export function multiply(x, y) {
  return x * y;
};
  • 使用as关键字重命名
function v1() { ... }
function v2() { ... }

export {
  v1 as streamV1,
  v2 as streamV2,
  v2 as streamLatestVersion
};
  • 最后,export命令可以出现在模块的任何位置,只要处于模块顶层就可以。如果处于块级作用域内,就会报错
function foo() {
  export default 'bar' // SyntaxError
}
foo()

import 命令

  • 使用export命令定义了模块的对外接口以后,其他 JS 文件就可以通过import命令加载这个模块。
// main.js
import {firstName, lastName, year} from './profile.js';

function setName(element) {
  element.textContent = firstName + ' ' + lastName;
}
  • 使用as关键字,将输入的变量重命名。
import { lastName as surname } from './profile.js';
  • import命令输入的变量都是只读的,因为它的本质是输入接口。也就是说,不允许在加载模块的脚本里面,改写接口
import {a} from './xxx.js'

a = {}; // Syntax Error : 'a' is read-only;
  • import后面的from指定模块文件的位置,可以是相对路径,也可以是绝对路径
  • .js后缀可以省略。如果只是模块名,不带有路径,那么必须有配置文件,告诉 JavaScript 引擎该模块的位置
  • import命令具有提升效果,会提升到整个模块的头部,首先执行
foo();
import { foo } from 'my_module';
  • 多次重复执行同一句import语句,那么只会执行一次
import { foo } from 'my_module';
import { bar } from 'my_module';

// 等同于
import { foo, bar } from 'my_module';

模块的整体加载

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

export function area(radius) {
  return Math.PI * radius * radius;
}

export function circumference(radius) {
  return 2 * Math.PI * radius;
}
// main.js

import { area, circumference } from './circle';

console.log('圆面积:' + area(4));
console.log('圆周长:' + circumference(14));
import * as circle from './circle';

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

export default 命令

  • 为模块指定默认输出
// export-default.js
export default function () {
  console.log('foo');
}
  • 其他模块加载该模块时,import命令可以为该匿名函数指定任意名字
// import-default.js
import customName from './export-default';
customName(); // 'foo'

模块的继承

// circleplus.js

export { area as circleArea } from 'circle';

浏览器加载 ES6 模块

<script type="module" src="./foo.js"></script>

相关文章

  • 第4章 ES6模块化

    目标 模块化系统演进 ES6模块化实现 模块化概述 在 ES6 之前,社区制定了一些模块加载方案,最主要的有 Co...

  • 第4章 ES6模块化

    目标 模块化系统演进 ES6模块化实现 模块化概述 在 ES6 之前,社区制定了一些模块加载方案,最主要的有 Co...

  • 十二、模块化

    1、es6 2、闭包模块化

  • 如何在项目中使用webapck

    随着ES6的推进,从以往的CommonJS和AMD。到如今ES6中的module方案,前端模块化越来越成熟,模块化...

  • 前端模块化:ES6,CommonJS

    前端模块化 共有四种规范 ES6 Module CommonJS AMD CMD ES6 Module ES6模块...

  • 当import/export、require/module.ex

    ES6的模块化: import export default common.js的模块化: require mod...

  • ES6模块化

    模块化技术有哪些:- CommonJS(nodejs)、ES6模块化、AMD、CMD等 CommonJS:Comm...

  • JS-模块化

    ES6从官方标准带来了模块化开发规范。下面主要介绍ES6模块化开发当中最重要的export和import概念。 1...

  • js模块化规范

    一、js模块化1、模块化规范: script CommonJS AMD CMD ES6 modules 2、scr...

  • vue5

    es6新内容 class 解构赋值 扩展对象 模块化 什么是模块化 模块的作用 怎么实现模块化 模块化的标准 Co...

网友评论

    本文标题:ES6模块化

    本文链接:https://www.haomeiwen.com/subject/odekdftx.html