当前位置:网站首页>模块化开发
模块化开发
2022-07-23 20:30:00 【_语义错误】
目录
一、为什么需要模块化开发?(了解)
- 网页开发早期,js做一些简单的表单验证或动画实现等,代码量少。直接将代码写在<script>标签中;
- ajax异步请求的出现,慢慢形成前后端分离,客户端需要完成的事情越来越多,代码量也是与日俱增。为了应对代码量的剧增,我们通常会将代码组织在多个js文件中,进行维护。但是这种维护方式,依然不能避免一些灾难性的问题:比如全局变量同名问题,另外,这种代码的编写方式对js文件的依赖顺序几乎是强制性的;但是当js文件过多,比如有几十个的时候,弄清楚它们的顺序是一件比较同时的事情。
- 我们可以使用匿名函数来解决方面的重名问题,但是如果我们希望在main.js文件中,用到 aaa.js 定义的 flag,应该如何处理呢?显然,另外一个文件中不容易使用,因为flag是一个局部变量。
- 使用模块作为出口:我们可以使用将需要暴露到外面的变量,使用一个模块作为出口,来看下对应的代码:
(1)在匿名函数内部,定义一个对象。
(2)给对象添加各种需要暴露到外面的属性和方法(不需要暴露的直接定义即可)。
(3)最后将这个对象返回,并且在外面使用了一个MoudleA接受。
接下来,我们在man.js中怎么使用呢?
我们只需要使用属于自己模块的属性和方法即可
这就是模块最基础的封装,事实上模块的封装还有很多高级的话题:
但是我们这里就是要认识一下为什么需要模块,以及模块的原始雏形。
幸运的是,前端模块化开发已经有了很多既有的规范,以及对应的实现方案。
常见的模块化规范:CommonJS、AMD、CMD,也有ES6的Modules
二、CommonJS
1、模块化有两个核心:导出和导入
CommonJS的导出:
module.export = {
flag:true,
test(a,b){
return a + b
},
demo(a,b){
return a * b
}
}CommonJS的导入:
let {test,demo,flag} = require('modeleA');
// 等同于
let _mA = require('moduleA');
let test = _mA.test;
let demo = _mA.demo;
let flag = _mA.flag;
2、ES6的export基本使用:
export指令用于导出变量,2种方法:
//方法一
export let name = 'Hi'
export let age = 18
// 方法二
let name = 'Hi'
let age = 18
export{name,age}
输出函数或者输出类,2种方法:
// 方法一
export function test(content){
console.log(content);
}
export class Person {
constructor(name,age){
this.name = name;
this.age = age;
}
// 定义函数
run(){
console.log(this.name + '在奔跑');
}
}// 方法二
function test(content){
console.log(content);
}
export class Person {
constructor(name,age){
this.name = name;
this.age = age;
}
// 定义函数
run(){
console.log(this.name + '在奔跑');
}
}
export{test.Person}
export default
使用情景:一个模块中包含某个的功能,我们并不希望给这个功能命名,而且让导入者可以自己来命名
// info.js
export default function (){
console.log('default function');
}
// main.js
import myFunc from './info.js'
myFunc()
注意:export default在同一个模块中,不允许同时存在多个。
3、ES6的import使用
使用export指令导出模块对外提供的接口,下面我们就可以通过import命令来加载对应模块
首先,我们需要在HTML代码中引入两个js文件,并且类型需要设置为module
import指令用于导入模块中的内容,比如main.js的代码
import {name,age,height} from "./info.js"
console.log(name,age,height);
如果我们希望某个模块中所有的信息都导入,一个个导入显然有些麻烦:
通过 * 可以导入模块中所有的export变量
但是通常情况下我们需要给 * 起一个别名,方便后续的使用
import * as info from './info.js'
console.log(info.name,info.age,info.height);
参考:
边栏推荐
- AB球队得分流水表,得到连续三次得分的队员名字 和每次赶超对手的球员名字(pdd)
- Phar deserialization
- [PDD interview] analyze the activity of applications (cameras) in mobile phones
- QT 设置缓存和编译输出路径
- 去广场吃饭
- ssm+mysql实现零食商城系统(电商购物)
- From which dimensions can we judge the quality of code? How to have the ability to write high-quality code?
- cJSON库的使用
- 解决1秒钟内,用户快速点击,重复请求的问题
- Data warehouse 4.0 notes - data warehouse environment construction - DataGrid preparation and data preparation
猜你喜欢

微软网站上关于在Edge浏览器中打开或关闭smartScreen的说明有误

jsp+ssm+mysql实现的租车车辆管理系统汽车租赁

哈希表、无序集合、映射的原理与实现

Flink Catalog解读

Parity rearrangement of Bm14 linked list

OpenLayers实例-Advanced View Positioning-高级视图定位

OpenLayers实例-Advanced Mapbox Vector Tiles-高级Mapbox矢量贴图

解决1秒钟内,用户快速点击,重复请求的问题

考研 | 高等数学 Chapter4 不定积分

深度学习-NLP经典论文、课程、论文等资源整理分享
随机推荐
[Q] Error redirecting nmcli manual to TXT text
NLP hotspots from ACL 2022 onsite experience
Lyscripttools extended script module
KubeVela离线安装
NLP领域历史最全必读经典论文分类整理分享(附中文解析)
中金证券新课理财产品的收益有百分之6吗?我想要开户理财
一文教你Mysql安装
Cesium knockout怎么用?
Vrrp+mstp configuration details [Huawei ENSP experiment]
Interpretation of Flink catalog
数组——209.长度最小的子数组
[Yunxiang book club No. 13] Chapter V ffmpeg common methods for viewing media information and processing audio and video files
ModelBox端云协同AI开发套件(RK3568)试用记录(二)
数组——59. 螺旋矩阵 II
【云享读书会第13期】第四章 音频文件的封装格式和编码格式
选择大于努力!贵阳校区小哥哥0基础成功转行软件测试收获12K!
Mysql的前世今生,Hello,Mysql
去广场吃饭
prime_series_level-1
Visual slam learning | basic chapter 01
(1)在匿名函数内部,定义一个对象。