模块化机制(ES6模块化和CommonJS模块化详解)

一、模块化的理解

1.什么是模块?

  • 将一个复杂的程序依据一定的规则(规范)封装成几个块(文件), 并进行组合在一起
  • 块的内部数据与实现是私有的, 只是向外部暴露一些接口(方法)与外部其它模块通信

2.模块化的好处

  • 避免命名冲突(减少命名空间污染)
  • 更好的分离, 按需加载
  • 更高复用性
  • 高可维护性

二、模块化规范

        模块化规范有CommonJS、AMD、CMD、ES6模块化

这篇文章主要对CommonJS和ES6模块化进行一个汇总整理(在nodejs上运行 : node init初始化文件)

运行ES6模块时,需要在package.json文件中添加"type":"module",并且在引入时路径中不能省略文件后缀名;

运行CommonJS时,需要在package.json文件中添加"type":"commonjs",在引入路径时可以省略文件后缀名

1.ES6模块化(静态加载,编译时加载)

        ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。

    ES6模块化语法

        export命令用于规定模块的对外接口,即模块的暴露

        import命令用于输入其他模块提供的功能,即模块的导入。

①单个属性的导出、导入

//单个属性的导出    文件名为 a.js
export let a = 1;
export function count(){
  console.log(++a);
}

//引用        文件名为 index.js

import {a,count} from './a.js'

console.log(a)   //  1   

count()        //  2

 ②列表和重命名的导出、导入

//暴露模块   文件名 a.js

        let firstName = "zhang"

        let lastName = "xiaoxiao"

        //列表导出

        export {firstName , lastName}

        //重命名导出

        export { firstName as first, lastName as last}

//引入模块  文件名 index.js

    //列表引入

        import { firstName , lastName } from "./a.js";

        console.log("列表"+firstName,lastName);        //列表zhang xiaoxiao

   //重命名引入

        import { first , last } from "./a.js";

        console.log("重命名"+first,last);        //重命名zhang xiaoxiao

③默认导出  export default function foo(){ };        /        export default {}

        使用import命令的时候,我们需要知道所要加载的变量名或函数名,否则无法加载。为了方便,能使我们不用阅读文档就能加载模块,就要用到export default命令,为模块指定默认输出。

        模块内部的默认导出,有且只能有一个

//文件名 a.js   模块暴露

        export default function foo(){                         

          console.log("default 默认导出");

        }

//文件名 index.js   引入默认导出的模块

        import fun from "./a.js"

        fun()        // default  默认导出

                        //这里的fun并不是固定的,我们可以给任意的变量名来接收这个模块

 ④导入所有模块    import * as obj(自定义) from '路径'

//文件名 index.js

import * as obj from '.a.js';        //as 后面obj 也是可以自定义的变量名来接收

console.log(obj);                        

        //打印结果 [Module: null prototype] {
                          a: 1,
                          count: [Function: count],
                          default: [Function: default],
                          first: 'zhang',
                          firstName: 'zhang',
                          last: 'xiaoxiao',
                          lastName: 'xiaoxiao'
                        }

⑤ 运行模块  类似于script标签的导入形式

//文件名 index.js

import "./a.js"            //可以运行a.js中的js代码

    另外,①-④的引入也可以运行目标文件中的js代码(console.log()等都可以运行),并且,当在运行index文件时,console.log()命令先被打印。

2.CommonJS(运行时加载)

//导出   文件名  b.js

        let a =1;

          let add =()=>{

          ++a

        }

        module.exports = {

                  a,

                 add

        }

//导入     文件名  index.js      要运用 require() 命令

        let obj = require('./modules/b')

        console.log(obj);

    //对象的解构形式         

        let {a,add} = require('./modules/b')

        console.log(a,add);

三、ES6 模块与 CommonJS 模块的差异

    它们有两个重大差异:

    ① CommonJS 模块输出的是一个值的拷贝(理解起来类似于值传递),ES6 模块输出的是值的引用(理解起来类似于引用传递)。

    ② CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值