zoukankan      html  css  js  c++  java
  • export、export default和module.exports的用法及区别

    概述

    历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如 Ruby 的require、Python 的import,甚至就连 CSS 都有@import,但是 JavaScript 任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍。

    在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种。前者用于服务器,后者用于浏览器。ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。

    ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。比如,CommonJS 模块就是对象,输入时必须查找对象属性。

    模块功能主要由两个命令构成:exportimportexport命令用于规定模块的对外接口(即导出模块),import命令用于输入模块(即导入模块)。

    其中使用import命令的时候,用户需要知道所要加载的变量名或函数名,否则无法加载,所以ES6为用户提供了更方便的方法export default

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

    所以通过以上用法可以总结export default和export区别

    1、export default 向外暴露的成员,可以使用任意变量来接收

    2、在一个模块中,export default 只允许向外暴露一次

    3、在一个模块中,可以同时使用export default 和export 向外暴露成员

    4、使用export向外暴露的成员,只能使用{  }的形式来接收,这种形式,叫做【按需导出】

    5、export可以向外暴露多个成员,同时,如果某些成员,在import导入时,不需要,可以不在{ }中定义

    6、使用export导出的成员,必须严格按照导出时候的名称,来使用{ }按需接收

    7、使用export导出的成员,如果想换个变量名称接收,可以使用as来起别名

    用法

    其中 export default、export、import 属于ES6产物,module.exports和require属于node.js产物。

    node中导入模块:var 名称 = require('模块标识符')

    node中向外暴露成员的形式:module.exports = {}

    export

    用法1

    1
    2
    3
    export var firstName = 'Michael';
    export var lastName = 'Jackson';
    export var year = 1958;

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

    用法2

    1
    2
    3
    4
    5
    var firstName = 'Michael';
    var lastName = 'Jackson';
    var year = 1958;
     
    export { firstName, lastName, year };

    上面代码在export命令后面,使用大括号指定所要输出的一组变量。它与前一种写法(直接放置在var语句前)是等价的,但是应该优先考虑使用这种写法。因为这样就可以在脚本尾部,一眼看清楚输出了哪些变量。

    用法3

    1
    2
    3
    4
    export function multiply(x, y) {
      return x * y;
    }
    //export命令除了输出变量,还可以输出函数或类(class)

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function v1() { ... }
    function v2() { ... }
     
    export {
      v1 as streamV1,
      v2 as streamV2,
      v2 as streamLatestVersion
    };
    //上面代码使用as关键字,重命名了函数v1和v2的对外接口。重命名后,v2可以用不同的名字输出两次。
    //as的作用 => 将 xxx 重新命名为 xxx

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

    1
    2
    3
    4
    5
    6
    7
    // 报错
    export 1;
    // 报错
    var m = 1;
    export m;
     
    //上面两种写法都会报错,因为没有提供对外的接口。第一种写法直接输出 1,第二种写法通过变量m,还是直接输出 1

    也就是说用export 导出模块的时候,如果变量或函数提前定义好了导出是必须加 {}, 如果没有提前定义导出是必须以命名(定义的)的方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    // 报错
    export 1;
    // 报错
    var m = 1;
    export m;
    // 报错
    function f() {}
    export f;
     
    // 正确
    export var m = 1;
    // 正确
    var m = 1;
    export {m};
    // 正确
    var n = 1;
    export {n as m};
    // 正确
    export function f() {};
    // 正确
    function f() {}
    export {f}; 

    import

    注意2点

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // 报错
    import 'f' 'oo' } from 'my_module';
     
    // 报错
    let module = 'my_module';
    import { foo } from module;
     
    // 报错
    if (x === 1) {
      import { foo } from 'module1';
    else {
      import { foo } from 'module2';
    }

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

    1
    2
    3
    4
    5
    6
    7
    export function area(radius) {
      return Math.PI * radius * radius;
    }
     
    export function circumference(radius) {
      return 2 * Math.PI * radius;
    }

    import 导入上面代码所有值方式

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

    export default

    export default命令,为模块指定默认输出。export default如果导出变量时必须时匿名,如果导出函数时可以时命名也可以匿名

    导出变量

    1
    2
    3
    4
    5
    6
    7
    8
    // 正确
    var a = 1;
    export default a;
    //或者
    export default 1; //这样做没有实际意思
     
    // 错误
    export default var a = 1;

    导出函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    export default function () {
      console.log('foo');
    }
    //或者
    export default function foo() {
      console.log('foo');
    }
    // 或者
    function foo() {
      console.log('foo');
    }
    export default foo;

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

    原文

  • 相关阅读:
    解析大型.NET ERP系统 权限模块设计与实现
    Enterprise Solution 开源项目资源汇总 Visual Studio Online 源代码托管 企业管理软件开发框架
    解析大型.NET ERP系统 单据编码功能实现
    解析大型.NET ERP系统 单据标准(新增,修改,删除,复制,打印)功能程序设计
    Windows 10 部署Enterprise Solution 5.5
    解析大型.NET ERP系统 设计异常处理模块
    解析大型.NET ERP系统 业务逻辑设计与实现
    解析大型.NET ERP系统 多国语言实现
    Enterprise Solution 管理软件开发框架流程实战
    解析大型.NET ERP系统 数据审计功能
  • 原文地址:https://www.cnblogs.com/mmzuo-798/p/13050738.html
Copyright © 2011-2022 走看看