学静思语
Published on 2025-02-15 / 0 Visits
0
0

模块化编程

模块化编程

一、基本介绍

  • 传统非模块化编程开发有如下的缺点:(1)命名冲突(2)文件依赖
  • JavaScript代码越来庞大,JavaScript引入模块化编程,开发者只需要实现核心业务逻辑,其他都可以加载别人已经写好的模块
  • JavaScript使用“模块”(module)的概念来实现模块化编程,解决非模块化编程问题
  • 模块化也是es6的新特性

二、CommonJS模块编程(ES5的写法)

1.介绍

  • 每个js文件就是一个模块,有自己的作用域。在文件中定义的变量、函数、类等,都是私有的,对其它js文件不可见
  • CommonJS使用module.exports={}/exports={}导出模块,使用let/const 名称 = require(“xxx.js”)导入模块

2.代码

CommonJs.js模块

const name = "韩顺平";
const PI = 3.14;

let sum = (a, b) => {
    return parseInt(a) + parseInt(b);
}

let sub = (a, b) => {
    return parseInt(a) - parseInt(b);
}

let monster = {
    name:"孙悟空",
    age:3000,
    skill:"七十二变,不死金身,火眼金睛"
}

// 方式1
// 解读
// 1.module.exports={}可以将这个理解为一个对象
// 2.如果module.exports={}中的属性与要导出的对象,属性,方法等
//   名字相同可以忽略,直接写名字即可
// 3.可以全部导出,也可以部分导出
// module.exports={
//     name:name,
//     PI:PI,
//     monster:monster
// }
// module.exports={
//     name,
//     PI,
//     monster
// }
// 方式2
exports={
    name,
    PI,
    monster
}




require.js



// 解读
// 1. 可以将es5_require理解成一个对象,跟使用对象一样使用里面的方法,属性,对象等
// 2. 未导出的方法,属性,对象等,是使用不了的
const es5_require = require("./commonjs");


console.log(es5_require.PI);
console.log(es5_require.monster.name);
console.log(es5_require.monster.skill);

三、ES6模块化编程

1.介绍

  • ES6使用(1)export{名称/对象/函数/属性} (2)export 定义 = (3)export default {} 导出模块
  • 使用 import {} from “xxx.js” (1,2) / import 名称 form “xxx.js” 导入模块

2. 批量导出形式

const name = "韩顺平";
const PI = 3.14;

let sum = (a, b) => {
    return parseInt(a) + parseInt(b);
}

let sub = (a, b) => {
    return parseInt(a) - parseInt(b);
}

let monster = {
    name:"孙悟空",
    age:3000,
    skill:"七十二变,不死金身,火眼金睛"
}

//使用批量导出
// 1.也可以理解为一个对象
// 2.可以全部导出,也可以部分导出
export {
    name,
    PI,
    sum,
    monster


}


//解读
// 1.我们可以使用{}来接收导出的数据
// 2.我们可以全部接收,也可以选择的接收
// 3.注意:我们导入的数据名称要和导出的名称一样,否则取不出来

import {PI,monster,name,sum} from "./commonJS"

console.log(sum(10,20))
console.log(PI)

3.单条导出形式

const name = "韩顺平";
const PI = 3.14;
// 记住导入的时候要和导出时定义的名称相同,否则取不出来
export let sum = (a, b) => {
    return parseInt(a) + parseInt(b);
}

let sub = (a, b) => {
    return parseInt(a) - parseInt(b);
}

let monster = {
    name:"孙悟空",
    age:3000,
    skill:"七十二变,不死金身,火眼金睛"
}


//解读
// 1.我们可以使用{}来接收导出的数据
// 2.注意:我们导入的数据名称要和导出的名称一样,否则取不出来
// 3.可以理解为对象解构
import {sum} from "./commonJS2"
console.log(sum(10,20))

4.默认导出形式

// 默认导出形式
// 注意
// 1.可以理解为一个对象
// 2.大多数的定义方式和在对象中定义的要求和限制一样
// 3.可以导出方法,属性,对象等
export default {
    name: "韩顺平",
    PI: 3.14,
    sum(a, b) {
        return parseInt(a) + parseInt(b);
    },

    sub(a, b) {
        return parseInt(a) - parseInt(b);
    },
    monster:{
        name: "孙悟空",
        age: 3000,
        skill: "七十二变,不死金身,火眼金睛"
    }
}



//解读
// 1.我们可以使用{}来接收导出的数据
// 2.我们可以自己定义名称,防止重名
// 3.可将导入的的模块看成一个对象来进行使用

import common from "./commonJS3"

console.log(common.sub(10,20))
console.log(common.PI)

4.注意事项和使用细节

  • ES6的模块无法在Node.js中执行,需要用Babel转码成ES5后再执行
  • export不仅可以导出对象,一切JS变量都可以导出。比如:基本数据类型变量、函数、数组、对象
  • 没有导出的不能使用
  • es6导出方式较多,不同的导出方式导入方式也有一定影响
  • es6导出方式虽然很多,但是其本质都是一样的。

Comment