美文网首页
Module 语法

Module 语法

作者: Mjericho | 来源:发表于2017-04-03 17:18 被阅读0次

    Module 语法

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

    import {stat,exists,readFile} from 'fs';
    

    上述代码的实质是从 fs 模块加载3个方法,其它方法不加载,这种加载称为"编译时加载"或者静态加载。即ES6 可以在编译时就完成模块加载。

    由于 ES6 模块是编译时加载,使得静态分析称为可能,有了它,就能进一步扩宽 JavaScript 的语法,比如引入宏和类型检验,这些只能靠静态分析实现的功能。

    除了静态加载带来的各种好处, ES6 模块还有以下好处。

    export 命令

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

    一个模块就是一个独立的文件,该文件内部的所有变量,外部无法获取,如果你希望外部能够读取模块内部的某个变量,就必须使用 export关键字输出该变量。

    //profile.js
    export var firstName = '张';
    export var lastName = "某人";
    

    上述代码是 profile.js 文件,ES6 将其视为一个模块,里面用 export 命令对外部输出了三个变量。

    exportde写法,除了上面样子还有另外一种

    var firstName = '张';
    var lastName = '某人';
    
    export {firstName, lastName};
    

    上面代码在 export 命令后面,使用大括号指定所要输出的一组变量,

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

    export function multiply(x,y){
    return x * y;
    };
    

    上述代码对外输出一个函数 multiply

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

    function v1(){...};
    function v2(){...};
    
    export {
    v1 as streamV1;
    v2 as streamV2;
    v2 as streamLatestVerson;
    }
    

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

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

    //报错
    export 1;
    
    // 报错
    var m = 1;
    export m;
    

    上面两种写法都会报错,因为没有提供对外的接口,第一种写法直接输出1,第二种写法通过变量 m, 还是直接输出1,1只是一个值,不是接口,正确的写法是下面这样.

    // 写法1
    export var m=1;
    
    // 写法2
    var m = 1;
    export {m};
    
    // 写法3
    var n=1;
    export {n as m};
    

    同样, functionclass 的输出,也必须遵守这样的写法.

    // 报错
    function f(){}
    export f;
    
    // 正确
    export function f(){};
    
    // 正确
    function f(){}
    export {f};
    

    另外, export 语句输出的接口,与其对应的值是动态绑定关系,即通过该接口,可以取到模块内部实时的值。

    export var foo = 'bar';
    

    import 命令

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

    import {firstName,lastName} from './profile';
    
    function setName(element){
    element.textContent = firstName + '' + lastName;
    }
    

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

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

    import 后面的 from 指定模块文件的位置,可以是相对路径,也可以是绝对路径,.js 路径可以省略,如果只是模块名,不带有路径,那么必须有配置文件,告诉 JavaScript 引擎该模块的位置。

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

    foo();
    import {foo} from 'my module';
    

    上面代码不会报错,因为 import的执行早于 foo的调用,这种行为的本质是: import 命令时编译阶段执行的,在代码运行之前。

    由于 import是静态执行,所以不能使用表达式和变量,这些只有在运行时才能得到结果的语法结构.

    // 报错
    import {'f'+'oo'} from 'my_module';
    

    模块的整体加载

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

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

    现在加载这个模块

    import (area, circumferernce) from './circle';
    

    上面的写法是逐一制定要加载的方法,整体加载的写法如下:

    import * as circle from './circle';
    

    注意整体加载所在的那么对象,应该是可以静态分析的,所以不允许运行时改变。

    export default 命令

    在使用 import 命令的时候,用户需要知道索要加载的变量名或函数名,否则无法加载,但是用户肯定希望快速上手,未必愿意阅读文档,去了解模块有哪些属性和方法。

    为了给用户提供方便,让他们不用阅读文档就能加载模块,就要用到 export default 命令,为模块指定默认输出。

    // export default.js
    export default function(){
    }
    

    上面代码是一个模块文件 export-default.js, 它的默认输出是一个函数。其他模块加载该模块时,import命令可以为该匿名函数指定任意名字。

    import customName from './export-default';
    customName();
    

    上面代码的 import 命令,可以用任意名称指向 export-default.js 输出的房啊,这时就不需要知道原模块输出的函数名,需要注意的是,这时 import命令后面,不使用大括号。

    export default 命令用在非匿名函数前,也是可以的。

    默认输出和正常输出

    // 第一组
    export default function crc32(){
    //输出
    }
    
    import crc32 from 'crc32'; // 输入
    
    // 第二组
    
    export function crc32(){
    // 输出
    };
    
    import {crc32} from 'crc32';// 输入
    

    export default 命令用于指定模块的默认输出,显然,一个模块只能有一个默认输出,因此 export default 命令只能使用一次,所以, import命令后面才不用加大括号,因为只可能对应一个方法。

    本质上, export default 就是输出一个叫做 default 的变量或房啊,然后系统允许你为它取任意名字,export default a 的含义是将变量 a的值赋给变量 default

    同样的,因为 export default 本质是将该命令后面的值,赋给 default 变量以后再默认,所以直接将一个值写在 export default之后。

    有了 export default 命令,输入模块时就非常直观了,以输入

    相关文章

      网友评论

          本文标题:Module 语法

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