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
      • 浅谈模块化
        • 拓展阅读
    • CSS 模块化

    • 工程质量

    • 前端测试

    • CI&CD

  • 应用基础

  • 专业领域

  • 业务场景

  • 大前端
  • 工程能力
  • JS 模块化
gahing
2020-01-02
目录

浅谈模块化草稿

AMD/UMD/CommonJS/ESM

# CommonJs 如何用在浏览器上

require module exports 是 nodejs 运行时提供的接口,所以只能对这些接口进行模拟

核心思想是注册模块(将模块放入数组)和读取模块(读取时通过模块id读取到对应的模块)

模拟倒还好,主要是加载模块a的时候引入模块b 这时候浏览器还得去下载b,下载b完执行然后才进行执行a,这要怎么实现?

有种做法是一开始就对代码做静态分析,将模块与对应的依赖返回给浏览器,必须依赖下载执行完才执行该模块

另外的做法是定一套模板封装模块定义,于是出现了 AMD 和 CMD

AMD 的主要实现为 requireJS ,定义了两个函数 define 和 require ,前者注册模块,后者添加依赖及依赖模块加载完后的回调

AMD推崇依赖前置,在定义模块的时候就要声明其依赖的模块

CMD 的主要实现为 seaJS

CMD推崇就近依赖,只有在用到某个模块的时候再去require

# nodejs 中如何使用 esm

package.json "type" field

or

node --experimental-modules main.mjs
1

# 浏览器不支持 ES Module 的话,需要用 babel 转,转后有什么不同

# CommonJs 和 ES Module 的区别

CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。

所以

esm 在编译的时候,js引擎会对脚本进行静态分析,遇到import命令就会生成一个只读引用,等到真正执行代码时候再通过这个引用去该模块里面取值,因此原始值变了import加载的值也会变。

cjs 输出拷贝,esm 输出引用

cjs demo


1

this 值不同,前者为模块对象,后者为 undefined,同时也说明了作用域不同

esm 的 import 有 const 的效果,即基础类型的话不可修改,对象的话不可修改引用地址。动态引用,不会缓存值

esm export default 1 导出的其实是一个 key 为 default 变量,其值为 1

然后可以 import xx from '' 中拿到,这个 xx 随便写都写

而 import * as obj from '' 拿到的是所有引用,包括 default 等;用了这个不能再使用其他的如 * as x,{xx} 不然存在多个相同引用

# 处理循环加载

# 拓展阅读

ES6-模块与-CommonJS-模块的差异 (opens new window)

编辑 (opens new window)
上次更新: 2024/09/01, 23:56:56
commonjs与esmodule
CSS 模块化方案对比

← commonjs与esmodule CSS 模块化方案对比→

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