当前位置:网站首页>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框架组件化 + 设计模式
边栏推荐
- ES cluster_ block_ exception read_ only_ allow_ Delete question
- Redis系列——redis启动,客户端day1-2
- ZRaQnHYDAe
- Oracle中计算除法——解决除数为零报错
- 安装homebrew报错汇总
- 执行npm install -g serve时报错权限权限问题解决方案
- php array_merge详解
- 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
- China imported wine circulation and investment market survey and Future Development Trend Outlook report 2022-2027
- 5,10,15,20-tetra (4-methoxycarbonylphenyl) porphyrin tcmpp purple crystal; Meso-5,10,15,20-tetra (4-methoxyphenyl) porphyrin tmopp|zn[t (4-mop) p] and co[t (4-mop) p] complexes
猜你喜欢

Matlab linear programming model learning notes

MySQL

【元胞自动机】基于元胞自动机实现高速公路收费站交通流问题附matlab代码

Parameter index out of range (0 < 1) (1> number of parameters, which is 0

Tetra - (4-pyridyl) porphyrin tpyp and metal complexes zntpyp/fetpyp/mntpyp/cutpyp/nitpyp/cotpyp/ptpyp/pdtpyp/cdtpyp (supplied by Qiyue porphyrin)
![[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

ZRaQnHYDAe

一项听起来大胆,并且非常牛逼的操作——复刻一个 Netflix

【图像检测】基于Itti模型实现图像显著性检测附matlab代码
![[feature extraction] feature selection of target recognition information based on sparse PCA with Matlab source code](/img/79/053e185f96aab293fde54578c75276.png)
[feature extraction] feature selection of target recognition information based on sparse PCA with Matlab source code
随机推荐
【图像增强】基于人工多重曝光融合AMEF实现图像去雾附matlab代码
MySQL
QTreeWidget And QTableWidget
NumPy学习挑战第一关-NumPy的下载与安装
Shell programming - user information management
[image detection] image saliency detection based on ITTI model with matlab code
[image fusion] multimodal medical image fusion based on coupled feature learning with matlab code
ES cluster_block_exception read_only_allow_delete问题
ES cluster_ block_ exception read_ only_ allow_ Delete question
Promise API for getting started with the web
item2安装配置及环境失效问题解决
[image fusion] MRI-CT image fusion based on gradient energy, local energy and PCA fusion rules with matlab code
MySQL operation database
Massive log collection tool flume
Analyze 5 indicators of NFT project
Tetradecanoxy tetraphenylporphyrin methacrylate mm-tpp-14c; Cetanoxy tetraphenyl porphyrin methacrylate mm-tpp-16c; Purple solid; Qiyue supply
Fmt Must the result of println (true) be true?
Installation homebrew error summary
Turris omnia: an open source router technology favored by hackers
【路径规划】基于改进人工势场实现机器人路径规划附matlab代码