我们先来了解下前端开发领域的开发历程。

# 面向过程开发

在很早之前由于前端做的工作很少,会采用面向过程的开发方式,将代码放到一个.js文件中:

index.html

<p>这里是我们网页的内容</p>
<div id="root"></div>
<script src="./index.js"></script>

index.js

var root = document.getElementById('root');

// header模块
var header = document.createElement('div');
header.innerText = 'header';
root.appendChild(header);

// sidebar模块
var sidebar = document.createElement('div');
sidebar.innerText = 'sidebar';
root.appendChild(sidebar);

// content模块
var content = document.createElement('div');
content.innerText = 'content';
root.appendChild(content);

# 面向对象开发

随着 js 的不断发展,它所能解决的问题也越来越多,如果再像面向过程那样把所有代码写在同一个.js文件中,那么代码将变得非常难以理解和维护,此时面向对象开发模式便出现了,一个面向对象开发模式可能如下所示。

index.html

<p>这里是我们网页的内容</p>
<div id="root"></div>
<script src="./src/header.js"></script>
<script src="./src/sidebar.js"></script>
<script src="./src/content.js"></script>
<script src="./index.js"></script>

header.js

function Header() {
  var header = document.createElement('div');
  header.innerText = 'header';
  root.appendChild(header);
}

sidebar.js

function Sidebar() {
  var sidebar = document.createElement('div');
  sidebar.innerText = 'sidebar';
  root.appendChild(sidebar);
}

content.js

function Content() {
  var content = document.createElement('div');
  content.innerText = 'content';
  root.appendChild(content);
}

index.js

var root = document.getElementById('root');
new Header();
new Sidebar();
new Content();

面向对象开发模式解决了面向过程开发模式中的一些问题,但似乎又引入了一些新的问题。

  • 每一个模块都需要引入一个.js文件,随着模块的增多,这会影响页面性能。
  • 在index.js文件中,并不能直接看出模块的逻辑关系,必须去页面才能找到。
  • 在index.html页面中,文件的引入顺序必须严格按顺序来引入,例如:index.js必须放在最后引入,如果把- header.js文件放在index.js文件后引入,那么代码会报错。

# 现代开发模式

根据面向对象开发模式中的一系列问题,随后各种模块化加载的方案如雨后春笋,例如:ES Module、AMD、CMD以及CommonJS等,一个ES Module模块化加载方案可能如下所示。

index.html

<p>这里是我们网页的内容</p>
<div id="root"></div>
<script src="./index.js"></script>

header.js

export default function Header() {
  var root = document.getElementById('root');
  var header = document.createElement('div');
  header.innerText = 'header';
  root.appendChild(header);
}

sidebar.js

export default function Sidebar() {
  var root = document.getElementById('root');
  var sidebar = document.createElement('div');
  sidebar.innerText = 'sidebar';
  root.appendChild(sidebar);
}

content.js

export default function Content() {
  var root = document.getElementById('root');
  var content = document.createElement('div');
  content.innerText = 'content';
  root.appendChild(content);
}

index.js

import Header from './src/header.js';
import Sidebar from './src/sidebar.js';
import Content from './src/content.js';

new Header();
new Sidebar();
new Content();