前言
关于模块化,最直接的表现就是我们写的 require 和 import 关键字,如果查阅相关资料,就一定会遇到 CommonJS 、CMD AMD 这些名词,以及 RequireJS、SeaJS 等陌生框架。比如 SeaJS 的官网 这样描述自己: “简单友好的模块定义规范,Sea.js 遵循 CMD 规范。自然直观的代码组织方式,依赖的自动加载……”
作为前端新手,我表示实在是一脸懵逼,理解不能。按照我一贯的风格,介绍一个东西之前总得解释一下为什么需要这个东西。
JavaScript 基础
做客户端的同学对 OC 的 #import "classname"、Swift 的 Module 以及文件修饰符 和 Java 的 import package+class 模式应该都不陌生。我们习惯了引用一个文件就是引用一个类的模式。然而在 JavaScript 这种动态语言中,事情又有一些变化,举个例子说明:
Hello Wrold
HTML 中的 <script> 标签可以理解为 import,这样按钮的 onclick 事件就可以调用定义在 index.js 中的 onPress 函数了。</p>
<p> 假设随着项目的发展,我们发现点击后的文字需要动态生成,并且由别的 JS 文件生成,那么简单的 index.js 就无法胜任了。我们假设生成的内容定义在 math.js 文件中:</p>
<p>// math.js<br>function add(a, b) {<br>return a + b;<br>}<br></p>
<p> 按照客户端的思维,此时的 index.js 文件应该这样写:</p>
<p>// index.js<br>import "math.js"<br> <br>function onPress() {<br>var p = document.getElementById('hello');<br>p.innerHTML = add(1, 2);<br>}<br></p>
<p> 很不幸,JavaScript 并不支持 import 这种写法,也就是说在一个 JS 文件中根本无法引用别的 JS 文件中的方法。正确的解决方案是在 index.js 中直接调用 add 方法,同时在 index.html 中引用 math.js:</p>
<p><html><br><head><br><script type="text/javascript" src="index.js"></script>
Hello Wrold