美文网首页
es6的module使用,imort,export

es6的module使用,imort,export

作者: Amy_yqh | 来源:发表于2019-02-18 15:35 被阅读0次

    汇总一下模块化开发,写模块的注意事项
    模块功能主要由两个命令构成:export和import。export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。

    一、expor 、import命令

    1、导出单个属性

    // a.js
    export var firstName = 'amy';
    export var lastName = 'ye';
    export var year = 2019;
    
    //b.js
    import { firstName,lastName,year } from './a.js'
    
    错误写法:
    export 1
    

    2、导出对象包含多个属性

    // a.js
    var firstName = 'amy';
    var lastName = 'ye';
    var year = 2019;
    export {firstName, lastName, year};
    
    //b.js
    import { firstName,lastName,year } from './a.js'
    推荐写法,方便查阅导出的元素
    
    错误写法
    var firstName = 'amy';
    export firstName
    

    3、导出函数

    // a.js
     export function getName(name) {
         console.log(name)
     }
    
    //b.js
    import { getName } from './a.js'
    getName ()
    
    错误写法:
    function f() {}
    export f
    

    4、导出、导入并重命名

    //a.js
    function getName(name) {
         console.log(name)
     } 
    // 导出重命名
    export {getName as getInfo}
    export var firstName = 'Amy'
    //b.js
    import {getInfo,firstName as name} from './a.js'
    getInfo('Tony')//Tony
    console.log(name)//Amy
    

    5、export输出的接口为实时值

    //a.js
    export let name = 'foo'
    setTimeout(()=>name='amy',400)
    export function getName() {
         console.log(name)
    }
    
    //b.js
    import { name ,getName,a} from './a.js'
    
    console.log(name)// foo
    setTimeout(getName,1000) //amy
    
    (1)export语句输出的接口,与其对应的值是动态绑定关系,即通过该接口,可以取到模块内部实时的值。
    (2)CommonJS 模块输出的是值的缓存,不存在动态更新,
    

    6、export 的位置

    //a.js
    function foo() {
      export default 'bar' // SyntaxError
    }
    foo()
    
    //b.js
    import { bar} from './a.js'
    console.log(bar)//Uncaught SyntaxError: Unexpected token export
    
    注意:export可以处于module任何位置,但是必须处于module的顶层,不能放在块级作用域内,否则会报错
    

    7、import 导入接口属性为只读属性

    import { firstName as name,getName} from './a.js'
    console.log(name)
    name = 'tony' //Uncaught TypeError: Assignment to constant variable.
    
    userInfo.name = 'tony'
    console.log(userInfo)
    如果修改的是直接引用类型是熟悉,会报错(比如字符串)
    但是如果修改的是间接引用类型,不会报错(比如对象)
    

    8、import命令具有提升效果

    foo();
    import { foo } from 'my_module';
    
    因为import具有提升功能,所以foo在import之前调用也不会报错
    

    9、impor为静态执行,不能使用表达式和变量

    // 报错
    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';
    }
    

    10、import 整体加载(*)

    import * as obj from './a.js'
    console.log(obj.firstName)
    console.log(obj.userInfo)
    

    二、export default

    1、默认导出变量

    // a.js
    export default 'Tony'
    
    //b.js
    import value from './a.js'
    console.log(value)
    
    默认导出的变量可以为任意变量名
    

    2、默认导出函数

    // a.j
    export default function () {
        console.log(111)
    }
    或者
    function f () {
        console.log(111)
    }
    export default f
    
    //b.js
    import getName from './a.js'
    getName()
    导入的方法不需要大括号括起来
    

    3、export default 原理

    (1)export default 一个module中只能有一个,使用export default 导出的接口,导入时不需要大括号。
    (2)export default 其实它导出的是一个叫default的变量或方法,系统允许开发人员任意修改名字

    // modules.js
    function add(x, y) {
      return x * y;
    }
    export {add as default};
    // 等同于
    // export default add;
    
    // app.js
    import { default as foo } from 'modules';
    // 等同于
    // import foo from 'modules';
    
    

    import命令会被 JavaScript 引擎静态分析,即在编译时做分析,不能像require那样在运行时分析。所以在es6的语法中,export 、import只能处于moduel的顶层,不能在块级作用域或者有表达式、变量等。

    相关文章

      网友评论

          本文标题:es6的module使用,imort,export

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