每天3分钟,重学ES6-ES12(十八) CJS

简介: 每天3分钟,重学ES6-ES12(十八) CJS

19c2e7a9bfbb7f5e8c7d744db995e29.png

每天3分钟,重学ES6-ES12文章汇总

前言

今天开始和大家一起系统的学习ES6+,每天3分钟,用一把斗地主的时间,重学ES6+,前面我们介绍了模块化的历史,今天介绍模块化处理方案

CommonJS

CommonJS规范和Node关系

  • common Js 是一个规范,指出是在浏览器以外的地方,可以简称为CJS
  • Node 是commonJs 在服务器端一个具体有代表性的一个实现
  • webpack打包工具具备对commonJS的支持和转换
  • node 中每一个js文件都有是一个单独的模块
  • 包括CommonJS规范的核心变量:exports,module.exports, requrie

导出方式

exports.a

module.exports ={a:a}

// 源码
module.exports = {} 
exports = module.exports 
//最终能导出的一定是module.exports()

内部原理

// main.js
const why = require("./why.js")
console.log(why)
setTimeout(() => {
  console.log(why.name)
  why.name = "james"
}, 1000)
// why.js
const info = {
  name: "why",
  age: 18,
  foo: function() {
    console.log("foo函数~")
  }
}
setTimeout(() => {
  // info.name = "kobe"
  console.log(info.name)
}, 2000)
module.exports = info

两个文件 执行node main.js 输出结果为

{ name: 'why', age: 18, foo: [Function: foo] } why james

先打印why对象,然后打印why 修改why name 打印 james

由此可见,require 引入的文件是加载时执行

require执行细节

require是一个函数,可以帮助我们引入一个文件(模块)中导出的对象。

require(X)

查找规则

  • 1.如果X是node的一个核心模块,如http path 则直接返回核心模块,并停止查找
  • 2.如果X是一个路径
  • 2.1.将X当作是文件名在对应的目录下查找
  • 如果有后缀名,按照后缀名的格式查找对应的文件
  • 如果没有后缀名,会按照顺序
  • 直接查找文件X > 查找X.js文件 > 查找X.json文件>查找X.node文件
  • 2.2.如果没有找到对应的文件,将X作为一个目录
  • 查找目录下的index文件
  • 查找X/index.js文件>查找X/index.json文件>查找X/index.node文件
  • 3.非路径也非核心模块(第三方包)
  • 每层级依次去寻找node_modules 如果都没找到,那么报错:not found

模块的加载过程

  • 结论一:模块在被第一次引入时,模块中的js代码会被运行一次
  • 结论二:模块被多次引入时,会缓存,最终只加载(运行)一次
  • 这是因为每个模块对象module都有一个属性:loaded。
  • 为false表示还没有加载,为true表示已经加载;
  • 结论三:如果有循环引入,Node采用的是深度优先算法,寻找模块

CommonJS规范缺点

  • CommonJS加载模块是同步的:
  • 同步的意味着只有等到对应的模块加载完毕,当前模块中的内容才能被运行;
  • 这个在服务器不会有什么问题,因为服务器加载的js文件都是本地文件,加载速度非常快;
  • 如果将它应用于浏览器呢?
  • 浏览器加载js文件需要先从服务器将文件下载下来,之后再加载运行;
  • 那么采用同步的就意味着后续的js代码都无法正常运行,即使是一些简单的DOM操作;
  • 所以在浏览器中,我们通常不使用CommonJS规范:
  • 当然在webpack中使用CommonJS是另外一回事;
  • 因为它会将我们的代码转成浏览器可以直接执行的代码;
  • 在早期为了可以在浏览器中使用模块化,通常会采用AMD或CMD:
  • 但是目前一方面现代的浏览器已经支持ES Modules,另一方面借助于webpack等工具可以实现对CommonJS或者ESModule代码的转换;
  • AMD和CMD已经使用非常少了,所以这里我们也不展开介绍了。



相关文章
|
3月前
|
存储 缓存 运维
微信读书十周年,后台架构的技术演进和实践总结
微信读书经过了多年的发展,赢得了良好的用户口碑,后台系统的服务质量直接影响着用户的体验。团队多年来始终保持着“小而美”的基因,快速试错与迭代成为常态。后台团队在日常业务开发的同时,需要主动寻求更多架构上的突破,提升后台服务的可用性、扩展性,以不断适应业务与团队的变化。
131 0
|
5月前
|
人工智能 自然语言处理 API
AutoAgent:无需编程!接入DeepSeek用自然语言创建和部署AI智能体!港大开源框架让AI智能体开发变成填空题
香港大学推出的AutoAgent框架通过自然语言交互实现零代码创建AI智能体,支持多模型接入与自动化工作流编排,在GAIA基准测试中表现优异。
691 16
AutoAgent:无需编程!接入DeepSeek用自然语言创建和部署AI智能体!港大开源框架让AI智能体开发变成填空题
|
12月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台解决方案
【9月更文挑战第27天】在移动应用开发的广阔天地中,安卓和iOS两大操作系统如同双子星座般耀眼。开发者们在这两大平台上追逐着创新的梦想,却也面临着选择的难题。如何在保持高效的同时,实现跨平台的开发?本文将带你探索跨平台开发的魅力所在,揭示其背后的技术原理,并通过实际案例展示其应用场景。无论你是安卓的忠实拥趸,还是iOS的狂热粉丝,这篇文章都将为你打开一扇通往跨平台开发新世界的大门。
336 8
|
SQL Java 数据处理
SQL游标的详细使用方法与实例
SQL游标的详细使用方法与实例
|
网络协议 安全 Linux
1.安装 docker 容器并配置镜像加速器
1.安装 docker 容器并配置镜像加速器
1026 11
|
弹性计算 运维 安全
畅享幻兽帕鲁:快速搭建稳定服务器,与小伙伴畅游游戏世界!
畅享幻兽帕鲁:快速搭建稳定服务器,与小伙伴畅游游戏世界!
830 0
|
JavaScript 前端开发 编译器
CommonJS与ES6 Module的本质区别
文章主要讨论了CommonJS和ES6 Module两种JavaScript模块系统的核心区别,包括动态与静态解决依赖方式,值拷贝与动态映射,以及如何处理循环依赖的问题。
436 0
|
IDE 编译器 开发工具
瑞萨IDE:CS+ for CC下载、安装和基础使用
本篇博文将介绍:CS+ for CC安装和基础使用(本篇文章以:RH850 系列MCU为例)。