当前位置:网站首页>js模块化
js模块化
2022-06-26 07:10:00 【_语墨】
文章目录
js模块化
一、背景
JS本身简单的页面设计:页面动画+表单提交
并无模块化 or 命名空间的概念
JS的模块化需求日益增长
二、模块化的发展
1.幼年期: 无模块化
1.开始需要在页面中增加一些不同的js: 动画、表单、格式化等
2.多种js文件被分在不同的文件中
3.不同的文件又被同一个模板引用
<script src="jquery.js"></script>
<script src="main.js"></script>
<script src="dep1.js"></script>
//……
认可:
文件分离是最基础的模块化的第一步
缺点:
污染全局作用域,不利于大型项目的开发以及多人团队的共建
2.成长期: IIFE(语法侧的优化)
IIFE: Immediately Invoked Function Expression,立即调用的函数表达式。也就是 在函数声明的同时立即调用这个函数。
利用函数的块级作用域,定义一个函数,立即执行,初步实现了一个最最最简单的模块。
尝试去定义一个最简单的模块:
const iifeModule = (() => {
let count = 0;
return {
increase: () => ++count;
reset: () => {
count = 0;
}
}
})();
iifeModule.increase();
iifeModule.reset();
追问1:有额外依赖时,如何优化IIFE相关代码
答:以参数的形式传参
优化1:依赖其他模块的IIFE
const iifeModule = ((dependencyModule1, dependencyModule2) => {
let count = 0;
return {
increase: () => ++count;
reset: () => {
count = 0;
}
}
})(dependencyModule1, dependencyModule2);
iifeModule.increase();
iifeModule.reset();
追问2:了解早期jquery的依赖处理以及模块加载方案吗?/ 了解传统IIFE是如何解决多方依赖的问题
答:IIFE加传参调配
实际上,jQuery等框架应用了revealing的写法。
const iifeModule = ((dependencyModule1, dependencyModule2) => {
let count = 0;
const increase = () => ++count;
const reset = () => {
count = 0;
}
//只返回方法,不需要关心实现的方式
return {
increase, reset
}
})(dependencyModule1, dependencyModule2);
iifeModule.increase();
iifeModule.reset();
3.成熟期
CJS-Commonjs
node.js制定
特征:
- 通过module+exports区对外暴露接口
- 通过require来调用其他模块
模块组织方式:
main.js文件
// 引入部分
const dependencyModule1 = require(./dependencyModule1);
const dependencyModule2 = require(./dependencyModule2);
// 处理部分
let count = 0;
const increase = () => ++count;
const reset = () => {
count = 0;
}
// 做一些跟引入依赖相关事宜……
// 暴露接口部分
exports.increase = increase;
exports.reset = reset;
module.exports = {
increase, reset
}
模块使用方式:
const {
increase, reset } = require('./main.js');
increase();
reset();
追问1:实际执行处理
(function (thisValue, exports, require, module) {
const dependencyModule1 = require(./dependencyModule1);
const dependencyModule2 = require(./dependencyModule2);
// 业务逻辑……
}).call(thisValue, exports, require, module);
优点:
CommonJs率先在服务端实现了,从框架层面解决依赖,全局变量污染的问题
缺点:
主要针对了服务端的解决方案。对于伊布拉取的处理整合不是那么友好。
新的问题:异步依赖
AMD规范
通过异步加载+允许制定回调函数
经典实现框架是:require.js
新增定义方式:
// 通过define来定义一个模块,然后require进行加载
/* define params: 模块名,依赖模块,工厂方法 */
define(id, [depends], callback);
require([module], callback);
模块定义方式
define('amdModule', ['dependencyModule1', 'dependencyModule2'], (dependencyModule1, dependencyModule2) => {
// 业务逻辑
// 处理部分
let count = 0;
const increase = () => ++count;
const reset = () => {
count = 0;
}
return {
increase, reset
}
})
引入模块:
require(['amdModule'], amdModule => {
amdModule.increase();
})
追问2:如果在AMDmodule中想兼容已有代码,怎么办
define('amdModule', [], require => {
// 引入部分
const dependencyModule1 = require(./dependencyModule1);
const dependencyModule2 = require(./dependencyModule2);
// 处理部分
let count = 0;
const increase = () => ++count;
const reset = () => {
count = 0;
}
// 做一些跟引入依赖相关事宜……
return {
increase, reset
}
})
追问3:AMD中使用revealing
define('amdModule', [], (require, export, module) => {
// 引入部分
const dependencyModule1 = require(./dependencyModule1);
const dependencyModule2 = require(./dependencyModule2);
// 处理部分
let count = 0;
const increase = () => ++count;
const reset = () => {
count = 0;
}
// 做一些跟引入依赖相关事宜……
export.increase = increase();
export.reset = reset();
})
define('amdModule', [], require => {
const otherModule = require('amdModule');
otherModule.increase();
otherModule.reset();
})
追问4:兼容AMD&CJS/如何判断CJS和AMD
UMD的出现
(define('amdModule', [], (require, export, module) => {
// 引入部分
const dependencyModule1 = require(./dependencyModule1);
const dependencyModule2 = require(./dependencyModule2);
// 处理部分
let count = 0;
const increase = () => ++count;
const reset = () => {
count = 0;
}
// 做一些跟引入依赖相关事宜……
export.increase = increase();
export.reset = reset();
}))(
// 目标是一次性区分CommonJSorAMD
typeof module === "object"
&& module.exports
&& typeof define !== "function"
? // 是 CJS
factory => module.exports = factory(require, exports, module)
: // 是AMD
define
)
优点:
适合在浏览器中加载异步模块,可以并行加载多个模块
缺点:
会有引入成本,不能按需加载
CMD规范
按需加载
主要应用的框架 sea.js
define('module', (require, exports, module) => {
let $ = require('jquery');
// jquery相关逻辑
let dependencyModule1 = require('./dependecyModule1');
// dependencyModule1相关逻辑
})
优点:
按需加载,依赖就近
依赖于打包,加载逻辑存在于每个模块中,扩大模块体积
追问5:AMD&CMD区别
依赖就近,按需加载。
AMD 推崇依赖前置、提前执行,CMD推崇依赖就近、延迟执行
ES6模块化 :走向新时代
新增定义:
引入关键字 — import
导出关键字 — export
模块引入、导出和定义的地方
// 引入区域
import dependencyModule1 from './dependencyModule1.js';
import dependencyModule2 from './dependencyModule2.js';
// 实现代码逻辑
let count = 0;
export const increase = () => ++count;
export const reset = () => {
count = 0;
}
// 导出区域
export default {
increase, reset
}
模板引入的地方
<script type="module" src="esModule.js"></script>
node中:
import {
increase, reset } from './esModule.mjs';
increase();
reset();
import esModule from './esModule.mjs';
esModule.increase();
esModule.reset();
追问6:动态模块
考察 export promise
ES11原生解决方案:
import('./esModule.js').then(dynamicEsModule => {
dynamicEsModule.increase();
})
优点(重要性):通过一种最统一的形态整合了js的模块化
缺点(局限性):本质上还是 运行的依赖分析
解决模块化的新思路:前端工程化
完全体 :
webpack为核心的工程化 + mvvm框架组件化 + 设计模式
边栏推荐
- NumPy学习挑战第一关-NumPy的下载与安装
- MySQL basic usage 01
- SQL
- Network IO, disk IO
- . Net 20th anniversary! Microsoft sends a document to celebrate
- Global and Chinese silicon carbide monocrystal furnace market survey and future production and marketing demand analysis report 2022-2027
- China's audio industry competition trend outlook and future development trend forecast report 2022 Edition
- Iron / zinc / copper / platinum metal complexes such as 5,10,15,20-tetra (4-hydroxyphenyl) porphyrin (THPP) / (thppfe) / (thppzn) / (thppcu) / (thpppt) - Qiyue R & D
- 3,3 '- di (3,4-dicarboxyphenoxy) -4,4' - diphenylethynylbiphenyldianhydride (bpebpda) / porphyrin 2dcofs (H2P COF, ZNP COF and cup COF) supplied by Qiyue
- China polyphenylene oxide Market Development Prospect and Investment Strategy Research Report 2022-2027
猜你喜欢

Mysql操作数据库

ZRaQnHYDAe

基于sanic的服务使用celery完成动态修改定时任务

Zraqnhydae

Quickly find five channels for high-quality objects, quickly collect and avoid detours

【图像增强】基于人工多重曝光融合AMEF实现图像去雾附matlab代码
![[image detection] image saliency detection based on ITTI model with matlab code](/img/f3/a8b13431724059f8c8a77961778c67.png)
[image detection] image saliency detection based on ITTI model with matlab code

Deep exploration image theme color extraction

How can I find the completely deleted photos in Apple mobile phone?

MySQL operation database
随机推荐
GMP模型
[image enhancement] image defogging based on artificial multiple exposure fusion amef with matlab code
炒股怎么选择证券公司?手机开户安全么?
Fmt Must the result of println (true) be true?
Excel中Unicode如何转换为汉字
Shell input validation alphanumeric only
One chip realizes functions such as spray 𞓜 ws2812 drive | key touch | LED display | voice broadcast chip and simplifies the design of humidifier products
ZRaQnHYDAe
Analysis report on market demand and investment competitiveness of China's cyclohexanone industry (2022 Edition)
[path planning] robot path planning based on improved artificial potential field with matlab code
Procedure macros in rust
Shell programming - user information management
Development trends and prospects of acrylamide crystallization market in the world and China 2022-2027
The performance of iron and steel enterprises was expected to be good in January this year. Since February, the prices of products of iron and steel enterprises have increased significantly. A mighty
Turris omnia: an open source router technology favored by hackers
【特征提取】基于稀疏PCA实现目标识别信息特征选择附matlab源码
China polyphenylene oxide Market Development Prospect and Investment Strategy Research Report 2022-2027
快速找到优质对象的5种渠道,赶紧收藏少走弯路
Big factory interview TCP protocol classic 15 consecutive questions! 22 pictures to make you fully understand
5,10,15,20-tetra (4-bromophenyl) porphyrin (h2tppbr4) /5.2.15,10,15,20-tetra [4-[(3-aminophenyl) ethynyl] phenyl] porphyrin (tapepp) Qiyue porphyrin reagent