ES6 模块化笔记

ES6 模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。

ES6 模块不是对象,而是通过export命令显式指定输出的代码,再通过import命令输入。

// ES6模块
import { stat, exists, readFile } from ‘fs‘;


需要特别注意的是,export命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。

export常用的写法如下:

 1 // 写法1
 2 export var firstName = ‘Michael‘;
 3 export var lastName = ‘Jackson‘;
 4 export var year = 1958;
 5
 6 // 写法2
 7 var firstName = ‘Michael‘;
 8 var lastName = ‘Jackson‘;
 9 var year = 1958;
10
11 export {firstName, lastName, year};
12
13 // 写法3
14
15 var firstName = ‘Michael‘;
16 var lastName = ‘Jackson‘;
17 var year = 1958;
18
19 export {
20   firstName as variable1,
21   lastName as variable2,
22   year as variable3
23 };
24
25 // 方法1
26 export function multiply(x, y) {
27   return x * y;
28 };
29
30 // 方法2
31 function v1() { ... }
32 function v2() { ... }
33
34 export { v1,v2 };
35
36 // 方法3
37 function v1() { ... }
38 function v2() { ... }
39 export {
40   v1 as streamV1,
41   v2 as streamV2,
42   v2 as streamLatestVersion
43 };


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

import是静态执行,所以不能使用表达式和变量。

1 import { lastName as surname } from ‘./profile‘;
2 foo();
3 // import命令是编译阶段执行的,在代码运行之前,所以foo已经被赋值
4 import { foo } from ‘my_module‘;

import语句会执行所加载的模块,因此可以有下面的写法。

import ‘lodash‘;


模块的整体加载,即用星号(*)指定一个对象,所有输出值都加载在这个对象上面。

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

 1 // circle.js
 2
 3 export function area(radius) {
 4   return Math.PI * radius * radius;
 5 }
 6
 7 export function circumference(radius) {
 8   return 2 * Math.PI * radius;
 9 }
10
11 // main.js
12
13 import { area, circumference } from ‘./circle‘;
14
15 console.log(‘圆面积:‘ + area(4));
16 console.log(‘圆周长:‘ + circumference(14));
17
18 // 第二种写法
19 import * as circle from ‘./circle‘;
20
21 console.log(‘圆面积:‘ + circle.area(4));
22 console.log(‘圆周长:‘ + circle.circumference(14));


export default命令,为模块指定默认输出。

1 // export-default.js
2 export default function () {
3   console.log(‘foo‘);
4 }
5
6 // import-default.js
7 import customName from ‘./export-default‘;
8 customName(); // ‘foo‘

本质上,export default就是输出一个叫做default的变量或方法,然后系统允许你为它取任意名字。所以,下面的写法是有效的。

 1 // modules.js
 2 function add(x, y) {
 3   return x * y;
 4 }
 5 export {add as default};
 6 // 等同于
 7 // export default add;
 8
 9 // app.js
10 import { default as xxx } from ‘modules‘;
11 // 等同于
12 // import xxx from ‘modules‘;

正是因为export default命令其实只是输出一个叫做default的变量,所以它后面不能跟变量声明语句。

1 // 正确
2 export var a = 1;
3
4 // 正确
5 var a = 1;
6 export default a;
7
8 // 错误
9 export default var a = 1;

原文地址:https://www.cnblogs.com/dahe1989/p/7117898.html

时间: 2024-10-18 22:31:05

ES6 模块化笔记的相关文章

es6学习笔记初步总结

es6学习笔记初步总结 1. let.const 和 block 作用域 在ES6以前,var关键字声明变量.无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部).这就是函数变量提升例如: let 关键词声明的变量不具备变量提升(hoisting)特性 let 和 const 声明只在最靠近的一个块中(花括号内)有效 当使用常量 const 声明时,请使用大写变量,如:CAPITAL_CASING const 在声明时必须被赋值 否则报语法错误SyntaxError

###大一统的模块化规范-es6模块化

1.node.js中通过babel体验es6模块化 npm安装 babel.config.js ###ES6模块化的基本语法 1.默认导出与导入 export default import 接收名称 from '模块标识符' 2.按需导出--export let s1 = 'aaa' ####直接导入并执行模块代码 我们只想单纯执行某个模块中的代码,并不需要得到模块中向外暴露的成员,此时,可以直接导入并执行模块代码 当前文件模块为m2.js 在当前模块中执行依据各for循环操作 for(let 

ES6 模块化module

导入 // ES6 模块化; // 导入 和 导出 // 例如:a.js 需要 b.js 的逻辑 // 导入: import {a,b} from './b.js'; console.log(a,b); import {a as c,b as d} from './b.js'; console.log(c,d); import {e} from './b.js'; console.log(e); import myobj from './b.js'; console.log(myobj); im

ES6学习笔记(1)——模块化

最近学习ReactJS经常遇见ES6语法,为了尽快弄懂ReactJS,因此想方设法绕过ES6,但是随着学习的深入,需要查阅的资料越来越多,发现大部分与之相关的框架和学习资料都是采用ES6写的,终究发现这是一个绕不过去的坎啊.ES6是JavaScript新一代的标准规范,其主要变化为:变量的解构赋值.箭头函数.Generator函数.Promise对象.类与继承.模块化这几个大方面,我学习时为了能看懂ES6写的代码,就先从这几个大的方面开始下手了,细节部分随着应用的需要再去查阅资料,学习参考资料为

我的es6学习笔记

前两个月看了一套es6的教程,现在将当时我做的笔记分享出来,与大家一起分享,我的不足之初也希望大家可以指出来.虽然简单学过一遍,但是我项目中用到的也就const,let,解构赋值,默认参数,箭头函数,promiss,模板字符串差不多这几个吧,其他的还不是很了解.现在再拿出来结合阮一峰老师的书再重新的学习一遍. ES6 npm install babel-cli -g npm install babel-cli babel-preset-es2015 --save-dev babel es6.js

es6读书笔记(四)——顶层对象

ES6一方面规定,为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性:另一方面规定,let命令.const命令.class命令声明的全局变量,不属于顶层对象的属性.也就是说,从ES6开始,全局变量将逐步与顶层对象的属性脱钩. var a = 1; // 如果在Node的REPL环境,可以写成global.a // 或者采用通用方法,写成this.a window.a // 1 let b = 1; window.b // undefined ES5之中,顶层对象

ES6学习笔记(二)——字符串扩展

相信很多人也和我一样,不喜欢这样循规蹈矩的逐条去学习语法,很枯燥乏味.主要是这样学完一遍之后,没过一段时间就忘到九霄云外了.不如实际用到的时候研究它记得牢靠,所以我就整理成笔记,加深记忆的同时便于复习查看. 在这样不断的学习过程中,也提高了自己的总结能力:) 1.字符串的遍历器接口 ES5,数组和对象可以进行遍历,使用for() 和 for...in,还有jq中的each()方法进行遍历. ES6为我们提供了字符串遍历器  for...of 循环遍历 优点:可以识别大于0xFFFF的码点,传统的

js 模块化的一些理解和es6模块化学习

模块化 1 IIFE 2 commonjs 3 浏览器中js的模块化 4 简单理解模块加载器的原理  5 es6 之前在参加百度前端技术学院做的小题目的时候,自己写模块的时候 都是写成立即调用表达式(IIFE)的模式,比如单个功能的时候当时想到是不会涉及到全局变量的污染,在封装基础的模块(比如里面的表单验证功能) (function(win){ var obj = {}; function add() { console.log("add"); } obj.add = add; win

ES6学习笔记<五> Module的操作——import、export、as

import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小工程,再用一种简单的方法把这些小工程连接在一起. 这有可能导致两个问题: 一方面js代码变得很臃肿,难以维护 另一方面我们常常得很注意每个script标签在html中的位置,因为它们通常有依赖关系,顺序错了可能就会出bug 在es6之前为解决上面提到的问题,我们得利用第三方提供的一些方案,主要有两种