• 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;
  • 相关阅读:
    如何制作挖空的填空题试卷?
    原型制图工具有哪些?
    书籍推荐?来几本吧
    离线部署ELK+kafka日志管理系统【转】
    Elasticsearch5.0 安装问题集锦【转】
    在Nginx服务器上屏蔽IP
    MySQL Warning: Using a password on the command line interface can be insecure.解决办法
    不老的神器:安全扫描器Nmap渗透使用指南【转】
    MySQL数据库设置为只读及测试【转】
    Linux中切换用户变成-bash4.1-$的解决方法
  • 原文地址:https://www.cnblogs.com/dahe1989/p/7117898.html
Copyright © 2020-2023  润新知