es6之(模块化)用法

320 阅读4分钟

在这里回顾一下require.js的写法 假设我们又两个js文件 index.js 和 content.js文件 然后再index.js中使用content.js的返回结果 看案例
require.js

    //首先定义 
        //content.js
    define(function(){                           //使用define函数定义一个模块
        return "收购腾讯" 
    })
    //然后require
        //index.js
    require(["./cononent.js"],function(animal){  //使用require来获取模块 并将模块作为一个参数返回出来 
        console.log(animal)  //收购腾讯
    })

CommonJS是这么写的

    //index.js
    var animal = require("./content.js")
    //content.js
    module.exports = "收购腾讯"

es6写法

    //index.js
    import animal from "./content"
    //content.js
    export default "收购腾讯"
    //在这里列举了三种方式的模块 妈妈再也不用担心混淆了 

export命令

模块功能主要由两个命令构成export && import
1-即export用于规定模块的对外接口 export负责进行模块化 也是模块化的输出
2-import用于输入输入其他模块提供的功能 import负责把模块化引入 也是模块化
3-使用了export 命令定义模块的对外接口其他js 文件就可以通过import 来加载这个模块
4-export可以把变量 函数 类 对象进行模块化 提供外部调用的接口 让外部进行引用

    //temp.js文件 然后在文件中输出一个模块变量  把一个变量模块化 
    export var a = "chang";
    //index.js文件  中以import的形式引入 
    import {a} from "./temp.js";
    //这就是 一个简洁的模块的输出和引入 

多变量的输出

    //声明了3个变量,需要把这3个变量都进行模块化输出,这时候我们给他们包装成对象就可以了。
    var a ='jspang';
    var b ='大兄弟儿';
    var c = 'web';
    export {a,b,c}

函数的模块化输出

export function add(a,b){
       return a+b;
}   
add(1,2)

as的用法 修改变量名

    //不想暴露模块里边的变量名称,而给模块起一个更语义话的名称,这时候我们就可以使用as来操作。
    //不能用||不想用Xxxx这个变量名 使用as
    var a ='jspang';
    var b ='大兄弟儿';
    var c = 'web';
    export {
        x as a,     //!通常情况下变量就是本来的名字 但是可以使用as 关键字重命名
        y as b,
        z as c
    }

export default的使用 加上default相当是一个默认的入口。在一个文件里export default只能有一个。

export和export default的区别

1.export
        export var a ='Cdd';
        export function add(a,b){
            return a+b;
        }
                                     //对应的导入方式
        import {a,add} form './temp';//也可以分开写
        
2.export defalut
        export default var a='Cdd';
                                     //对应的引入方式
        import str from './temp';

另外还有
输入的时候注意 大括号里面的变量名 必须和被导入的模块dejs 对外接口的名称相同
如果还希望输入的js中输出的默认值(defalut) 写在大括号外面 import animal,{say,type} from "./content" 以及模块的整体加载,详细可以参考git

了解 import&&require的区别 前端常见面试题

  • 模块加载的时间
    require 运行时加载
    import 编译时加载(效率更高) (由于是编译时加载 所以import命令会提升整个模块的顶端)
  • 模块的本质
    require 模块即使对象 输入时必须查找对象属性
    import es6模块不是对象 (而是通过export命令显示指定输入的代码 再通过import命令输入) (导致es6模块本身无法被引用 因为它不是对象) 由于es6模块是编译时加载 使得静态分析成为可能 拓展js的语法

CommonJs 模块和es6模块的区别

1. commonjs 模块默认采取 非严格模式 
2. es6      自动采取严格模式 不管有没有再模块头上加 "use strict"
3. commonjs 模块输出的是一个值的拷贝 es6输出的是值的引用    

//严格模式 //变量必须声明后使用
//函数的参数不能有同名属性否则报错
//不能使用with语句
//不能对只读属性赋值否则报错
//不能删除不可删除的属性 否则报错
//不能删除变量delete prop会报错
//eval不hi在它的外层作用域 引用变量 eval 和arguments不能被重新赋值
//arguments 不会自动反映函数参数的变化 不能使用argments.callee argments.caller
//禁止this 指向全局对象
//等... !! 要注意this' 在es6模块中 顶层的this指向undefined 即不应该在顶层代码中使用this