Gahing's blog Gahing's blog
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Gahing / francecil

To be best
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 前端基础

  • 应用框架

  • 工程能力

    • 工程效率

    • 编译构建

    • 工程管理

    • JS 模块化

      • commonjs与esmodule
        • CommonJS
        • Es Module
        • 文章推荐
      • 浅谈模块化
    • CSS 模块化

    • 工程质量

    • 前端测试

    • CI&CD

  • 应用基础

  • 专业领域

  • 业务场景

  • 大前端
  • 工程能力
  • JS 模块化
gahing
2021-09-21
目录

commonjs与esmodule草稿

# CommonJS

node 中对文件进行加载,使用自己的一套包装机制(底层还是用的 es5 js 那套,没有新语法糖)

同步加载并执行模块文件

require 加载源码,看完差不多就懂加载过程了

 // id 为路径标识符
function require(id) {
   /* 查找  Module 上有没有已经加载的 js  对象*/
   const  cachedModule = Module._cache[id]
   
   /* 如果已经加载了那么直接取走缓存的 exports 对象  */
  if(cachedModule){
    return cachedModule.exports
  }
 
  /* 创建当前模块的 module  */
  const module = { exports: {} ,loaded: false , ...}

  /* 将 module 缓存到  Module 的缓存属性中,路径标识符作为 id */  
  Module._cache[id] = module
  /* 加载文件 */
  runInThisContext(wrapper('module.exports = "123"'))(module.exports, require, module, __filename, __dirname)
  /* 加载完成 *//
  module.loaded = true 
  /* 返回值 */
  return module.exports
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

模块id放缓存-》初始化-》加载文件-》返回值

一旦出现某个模块被"循环加载",就只输出已经执行的部分(那一刻的 exports 的值)

因此:

  1. 多次 require 引入同一个文件,实际都是引用的同一个 module.exports 对象,故某个地方进行修改会影响其他地方的访问值

# Es Module

es6 语法,编译时就确定好了

自动提升到顶部

import 使用总结:

  • 导入的属性只读,相对于 const , 无论其是否为基础类型
  • import 的模块运行在严格模式下
  • 导入的变量始终是一个引用,和原变量绑定在一起,无论其是否为基础类型

底层处理的,不是 es5 可以实现的

循环加载的处理:认为引用的模块都是导出好了的,结果在实际执行时使用了尚未导出的引用模块的方法,导致报 undefined

# 文章推荐

https://mp.weixin.qq.com/s/y_uk7wXAfvq8FzcUZrR93w

编辑 (opens new window)
上次更新: 2024/09/01, 23:56:56
浅谈 package-lock.json 合并冲突修复算法
浅谈模块化

← 浅谈 package-lock.json 合并冲突修复算法 浅谈模块化→

最近更新
01
浅谈代码质量与量化指标
08-27
02
快速理解 JS 装饰器
08-26
03
Vue 项目中的 data-v-xxx 是怎么生成的
09-19
更多文章>
Theme by Vdoing | Copyright © 2016-2024 Gahing | 闽ICP备19024221号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式