web应用越变的庞大,模块化越显得重要,尤为Nodejs的流行,Javascript不限用于浏览器,还用于后台或其余场景时,没有Class,没有Package的Javascript语言变得难以管理,因而出现CommonJS项目,提出了一些规范模块化的写法,在Nodejs中广泛应用,一样浏览器端也出现了相似的解决方案,并结合浏览器异步加载的特性,有RequireJS提出的AMD(Asynchronous Module Definition)规范,以及SeaJS提出的CMD(Common Module Definition)规范,二者都实现Javascript了模块化定义的APIs,各有异同,下面将分别使用两种方案,实现Qunee组件的模块化加载javascript
关于RequireJS的文章不少,这里重复介绍,列出几篇专业文章:html
两种模块化方式,都使用define来定义模块,因此须要将qunee.js改形成模块化的方式,由于Qunee只有一个全局变量,自己就符合模块化的写法,直接用define包一下就能够了,起名为qunee-module.js前端
lib/qunee-module.jsjava
define(function (require, exports, module) { return function (t, i, e) { "use strict"; ... } });
<script data-main="main" src="lib/require.js"></script> <script> require.config({ baseUrl: 'js', paths: { Q: '../lib/qunee-module' } });</script>
首先须要引入requireJS,并设置了"data-main"属性为"main",表示入口模块"js/main.js",之因此在./js/目录,是由于后面配置了require,设置了"baseUrl"为"js",表示根目录为"js/",后面配置的paths,也是相对这个目录,paths中至关于设置模块别名,后面可经过别名引入模块web
var Q = require("Q");
若是用SeaJS则能够改为下面的代码编程
<script src="lib/sea.js"></script> <script> // seajs 的简单配置 seajs.config({ base: "./js", alias: { "Q": "../lib/qunee-module.js" } }); // 加载入口模块 seajs.use("main"); </script>
入口程序也可使用define的形式,并经过传入参数"require"来加载模块
好比引入qunee-module.jscanvas
var Q = require("Q");
js/main.js浏览器
define(function(require) { var Q = require("Q"); var graph = new Q.Graph("canvas"); var hello = graph.createNode("Hello", -100, -50); hello.image = Q.Graphs.server; var qunee = graph.createNode("Qunee", 100, 50); var edge = graph.createEdge("Hello\nQunee", hello, qunee); edge.setStyle(Q.Styles.LABEL_OFFSET_Y, -10); edge.setStyle(Q.Styles.LABEL_POSITION, Q.Position.CENTER_TOP); edge.setStyle(Q.Styles.LABEL_ANCHOR_POSITION, Q.Position.CENTER_BOTTOM); edge.setStyle(Q.Styles.LABEL_BORDER, 1); edge.setStyle(Q.Styles.LABEL_POINTER, true); edge.setStyle(Q.Styles.LABEL_PADDING, new Q.Insets(2, 5)); edge.setStyle(Q.Styles.LABEL_BACKGROUND_GRADIENT, Q.Gradient.LINEAR_GRADIENT_VERTICAL); });
示例下载:load-qunee-by-module.zip异步