1.模块化介绍

编程领域中的模块化,就是遵守固定的规则,把一个大文件拆成独立并互相依赖的多个小模块。将一个复杂程序依据一定规则封装成几个块,并进行组合在一起;块的内部数据和实现是私有的,只是向外部暴露一些接口和方法。

把代码进行模块化拆分的好处:

  • 提高了代码的复用性
  • 提高了代码的可维护性
  • 可以实现按需加载
  • 避免命名冲突

2.CommonJS

CommonJS详解
特点说明

  • 每一个 JavaScript 文件就是一个独立模块,其作用域仅在模块内,不会污染全局作用域。
  • 在服务器端加载同步(可能会阻塞),按编写顺序加载;
  • 在浏览器端需要提取编译打包处理;
  • 模块可以加载多次,但只会在第一次加载时运行一次,然后运行结果就会被缓存起来。下次再加载是直接读取缓存结果。模块缓存是可以被清除的。

基本语法

暴露模块:暴露的本质是exports对象
module.exports=value exports.xxx=value

  • module.exports 是真正决定导出对象的【重要角色】
  • exports 仅仅是 module.exports 的【一个引用】
  • 赋值给 module.exports 必须立即完成,不能在任何回调中完成(应在同步任务中完成)。
  • 当 module.exports 属性被新对象完全替换时,通常也会“自动”重新分配 exports,如果使用 exports 变量导出新对象,则必须“手动”关联 module.exprots 和 exports,否则无法按预期输出模块值。

CommonJS 规定:

① 每个模块内部,module 变量代表当前模块。

② module 变量是一个对象,它的 exports 属性(即 module.exports)是对外的接口。

③ 加载某个模块,其实是加载该模块的 module.exports 属性。require() 方法用于加载模块。

module.exports={msg:'m1',foo(){ }
}
exports.foo=function(){}
exports.arr=[1,2,4]

引入模块:自定义模块xxx为文件路径;第三方模块xxx为模块名
require(xxx)

let m1=require('../m1')m1.foo();
let m2=require('../m2')
m2.foo();

实现

  • 服务器端:Node.js
  • 浏览器端:Browserify

每个模块内部,都有一个 module 对象,表示当前模块;module模块存储了和当前模块有关的信息;外界用 require() 方法导入自定义模块时,得到的就是 module.exports 所指向的对象。

// Module 构造函数
function Module(id = '', parent) {this.id = idthis.path = path.dirname(id)this.exports = {}moduleParentCache.set(this, parent)updateChildren(parent, this, false)this.filename = nullthis.loaded = falsethis.children = []
}

模块加载机制

  • 优先从缓存中加载:模块在第一次加载后会被缓存。 这也意味着多次调用 require() 不会导致模块的代码被执行多次。
  • 内置模块是由 Node.js 官方提供的模块,内置模块的加载优先级最高。
  • 使用 require() 加载自定义模块时,必须指定以 ./ 或 …/ 开头的路径标识符。
  • 如果传递给 require() 的模块标识符不是一个内置模块,也没有以 ‘./’ 或 ‘…/’ 开头,则 Node.js 会从当前模块的父 目录开始,尝试从 /node_modules 文件夹中加载第三方模块。

3.ES6

依赖模块需要编译打包处理

分别暴露

export function foo() {console.log('foo()');
}export function bar() {console.log('bar()');
}export let arr = [1, 2, 3, 4, 5]

统一暴露

function fun() {console.log('fun()');
}function fun2() {console.log('fun2()');
}export { fun, fun2 }

默认暴露
一个模块只能有一个默认导出,对于默认导出,导入的名称可以和导出的名称不一致。

export default {msg: 'hello......',fun: () => {console.log('aaaaaaaaaaaaa');}
}

引入

// 引入其他的模块
// 如果是单个的js文件 引入时要加上后缀
// 引入的是一个npm下载的包,就不需要加后缀
import {foo, bar} from './module1.js'
import {fun, fun2} from './module2.js'
import module3 from './module3.js'
import $ from 'jquery'
import express from 'express'

重命名

import {fun as fun1} from 'fun.js'

AMD与CMD

前端开发学习之【模块化】相关推荐

  1. 老前端工程师现身说法,2021Web前端开发学习路线图

    导读:2021Web前端开发学习路线图 三大件学习 现在每年依旧有很多初级入门的前端开发.所以对初入门的朋友也给出一点意见. 刚入门的朋友,我觉得不应该一开始就学习像Vue.TypeScript.We ...

  2. 前端开发学习路线图,完整学习教程+工具+框架

    回看近年的前端发展,不管是之前的散装前端时代,还是后来插件化.模块化的演进,亦或是现如今如火如荼的前端工程化迭代,发展速度实在是太快了,各种框架层出不穷,这些难免会让我们这些学习者眼花缭乱,满腹疑团. ...

  3. ul 原点显示_web前端开发学习教程,CSS HTML - ul li列表原点如何相连

    原标题:web前端开发学习教程,CSS HTML - ul li列表原点如何相连 目前我列出两个方案,很详细,希望可以帮助到有疑问的朋友. 方案一: html 参与考试<第一期模拟考试> ...

  4. 前端开发学习笔记(一):HTML

    前端开发学习笔记(一):HTML 文章目录 前端开发学习笔记(一):HTML 一. HTML的文档结构 二.标签属性 2.1. 标签属性 2.2. 文字格式化标签 2.3. html实体转义 三. t ...

  5. 前端开发学习及工具网站(持续更新)

    前端开发学习及工具网站 该文章主要是记录前端开发中好的学习网站或者工具网站 大部分实用网站来源抖音鱼皮大佬分享,这里分享给大家 1.w3cschool(编程狮) 这个网站适合0基础学前端的同学,内容简 ...

  6. 2018web前端学习路线,详谈web前端开发学习路线

    近几年IT业可谓是发展火热,而且新生了很多的职业.在这众多的新生职业中备受瞩目的当属web前端工程师了,web前端在IT行业真正受到重视的时间不超过五年,但是web前端的发展前景却是非常的可观,好前景 ...

  7. Web前端开发学习【1】-----大学生如何购买学生版的阿里云服务器,或免费领取半年的阿里云服务器

    Web前端开发学习[1]-----大学生如何购买学生版的阿里云服务器,或免费领取半年的阿里云服务器目录 一.进入阿里云官网.注册阿里云账号 1.百度搜索关键词[阿里云服务器],然后进入官网 2.免费注 ...

  8. 重磅推出:分享阿里云大学前端开发学习路线链接

    重磅推出:分享阿里云大学前端开发学习路线链接 这是一份阿里云大学推出前端开发学习路线,适合入门.也适合刚入职场一两年的小伙伴,来一个基础知识进行加深视频学习.内容言简意赅,通过demo练习等来理解学习 ...

  9. 送给大家一套完整的web前端开发学习路线

    本文来源:千锋web前端开发 近几年IT业可谓是发展火热,而且新生了很多的职业.在这众多的新生职业中备受瞩目的当属web前端工程师了,web前端在IT行业真正受到重视的时间不超过五年,但是web前端的 ...

  10. 小猿圈Web前端开发学习路线

    很多人已经下定决心学习前端开发,但是学习很盲目,没有一个明确的目标,导致学了很长时间效果也没有很明显,最终放弃了,这个结果是我们最不想看到的结果,那么学习路线就十分重要了,好的学习路线对学习会引向成功 ...

最新文章

  1. RPC 笔记(06)— socket 通信(多线程服务器)
  2. Is It A Tree?
  3. python最新版本-最新版Python 3.8.6 版本发布
  4. 850 USB 烧录模式
  5. 在windows上模拟linux环境,MSYS2——Windows平台下模拟linux环境的搭建-Go语言中文社区...
  6. android 等待回调再返回结果_震惊!!只剩你还不懂Java回调机制了!
  7. ../configure: /bin/sh^M: bad interpreter: No such file or directory
  8. 开发指南专题十七-JEECG图表配置说明
  9. Tomcat Post请求参数长度限制
  10. Page Object设计模式实践
  11. m1芯片MacBook安装本地编译版matplotlib库
  12. linux c 网络事件 通知,深入理解Linux网络技术内幕—通知链
  13. 微信小程序富文本组件mp-html
  14. 软件工程第十二周总结
  15. 「黑科技」增加栈的空间
  16. Atitit prj tek dfkt 项目常见技术难点目录第一章 开发效率 2第一节 更加简单的语言 2第二节 简单
  17. delphi7 调webservice时报错:fault occurred while processing
  18. java 贝叶斯抠图_毕业论文 基于贝叶斯算法的自动抠图程序设计与实现.doc
  19. 第6章 访问权限控制
  20. Bottled Water: 实时集成postgresql与kafka

热门文章

  1. redis学习——redis事务
  2. Echarts3通过ajax动态获取数据,30秒定时图表数据,设置图表线条颜色和粗细
  3. 开放Centos7端口
  4. 小米电视4A Android8,小米电视4A 删除内置应用及其去广告攻略
  5. MySQL学习之MySQL引擎
  6. 微信小程tree组件,无限递归
  7. java date类 时区_Java Date 与时区
  8. java常见的面试题
  9. pointnet train 第十句correct = tf.equal(tf.argmax(pred, 1), tf.to_int64(labels_pl))
  10. ROS1/ROS2版本代号