javascript模块化学习

server/2024/10/21 9:57:46/

Js模块化

【成长期】原始的js模块化

//    使用立即执行函数 + var的方式
//    例如 有base.js 和 main.js两个文件
//    其中main.js需要调用base.js中的函数 可以这样写/** base.js  */
var baseModule = (function () {var a = 1;var b = 11;var c = 22;console.log(a, b, c);function addA() {a++;}return {addA,}
})()/** main.js  */
baseModule.addA();

【成熟期】CommonJs

//    base.js
var a = 1;
var b = 2;
var c = 3;module.exports = {a, b, c
}//    main.js
const base = require('./base.js');
console.log(base.a,base.b,base.c
)/** 编译后实际执行的是以下的代码  */
//   base.js
(function (exports, require, module, __filename, __dirname) {...let count = 0;const increase = () => ++count;module.exports = {increase,count}return module.exports;}
).call(thisValue, module.exports, require, module, __filename, __dirname)//   main.js
(function (exports, require, module, __filename, __dirname) {...}
).call(thisValue, exports, require, module, __filename, __dirname)

● 缺点
○ 无法动态加载模块只支持同步加载模块
○ 因为commonJs是为了Nodejs设计的 没有异步问题不大
○ 服务器端同步加载模块的方案

面试题:
● module.exports跟export之间的关系
○ 两个指向的是同一个东西 module.exports = exports
○ module.exports可以支持只导出单个变量或者函数
● 如何避免循环引用
○ commonJs本身做了缓存 当require过某个文件时 它会将结果缓存下来
○ 下次使用就不用重新再走一遍
○ 可以重新设计该模块

AMD async module define

非同步加载模块
允许异步加载 define(id, [depends], callback); require([module], callback);

//    定义模块的方式
define('amdCountModule',['depModule1', 'depModule2'],(depModule1, depMOdule2) => {return {...}}
)require(['amdCountModule'],amdCountModule => {amdCountModule.xxx...   }
)//    如果再AMD中使用require的方式加载同步模块可以么?
define(require => {...,const depModule1 = require('depModule1');const depModule2 = require('depModule2');exports.xx = xx;exports.cc = cc;
})

CMD

define(function(require, exports, module) {let depModule1 = require('depModule1');deoModule1.xxx();if (xxx) {let depModule2 = require('depModule2');}}
)

UMD universal module define

…太复杂了

ESM ecmscript module

import xxx from '..';import { xx } from '..';export xxx;export default {...
}//    在nodejs中使用esm
//    首先命名要改成 .mjs结尾
//    node >= 13.2.0//    如何支持异步加载
import('...');    //    返回的是一个promise

http://www.ppmy.cn/server/4006.html

相关文章

static+单例模式+类的复合继承

汇编语言 汇编语言是最靠谱的验证“编程语言相关知识点”正确性的方式 汇编语言与机器语言一一对应,每一条机器语言都有与之对应的汇编指令 机器语言是计算机使用的语言,它是一串二进制数字 汇编语言可以通过汇编得到机器语言机器语言可以通过反汇编得到…

FILE类与IO流

目录 File类的实例化与常用方法 File类的理解 文件路径的表示方式: API的使用 IO流概述与流的分类 I/O流中的是Input/Output的缩写 IO流的分类(不同角度) Java程序中的IO流涉及40多个,但实际上都是由4个抽象类衍生出来的。 F…

【教程】ubuntu20.04 下配置 Charm-crypto 0.5 实验环境

目录 前言先决条件基本依赖安装准备好 gcc,make 和 perl准备好 m4,flex,bison 和 libssl-dev安装 Python3.x,pip3 和 pyparsing 安装 OpenSSL安装 GMP5.x安装 PBC安装 Charm-crypto5.0安装开发环境检验 Charm-crypto5.0 安装成功主…

《综合品酒师》培训中FENDI CLUB精酿啤酒掀起品质生活新浪潮

近日,云仓酒庄的《综合品酒师》培训活动成功刷新了世界纪录,这一壮举不仅彰显了云仓酒庄在人才培养方面的专业实力,更以其与众不同的FENDI CLUB精酿啤酒掀起了酒水行业的新风尚。作为一名业内专业人士,我深入剖析了此次培训对酒水…

《深入浅出多模态》: 多模态经典模型:BLIP

🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、资料共享、行业最新动态以、实践教程、求职…

Python基础学习之数据切片

数据切片介绍: 切片的基本语法是data[start:stop:step],其中: start 是切片开始的索引(包括该索引处的元素)。 stop 是切片结束的索引(不包括该索引处的元素)。 step 是切片的步长&#xff0…

生活中的洪特规则

不知道你还记不记得高中物理所学的一个奇特的物理规则:洪特规则。 洪特规则是德国人弗里德里希洪特(F.Hund)根据大量光谱实验数据总结出的一个规律,它指出电子分布到能量简并的原子轨道时,优先以自旋相同的方式分别占…

面试:lock 和 synchronized

一、语法层面 synchronized 是关键字,源码在jvm中,用c语言实现Lock 是接口,源码由jdk提供,用java语言实现使用synchronized时,退出同步代码块锁会自动释放,而使用Lock时,需要手动调用unlock方法…