Node.js系列三 彻底掌握前端模块化(上篇)

2021-02-04  本文已影响0人  懂会悟

1、 什么是模块化开发

1.1、 JavaScript设计缺陷

那么,到底什么是模块化开发呢?

上面说提到的结构,就是模块;
按照这种结构划分开发程序的过程,就是模块化开发的过程;

无论你多么喜欢JavaScript,以及它现在发展的有多好,我们都需要承认在Brendan Eich用了10天写出JavaScript的时候,它都有很多的缺陷:

Brendan Eich本人也多次承认过JavaScript设计之初的缺陷,但是随着JavaScript的发展以及标准化,存在的缺陷问题基本都得到了完善。

在网页开发的早期,Brendan Eich开发JavaScript仅仅作为一种脚本语言,做一些简单的表单验证或动画实现等,那个时候代码还是很少的:

但是随着前端和JavaScript的快速发展,JavaScript代码变得越来越复杂了:

所以,模块化已经是JavaScript一个非常迫切的需求:

在这个章节,我们将详细学习JavaScript的模块化,尤其是CommonJS和ES6的模块化。

1.2. 没有模块化的问题

我们先来简单体会一下没有模块化代码的问题。

我们知道,对于一个大型的前端项目,通常是多人开发的(即使一个人开发,也会将代码划分到多个文件夹中):

小明开发了a.js文件,代码如下(当然真实代码会复杂的多):

// a.js
var flag = true;

if (flag) {
  console.log("aaa的flag为true")
}

小丽开发了b.js文件,代码如下:

// b.js
var flag = false;

if (!flag) {
  console.log("bbb使用了flag为false");
}

很明显出现了一个问题:

但是,小明又开发了c.js文件:

// c.js
if (flag) {
  console.log("使用了aaa的flag");
}

问题来了:小明发现c.js中的flag值不对

备注:引用路径如下:

// test.html
<script src="./a.js"></script>
<script src="./b.js"></script>
<script src="./c.js"></script>

所以,没有模块化对于一个大型项目来说是灾难性的。

当然,我们有办法可以解决上面的问题:立即函数调用表达式(IIFE)IIFE (Immediately Invoked Function Expression)

a.js
const moduleA = (function () {
  var flag = true;

  if (flag) {
    console.log("aaa的flag为true")
  }

  return {
    flag: flag
  }
})();
// b.js
const moduleB = (function () {
  var flag = false;

  if (!flag) {
    console.log("bbb使用了flag为false");
  }
})();
// c.js
const moduleC = (function() {
  const flag = moduleA.flag;
  if (flag) {
    console.log("使用了aaa的flag");
  }
})();

命名冲突的问题,有没有解决呢?解决了。

但是,我们其实带来了新的问题:

所以,我们会发现,虽然实现了模块化,但是我们的实现过于简单,并且是没有规范的。

JavaScript社区为了解决上面的问题,涌现出一系列好用的规范,接下来我们就学习具有代表性的一些规范。

上一篇 下一篇

猜你喜欢

热点阅读