Sea.js入门
本文只是seajs的入门贴。要详细了解,请看GitHub主页上的相关链接,精彩不断,精选几篇:
下面本文开始:
seajs的价值
原生javascript的一个弱项,就是不支持模块化,说白了就是没有其他语言的import,include等语句。所以开发者就只有2个选择:把所有的东西写到一起,或者通过全局变量来交互
这至少造成以下几个问题:
1、污染全局变量,容易发生命名空间冲突,难以维护
2、无法按需加载
由于javascript官方迟迟未能解决这些问题,所以就有民间的社区提出标准,希望能自行解决,弥补语言的不足。主要有2种规范,一种是 CommonJS提出的CMD规范,另一种是AMD规范,server端的node就是CMD的一种实现,seajs实现的也是CMD规范。所以熟悉 node的用户会发现,seajs的API和node的API非常类似,这就是因为它们是同一种规范的不同实现
关于seajs的价值,这篇帖子说得更加详细:why seajs
seajs的例子
官网上的5分钟入门例子也很简单,不过本文再简化一点,用一个更简单的例子进行说明:
目录结构简化后是这样的:
helloworld.html:
- <!doctype html>
 - <html>
 - <head>
 - <meta charset="utf-8">
 - <title>Hello Sea.js</title>
 - </head>
 - <body>
 - <div id="thediv">
 - <p>hello world</p>
 - </div>
 - <script src="../javascript/sea.js"></script>
 - <script>
 - seajs.config({
 - alias: {
 - "jquery": "jquery-debug.js"
 - }
 - });
 - seajs.use("../javascript/main");
 - </script>
 - </body>
 - </html>
 
首先用<script>标签引入了seajs,并且要放在第一行。然后这行代码是入口:
- seajs.use("../javascript/main");
 
加载seajs以后,会引进一个唯一的全局变量seajs,这是无法避免的,除非是一次性执行的匿名函数,否则单全局变量模式已经是最好的结果。然后seajs上有一个use方法,是启动其他模块的入口方法,这里就是启动了main.jsmain.js
- define(function (require, exports, module) {
 - var module1 = require("./module1");
 - alert(module1.add(1, 2));
 - })
 
实际上use()和require()方法非常类似,不过官方推荐的最佳实践是,只把use()作为启动的入口方法,后续的模块导入都用require()来完成熟悉node的用户会觉得非常眼熟,define方法是seajs自己的实现方式,require,exports,module都是CMD规范的 设计,所以跟在node里是一样的。所有的seajs module,都应该写在define方法的factory function里
上面这段代码就引入了另一个模块module1,然后调用了其上的一个方法
module1.js
- define(function (require, exports, module) {
 - exports.add = function (a, b) {
 - return a + b;
 - }
 - var $ = require("jquery");
 - $("#thediv").click(function () {
 - alert("on click");
 - });
 - })
 
这里又看到了熟悉的exports,导出了add()函数,并引用了jQuery框架,给DOM元素绑定了一个事件这里有一点要注意,就是对jQuery进行了CMD改造(也就是导出了变量$),这里有个小坑,后面会说
factory function有3个参数,分别是require,exports,module,作用跟node里是完全一样的。但是还有另外一种写法:
- define(function () {
 - return {sayHello: function () {
 - alert("hi there");
 - }};
 - });
 
这个factory function没有任何参数,直接返回了导出的对象。这个叫做return语法,不过我用得比较少seajs的例子就到此为止了,确实非常易用
与node module的比较
集成jQuery的一个坑
- var $ = require("jquery");
 
$的值一直是null,百思不得其解。在官方的GitHub issue上,这个问题也有广泛的讨论。本质的原因在于seajs有一个路径和ID匹配的原则:著名的#930
- var $ = require("jquery-debug");// path是"jquery-debug"
 
而jquery中的代码:
- define("jquery/jquery/1.10.1/jquery-debug", [], function () { return jQuery; } );// module_id是"jquery/jquery/1.10.1/jquery-debug"
 
我移动了文件路径以后,path和module_id匹配不上,所以就失败了
- define("jquery-debug.js",[],function(){return jQuery});
 
或者
- define(function(){return jQuery});
 
就行了,但是对于不熟悉#930的用户来说,这确实是不大不小的一个坑
Sea.js入门的更多相关文章
- sea.js 入门
		
上个月学了 require.js 现在顺便来学学 sea.js. 对比下这两种的区别,看自己喜欢哪个,就在接下来的项目中去使用它吧. seajs中的所有 JavaScript 模块都遵循 CMD 模块 ...
 - Sea.Js使用入门
		
1.Sea.Js是什么 seajs相对于RequireJs与LabJS就比较年轻,2010年玉伯发起了这个开源项目,SeaJS遵循CMD规范,与RequireJS类似,同样做为模块加载器.示例 // ...
 - sea.js 个人入门
		
玉伯 : http://seajs.org/docs/ 说这两个JS 必须提到AMD.commonjs两种不同的规范: 奇舞团:http://www.75team.com/archives/882 知 ...
 - 深入学习sea.js
		
入门学习了文档之后,在深入学习里面的一些有趣的知识点 =================================== 一.配置 seajs.config({ alias:( a3:'./js/ ...
 - sea.js模块化编程
		
* 为什么要模块化? 解决文件依赖 解决命名冲突 ; var var2 = 2; function fn1(){ } function fn2(){ } return { fn1: fn1, fn2: ...
 - 1. web前端开发分享-css,js入门篇
		
关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人与人的教育背景与成长环境心理活动都有差别,但就别人的心得再结合自己的特点,然后探索适合自己的学 ...
 - 解决sea.js引用jQuery提示$ is not a function的问题
		
在使用sea.js的如下写法引用jQuery文件时, //main.jsdefine(function(require,exports,module){ var $ = require('jquery ...
 - React.js入门笔记
		
# React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...
 - Ember.js入门教程、博文汇总
		
第一章 对象模型 Ember.js 入门指南——类的定义.初始化.继承 Ember.js 入门指南——类的扩展(reopen) Ember.js 入门指南——计算属性(compute properti ...
 
随机推荐
- VPS centos 6 安装图形界面
			
在某种场合之下,我们使用的Linux还是要选择安装桌面环境的,所以在这里介绍一下如何给没有安装桌面环境的系统安装桌面环境.以Centos 6.5 为例演示一下如何安装桌面环境. 工具/原料 Linux ...
 - AngularJs记录学习03
			
AngularJs的路由是一个组件,需要自己额外添加,在目录/src/ngRoute中 三个文件route.js,routeParams.js,ngView.js <html> <h ...
 - 解决Unable to resolve superclass的问题
			
之前在GITHUB上看到大蛋的高级设置,昨晚于是就拿来编译.. 结果真是个悲伤的故事,放手机上居然运行不了,这种时候只能看LOG了! 看LOG得出的信息如下: - ::): threadid=: in ...
 - View和监听器
			
View的基本概念 View就是Activity当中显示出来的控件,用对象来表示,如文本框的TextView类,按钮的Button类等等 每一种控件都对应一个类,都属于View的子类 在Activit ...
 - 分布式缓存Memcached
			
分布式缓存服务器,既然用到数据缓存很明显就是想高效性的获取数据,大容量的存储数据.为了可以缓存大量的数据以及可以高效获取数据,那么分布式缓存数据库就要解决数据可以水平线性扩展,这样可以扩大数据容 ...
 - Mybatis 实现传入参数是表名
			
<select id="totals" resultType="string"> select count(*) from ${table} < ...
 - hdu 5326 Work
			
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5326 Work Description It’s an interesting experience ...
 - Hi java新特性
			
java新特性 1995.5.23 java语言 1996 jdk1.0 250个类在API 主要用在桌面型应用程序1997 jdk1.1 500 图形用户界面编程1998 jdk1.2 2300 J ...
 - 002--VS C++ 获取鼠标坐标并显示在窗口上
			
//--------------------------------------------MyPaint() 函数------------------------------------------ ...
 - 位bit——字节Byte???
			
1.换算 每8个位(bit)组成一个字节(byte) 位bit简写为小写字母“b”,字节Byte简写为大写字母“B” 8*b=1*B 1024*B=1*KB 1024*K=1MB 2.举例 一个英文字 ...