最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • ES6:Module

    正文概述 掘金(Avery_66)   2021-03-12   503

    ES6引入了一种新的模块加载方案,使用import来静态加载模块,而在此之前JS主要用的CommonJS和AMD进行模块的加载,属于动态加载,如require('fs')

    意义: ES6模块是编译时加载,使静态分析成为可能,有了它能进一步拓宽JS语法,比如引入宏(macro)和类型检验(type system)这些只能靠静态分析实现的功能

    • 不再需要UMD模块格式了,将来服务器和浏览器都会支持 ES6 模块格式。目前,通过各种工具库,其实已经做到了这一点。
    • 将来浏览器的新 API 就能用模块格式提供,不再必须做成全局变量或者navigator对象的属性。
    • 不再需要对象作为命名空间(比如Math对象),未来这些功能可以通过模块提供

    而ES6模块的使用主要由export和import两个命令实现

    export

    export命令可以理解为对外输出,你可以把当前的js文件当作一个模块,然后用export对外输出一些模块内的变量,可以输出对象也可以输出函数,看看具体的用法

    var year = 11
    var weight = 70
    
    function f1(x,y){
      return x*y
    }
    
    export var name = "John Reese"
    export function add(x,y){
      return x + y
    }
    export {year,weight}
    export {f1 as multiply}
    
    //var m = 1
    //export m 报错
    

    export输出的值会进行动态更新,如:

    export var i = 1;
    setTimeout(()=> i = 2,500)
    

    通过上面的模块import的i,会在500毫秒后变成2,而如果使用CommonJS则仅输出值的缓存,不存在动态更新

    export命令应该出现在代码顶层,如果处在块级作用域内就会报错

    function fn(){export var a = 1}//报错
    

    import

    import命令用于导入使用export命令导出的接口,使用方法如下

    import {year,multiply,add} from './module1.js'
    import {name as lastname} from './module1.js'
    

    于是我们就可以直接使用导入的这些变量

    • 由import输入的变量都是只读的,但如果导入的是一个对象,那么我们可以修改其属性的值
    • import命令具有提升效果,会提升到整个代码顶部
    • 由于import是静态执行,所以我们不能在里面使用变量和表达式,也不能将其放入运行时才能知道结果的块中

    再来看一些使用的例子

    import './module1.js'//只执行不导入
    
    import * as obj from './module1.js'//整体导入,加载到obj对象中
    

    export default

    export default用于指定默认输出

    export default function(){console.log(1)}//默认输出
    
    //....
    import fn from './module1.js'//可以随意指定名字
    

    export default实质上是对外输出了一个名叫default的变量,所以它的后面不能跟变量声明语句。再看看几种用法

    var a = 1;
    export {a as default};//等同于export default a
    
    export default var b = 1;//报错
    
    //....
    import {default as fn} from './module1.js'
    //等同于 import fn from ....
    

    export与import复合

    export {fn,fn2} from './module1'
    
    //等同于
    import {fn,fn2} from './module1'
    export {fn,fn2}
    
    export {fn as add} from './module1'//改名暴露
    export * from './module1'//整体暴露
    export {default} from './module1'//暴露默认接口
    

    import()

    import命令无法取代require()的动态加载功能,ES2020引入了import(),支持动态加载模块,它加载模块后返回的是一个Promise对象。

    import('./module1')
    .then(module => {
            console.log(module)//这里的module就是加载的整个模块
    })
    
    import('./module1')
    .then({default,add} => {
            console.log(default,add)//可以使用结构赋值语法仅获取需要的接口
    })
    

    起源地下载网 » ES6:Module

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元