• js模块化CJS、AMD、CMD、UMD、ESM、IIFE理解


    JS模块化

            JavaScript模块化编程是指将JavaScript代码分割成独立的模块,每个模块都有自己的作用域和接口,可以按需加载和使用。这样可以避免全局变量污染,提高代码的可维护性和可重用性。在ES6之前,JavaScript并没有一个统一的模块化规范,开发人员通常使用CommonJS或AMD等第三方库来实现模块化编程。

    背景

            从四个维度来分析下js模块化,同步异步加载、变量的深浅拷贝、适用范围、代码表现。

            针对于深浅拷贝来说,module.exports+require这样的操作就是浅拷贝可以共享内存,对于export import这样的操作就是深拷贝这个可以看之前的博客

            使用了rollup打包了umd。

    CJS(commonjs)

    同步异步加载:同步
    适用范围:nodejs
    代码表现:

    1. // a.js
    2. module.exports = {
    3. boo: 10
    4. }
    5. // b.js
    6. const {boo} = require('a.js')
    7. console.log(boo)

    AMD

    同步异步加载::异步
    适用范围:nodejs、配合reqirejs可以在浏览器中使用
    代码表现:参考umd代码

    define(["exports"], factory);

    CMD

    同步异步加载:同步
    适用范围:nodejs和配合reqirejs可以在浏览器中使用
    代码表现:参考umd代码

    1. define(function(require, exports, module) {
    2. exports.a = 10
    3. factory(exports);
    4. });

    UMD

    同步异步加载:同步
    适用范围:nodejs和浏览器
    代码表现:兼容了commonjs、cmd、amd

    1. (function (global, factory) {
    2. if (typeof exports === "object" && typeof module !== "undefined") {
    3. // commonjs
    4. factory(exports);
    5. } else if (typeof define === "function" && define.amd) {
    6. // amd
    7. define(["exports"], factory);
    8. } else if (typeof define === "function" && define.cmd) {
    9. // cmd
    10. define(function(require, exports, module) {
    11. exports.a = 10
    12. factory(exports);
    13. });
    14. } else {
    15. // 没有环境
    16. (global = typeof globalThis !== "undefined" ? globalThis : global || self),
    17. factory((global.umd = {}));
    18. }
    19. })(this, function (exports) {
    20. "use strict";
    21. console.log(3424221233);
    22. var sum = function sum(a, b) {};
    23. exports.sum = sum;
    24. Object.defineProperty(exports, "__esModule", { value: true });
    25. });

    ESM

    同步异步加载:异步
    适用范围:浏览器(随着浏览器的发展,可以在script的标签中加入type="module"来支持)和nodejs(Node verison 13.2.0,有两种方式1:package.json中填写type: "modules",2.将文件结尾命名为mjs)
    代码表现:

    1. // a.js
    2. let boo = 10
    3. export default boo
    4. // b.js
    5. import boo from "boo"
    6. console.loG(boo)

    IIFE(立即执行函数)

    同步异步加载:同步
    适用范围:nodejs和浏览器
    代码表现:

    1. (function() {
    2. var foo = "bar";
    3. console.log(foo);
    4. })();

    结论

            在webpack、rollup、esm各种打包器中都可以设置对应的产物类型,我们要根据我们的产物的用途来选择对应的类型,我们一般并不会关心最终的代码产物,但是对于各种类型的产物还是要有一定的了解,这篇文章算是个简单的总结。

    鹰眼:悲哀的弱者,如果你真是一流的剑士,就算没跟我交手也明白你我实力的差距吧

  • 相关阅读:
    IntelliJ IDEA 下 JavaWeb 配置MySQL 连接
    Kafka使用Java管理主题和分区
    云原生大趋势下的容器化技术现状与发展
    SAP GUID分配时出错;不可能保存
    mysql如果存在一行数据,主库和从库主键相同而其他列值不同,源端Update或者delete该行,从库会update和delete这一行吗
    uniapp后台播放音频功能制作
    朋友离职了,一周面试了20多场,我直呼内行
    Ubuntu虚拟机镜像下载及创建
    动规(22)-并查集基础题——CD收藏 cd.cpp(并查集)
    使用supervisor管理你的进程
  • 原文地址:https://blog.csdn.net/qq_40816649/article/details/132438962