模块化编程

1.基本介绍

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

2.模块化编程原理示意图

3.模块化编程的分类

  1. CommonJS模块化规范/ES5的写法
  2. ES6模块化规范

3.1CommonJS模块化规范/ES5的写法

3.1.1介绍

  1. 每个js文件就是一个模块,有自己的作用域。在文件中定义的变量、函数、类/对象,都是私有的,对其他js文件不可见
  2. CommonJS使用module.exports={}或者exports={}导出模块,使用let/const 名称=require("xx.js")导入模块

3.1.2应用实例

  1. 需求说明

    • 编写function.js,该文件有函数,变量,常量,对象,数组....
    • 要求在use.js,可以使用到function.js中定义的函数/变量/常量/对象
    • 请用模块化编程的方式完成,尽量将各种写法都写一下
  2. 思路分析

  3. 代码应用

    function.js

    //定义一些对象,变量,常量,函数等
    const sum = function (a, b) {
    return parseInt(a) + parseInt(b);
    } const sub = function (a, b) {
    return parseInt(a) - parseInt(b);
    } let name = "jack"; const PI = 3.14; const monster = {
    name: "牛魔王",
    age: 500,
    hi() {
    console.log("hi 你好,牛魔王");
    }
    } //导出
    /**
    * 1.module.exports 导出模块
    * 2.把你需要导出的数据,写入到{}中即可
    * 3.可以全部导出,也可以部分导出
    * 4.理解:相当于把所有导出的数据当做一个对象
    * 5.如果属性名和属性值(即要导出的函数/变量/对象...)的名字相同,可以简写
    * 6.module.exports ={} 也可以简写为 exports= {}
    */
    exports = {
    //简写
    sum,
    sub,
    name,
    PI
    }
    // module.exports = {
    //完整的写法--属性:属性值
    // sum: sum,
    // sub: sub,
    // myname: name,
    // PI: PI
    // }

    use.js

    //导入
    /**
    * 1.在es5中,通过require 把对应文件.js 中的数据/对象 引入
    * 2.通过 对象.属性 的形式使用
    * 3.如果我们导入时,不需要所有的数据,可以导入部分数据
    */
    const m = require("./function.js");
    const {sub} = require("./function.js"); //使用
    console.log(m.sub("100", "200"));
    console.log(m.sum(10, 90));
    console.log(m.name);
    console.log(m.PI);
    console.log(sub(19, 3));

3.2ES6模块化规范

3.2.1介绍

  1. ES6使用

    (1)export{对象/函数/变量/常量等} (批量导出)

    (2)export 定义 = {} (定义导出)

    (3)export default {}(默认导出)

    以上三种方式都可导出模块

  2. 如果使用的是批量导出或定义导出的,导入时要用import {} from "xx.js"形式

    如果用默认导出的,导入时要用 import 名称 from "xx.js"形式

3.2.2应用实例-批量导出形式

  1. 需求说明

    • 编写common.js,该文件有函数,变量,常量,对象
    • 要求在use_common.js中,可以使用到common.js中定义的 函数/变量/常量/对象
    • 请使用ES6模块化编程的方式完成
  2. 代码实现

    common.js

    //定义一些对象,变量,常量,函数等
    const sum = function (a, b) {
    return parseInt(a) + parseInt(b);
    } const sub = function (a, b) {
    return parseInt(a) - parseInt(b);
    } let name = "jack"; const PI = 3.14; const monster = {
    name: "牛魔王",
    age: 500,
    hi() {
    console.log("hi 你好,牛魔王");
    }
    } /**
    * es6之批量导出
    * 1.export 就是导出模块/数据
    * 2.可以全部导出,也可以部分导出
    */
    export {
    sum,
    sub,
    name,
    monster
    }

    use_common.js

    /**
    * 导入
    * 1.可以使用{} 来接收导出的数据
    * 2.可以全部接收,也可以选择的接收
    * 3.细节:导入{}中的名字,要求和导出{}中的名称一致
    */
    import {monster, name} from "./common.js"; //使用
    console.log(monster);
    console.log(name);

3.2.3应用实例-其他导出形式

  • 定义导出

common2.js

//定义一些对象,变量,常量,函数等

//定义导出
//定义sum函数时,就直接导出
//如果在定义时导出的数据,在导入时要保持名称一致
export const sum = function (a, b) {
return parseInt(a) + parseInt(b);
}

use_common2.js

//可以导入模块/数据

import {sum} from "./common2.js";

//使用
console.log(sum(10, 40));
  • 默认导出

common3.js

//定义一些对象,变量,常量,函数等

//演示默认导出
//可以这样理解,类似于把{}内的数据当做一个对象导出
export default {
sum(a, b) {
return parseInt(a) + parseInt(b);
},
sub(a, b) {
return parseInt(a) - parseInt(b);
}
}

use_common3.js

//导入默认导出的模块/数据
//m的名称是可以自定义的,因此就可以解决命名冲突的问题
import m from "./common3.js"; //以 对象.属性 的形式使用
console.log(m.sum(11, 22));
console.log(m.sub(88, 66));

3.2.4注意事项和细节

  1. ES6的模块化无法在Node.js中执行,需要用Babel转码ES5后再执行
  2. export不仅可以导出对象,一切JS变量都可以导出。比如:基本类型变量,函数,数组,对象
  3. 没有导出的数据不能使用
  4. ES6的导出方式有很多,不同的导出方式对导入方式也有影响

4.练习

  1. 请编写一个文件hw_common.js,该文件有对象cat(属性有name,age,cry() ),对象dog(属性有name,age,hi() )

    • 使用批量导出
    • 使用定义导出
    • 使用默认导出

    hw_common.js

    (1)批量导出:

    const cat = {
    name: "猫猫",
    age: 2,
    cry() {
    console.log("喵喵");
    }
    } const dog = {
    name: "狗狗",
    age: 3,
    hi() {
    console.log("旺旺");
    }
    } //批量导出
    export {cat,dog}

    (2)定义导出

    export const cat = {
    name: "猫猫",
    age: 2,
    cry() {
    console.log("喵喵");
    }
    } export const dog = {
    name: "狗狗",
    age: 3,
    hi() {
    console.log("旺旺");
    }
    }

    (3)默认导出

    //默认导出
    //注意写法有一些变化,把我们的两个对象当做{}的属性即可
    export default {
    cat: {
    name: "猫猫",
    age: 2,
    cry() {
    console.log("喵喵");
    }
    }, dog: {
    name: "狗狗",
    age: 3,
    hi() {
    console.log("旺旺");
    }
    }
    }
  2. 编写use_common.js,在该文件中使用hw_common.js导出的模块/数据,注意体会使用特点

    导入默认导出的数据:

    //导入默认导出的数据
    import m from "./hw_common.js";
    //使用
    console.log(m.cat.name, m.cat.age, m.cat.cry());
    console.log(m.dog.name, m.dog.age, m.dog.hi());

    导入 批量导出或定义导出 的数据:

    //导入 批量导出或定义导出 的数据
    import {dog, cat} from "./hw_common.js";
    //使用
    console.log(dog.name,dog.hi());
    console.log(cat.name,cat.cry());
  3. a.js有一个dog对象(含有hi()方法),b.js也有一个dog对象(含有say()方法),请使用模块化的编程思路,在a.js能使用到不同的dog对象,请编程完成。

    使用默认导出解决命名冲突

    b.js

    //默认导出
    export default {
    dog: {
    say() {
    console.log("say...")
    }
    }
    }

    a.js

    const dog = {
    hi() {
    console.log("hi..")
    }
    } //导入默认导出的数据
    import dog2 from "./b.js"; //使用
    console.log(dog2.dog.say(), dog.hi());

day03-模块化编程的更多相关文章

  1. 从273二手车的M站点初探js模块化编程

    前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...

  2. Javascript模块化编程(三):require.js的用法

    Javascript模块化编程(三):require.js的用法 原文地址:http://www.ruanyifeng.com/blog/2012/11/require_js.html 作者: 阮一峰 ...

  3. Javascript模块化编程(二):AMD规范

    Javascript模块化编程(二):AMD规范   作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2012/10/asynchronous_module_d ...

  4. Javascript模块化编程(一):模块的写法

    Javascript模块化编程(一):模块的写法 作者: 阮一峰 原文链接:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html ...

  5. 【模块化编程】理解requireJS-实现一个简单的模块加载器

    在前文中我们不止一次强调过模块化编程的重要性,以及其可以解决的问题: ① 解决单文件变量命名冲突问题 ② 解决前端多人协作问题 ③ 解决文件依赖问题 ④ 按需加载(这个说法其实很假了) ⑤ ..... ...

  6. Javascript模块化编程(二):AMD规范(转)

    这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要 ...

  7. Javascript模块化编程(一):模块的写法(转)

    随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者 ...

  8. 模块化编程时,#include到底要放在哪里?

    结合我自己的经验,谈一谈模块化编程时#include应该出现的位置.总结起来大体有二条规则: 一.规则1:只包含必要的头文件 看下面这个模块: ===foo.c==== #include <st ...

  9. 【javascript激增的思考01】模块化编程

    前言 之前我做过一个web app(原来可以这么叫啦),在一个页面上有很多小窗口,每个小窗口都是独立的应用,比如: ① 我们一个小窗口数据来源是腾讯微博,需要形成腾讯微博app小窗口 ② 我们一个小窗 ...

  10. JavaScript学习笔记-面向对象的模块化编程

    面向对象的模块化编程 模块是一个独立的JS文件,模块文件可以包含一个类定义.一组相关的类.一个实用函数库.一些待执行的代码 模块化的目标:支持大规模的程序开发,处理分散源代码的组装,并能让代码正确执行 ...

随机推荐

  1. iPhone 15 Pro Max的Type-C接口有多牛?实测USB3比USB2快11倍

    苹果最新的iPhone 15系列和iPhone 15 Pro系列新机,尽管两者都是Type-C接口,但速度相差20倍. 据了解,iPhone 15 Pro/Max搭载的苹果A17 Pro芯片内含专门的 ...

  2. 从此告别涂硅脂 利民推出新款CPU固态导热硅脂片:一片26.9元

    利民(Thermalright)近日推出了新款Heilos CPU固态导热硅脂片,其中Intel版为26.9元,AMD版售价29.9元. 以往向CPU上涂硅脂,需要先挤一粒绿豆大小的硅脂,然后用塑料片 ...

  3. 使用XAG配置GoldenGate在RAC集群环境中的高可用

    背景:本文是根据实际客户测试需求整理,因为客户OGG所在环境只有GI集群,数据库部署在其他位置,所以会有一些差异,但核心思路一致,已完全测试通过,整理出来供大家参考. 1.前期准备 2.创建ACFS文 ...

  4. 2024 SICTF Round#3出题 crypto misc osint

    有幸参与了本次比赛crypto misc OSINT出题,难易程度循序渐进,下面记录一下本人题目题解(( 比赛网址:https://yuanshen.life/ CRYPTO SuperbRSA(85 ...

  5. MySQL基础之DCL语句

    DCL(Data Control Language)语句:数据控制语句. 用途:控制数据库.表.字段.用户的访问权限和安全级别. 常用关键字:grant.revoke等 一般用于管理数据库和用户的权限 ...

  6. 惠普HP519打印机缺色处理记录

    打印蓝色缺失, 黑色出墨不均匀 开盖检查, 发现蓝色墨水管路中间有断线, 拆开打印头后, 用随机器配的桔红色吸墨器吸墨. 之后重新开机还是缺色. 检查彩色打印头, 用浅浅的一层热水泡下方喷嘴, 黄色红 ...

  7. Vue中data为何以函数形式返回

    data为何以函数形式返回 在使用Vue构建组件化应用时,每个组件的data属性都是以函数形式返回的,这主要是在组件化实现的时候,每个实例可以维护一份被返回对象的独立的拷贝,而不是共享同一个对象的引用 ...

  8. Swoole从入门到入土(1)——入坑

    入坑一个话题,总得有入坑的理由.有好多话题可供选择,但是思来想去,对于PHPer进阶与其急着去掌握一门新的语言,匆忙地踏足一个新的知识体系,还不如先把php圈子的技能点攒齐了. 话说Swoole诞生之 ...

  9. Java设计模式-桥接模式Bridge

    传统模式 案例 要求对不同手机类型的不同品牌实现操作编程(比如:开机.关机.上网,打电话等),如图: 类图 问题 扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类, ...

  10. Centos7安装php7.4

    添加 EPEL and REMI 仓库 yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarc ...