看透JavaScript:原理、方法与实践
上QQ阅读APP看书,第一时间看更新

10.1 模块的基本用法

模块最基础的用法就是导出和导入,分别使用export和import关键字来操作,例如下面的例子。

    //siteInfo.js
    export var siteName = "excelib";
    export var domainName = "www.excelib.com";


    //app.js
    import { siteName, domainName } from "./siteInfo";
    console.log(siteName);      //excelib
    console.log(domainName);    //www.excelib.com

这个例子中有两个文件,在siteInfo.js中定义了模块,并使用export导出了两个变量siteName和domainName,在app.js中使用import将它们导入,这时在app.js中就可以使用这两个变量了。

只有模块中导出的变量(实际可能是变量、函数或者类等,这里统一称作变量)才可以被其他文件导入,并且只有导入相应的变量之后才可以使用,如果上述例子中的app.js文件中只导入了siteName,就无法使用domainName。导出时使用export关键字,将要导出的变量放到export后面,可以在定义时直接导出,也可以在定义完成后统一导出。如果统一导出则需要将要导出的变量使用花括号括起来。导入时使用import关键字,格式为:import { 变量名 } from "Module",这里的模块就是定义模块的文件名去除.js后缀,文件名是包含路径的,可以是相对路径,也可以是完整路径。我们再来看个例子。

    //siteInfo.js
    var siteName = "excelib";
    var domainName = "www.excelib.com";
    function getSiteName(){
        return siteName;
    }
    function getDomainName(){
        return domainName;
    }
    export {getSiteName, getDomainName};


    //app.js
    import { getSiteName } from "./siteInfo";
    console.log(getSiteName());      //excelib
    console.log(domainName);         //出错,因为domainName没有导出
    console.log(getDomainName());    //出错,因为getDomainName没有导入

这个例子在定义模块的siteInfo.js文件中添加了getSiteName和getDomainName两个函数,并将导出语句export单独放到最后,并且没有直接导出siteName和domainName属性,而是导出了getSiteName和getDomainName函数。在app.js中只导入了getSiteName函数,这时在app.js中就只可以调用模块的getSiteName方法,而调用domainName和getDomainName都会出错。这是因为domainName没有被导出,而getDomainName虽然在模块中导出了,但是app.js中没有导入。