模块化

作者: 想吃热干面了 | 来源:发表于2020-09-18 08:17 被阅读0次

一、为什么使用模块化

不使用模块化可能遇到的问题:全局变量同名的问题

A,B在一个项目组中,A创建了一个aaa.js文件,并且设置了一个var flag = true;之后,B创建了bbb.js文件定义了一个var flag = false;在这之后,A因为需求,有创建了一个新的ccc.js文件,并且需要设置一个flag时,想起自己在aaa.js中设置了一个flag,所以就直接用了,并没有设置新的;但是结果确实判断为false,A查看自己的代码却找不到问题所在。这是因为前端代码作用域的问题,ccc.js中判断使用的是bbb.js中的flag,所以是false。当然,开发中一般很少遇到这种问题,因为都会直接重新定义一个flag。

全局变量同名的问题可以使用匿名函数(闭包)的方式解决,但是又会引出新的问题,那就是代码的复用性变差了。因为函数有自己的作用域,所以函数外无法使用函数内定义的变量,函数。这时就出现了模块化的雏形来解决这个问题。

二、什么是模块化

综上,我们为了解决全局变量重名的问题,使用匿名函数,从而引发新的问题,代码复用性变差。为了解决这一问题,模块化的被提出:在匿名函数内部定义一个对对象,将各种需要暴露出到外面的属性和方法添加到对象中,最后将这个对象返回,使用一个模块接受这个对象。这就是模块化。

如下代码,在匿名函数中返回一个obj,其中放入我们需要的值,就可以使用函数内的变量或者函数了。这样就解决了代码复用性的问题

aaa.js文件中这样写
var moduleA = (function () {
  var obj = {};
  var name = '小明';
  var age = 26;
  function sum(num1,num2) {
    return num1 + num2
  };
 var flag = true;
  if (flag){
    console.log(sum(10, 40));
  }

  obj.flag = flag;
  obj.sum = sum;

  return obj;
})();
bbb.js中,可以通过(模块名.属性名)的方式获取需要的值或者函数
(function () {
  if(moduleA.flag) {
    console.log('小明是天才');
  }
  console.log(moduleA.sum(11, 24));
})();

上述就是模块化最基础的封装,模块的原始雏形。
现在前端模块化开发已经有了很多既有的规范,以及对应的实现方案。

常见的模块化规范
  • CommonJS(Node)
  • AMD
  • CMD
  • ES6的Modules

三、CommonJS(了解)

模块化有两个核心:导出和导入
CommonJS的导出:
module.exports = {
  flag: flag,
  sum: sum
}
CommonJS的导入:
var {flag,sum} = require('.../aaa.js')
上面是增强写法,等同于
var aaa = require('.../aaa.js')
var flag = aaa.flag;
var sum = aaa.sum;

四、ES模块化的导入(import)和导出(export)(掌握)

ES6中将一个js文件设置为一个模块:type="module"

<script src="aaa.js" type="module"></script>
<script src="bbb.js" type="module"></script>
<script src="mmm.js" type="module"></script>

这样每个js文件就是一个模块,互相不干扰,不会出现命名重复问题,但如果一个模块需要使用另一个模块的数据,就需要导出导入了。

export导出的几种方式

let name = '小明';
let age = 25;
let flag = true;
function sum(num1, num2) {
  return num1 + num2
}
if (flag){
  console.log(sum(10, 20));
}

//1.第一种导出方式
export {
  flag, sum
}

//2.第二种导出方式
export var num1 = 10000;
export var height = 1.88;

//3.导出function/class
export function mul(num1, num2) {
  return num1 * num2
}

export class Person{
  run() {
    console.log('在奔跑');
  }
}

//4.export default  注意:在一个模块中default只能有一个

const address = '北京';
export default address;

// export default function (string) {
//   console.log(string);
// }

import导入的几种方式

//1.导入{}中的数据
import {flag, sum} from "./aaa.js";
if(flag) {
  console.log('小明是天才');
}

//2.对应第二种导出方式
import {num1, height} from "./aaa.js";
console.log(num1);
console.log(height);

//3.导入function/class
import {mul, Person} from "./aaa.js";
console.log(mul(10, 20));

var a = new Person();
a.run();

//4.导入default
import myFuc from "./aaa.js";
console.log(myFuc);
// myFuc('默认事件');


//5.全部导入
import * as aaa from "./aaa.js";
console.log(aaa.flag);
console.log(aaa.mul(11, 20));

相关文章

  • ES6学习笔记 II

    模块化 注意:模块化需要放到服务器环境使用模块化: 定义模块化如下 export export const a =...

  • 前端开发——模块化(css模块化开发)

    掌握模块化开发的思想是我们进行模块化开发的基础。他有以下几部分组成: 模块化开发的优势 css模块化 css模块化...

  • Node.js模块化学习

    模块化的基本概念Node.js 中模块化npm与包模块的加载机制 模块化的基本概念 什么是模块化 模块化是指解决一...

  • webpack基础笔记

    webpack基础 1.前端工程化 实际的前端开发: 模块化:(js的模块化,css的模块化,资源的模块化) 组件...

  • 模块化开发

    js模块化开发vue模块化开发

  • Vue前端工程化

    1.模块化的分类 A.浏览器端的模块化 B.服务器端的模块化 C.ES6模块化 小结:推荐使用ES6模块化,因为A...

  • 前端工程化

    1.模块化的分类 A.浏览器端的模块化 B.服务器端的模块化 C.ES6模块化 小结:推荐使用ES6模块化,因为A...

  • vue5

    es6新内容 class 解构赋值 扩展对象 模块化 什么是模块化 模块的作用 怎么实现模块化 模块化的标准 Co...

  • Vue基础教程之-组件核心概念(四)

    一、模块化 1.1 为什么需要模块化 没有模块化的世界:全局变量污染、难以管理的依赖。常见的模块化标准:Commo...

  • vue项目基建

    路由模块化 , 高频全局组件模块化 权限

网友评论

      本文标题:模块化

      本文链接:https://www.haomeiwen.com/subject/lqlfsktx.html