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 ...
随机推荐
- USB设备---URB请求快
1.urb 结构体USB 请求块(USB request block,urb)是USB 设备驱动中用来描述与USB 设备通信所用的基本载体和核心数据结构,非常类似于网络设备驱动中的sk_buff 结构 ...
- Secondary IP Addressing
Secondary IP Addressing secondary IP addressing. Secondary addressing uses multiple networks or subn ...
- Nginx初始化过程总结
对于Nginx这样一个模块化的服务器,看代码是最好的理解方式了.再此通过读main() 函数来简述一下Nginx的初始化过程: 这就是整个main函数的执行过程:
- [转]Win7 UAC的安全、兼容及权限
[转]Win7 UAC的安全.兼容及权限 http://www.cnblogs.com/mydomain/archive/2010/11/24/1887132.html 网上关于这个问题讨论较多,但也 ...
- Java实现UDP之Echo客户端和服务端
Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...
- 动态链接库知识点归纳之一(DLL概念,如何建立,如何使用,如何优化,如何查看)
简单的总结一些动态链接库的一些知识,方便以后查找. 首先,新建一个动态链接库 (1) 打开编辑器,选择WIN32项目, dll,如下图,项目名字为:test,选择空项目.如下图 (2) ...
- Postgresql 存储过程调试 1
看来人真的有些力不从心,半个月前还很得意掌握的简单的Postgresql 存储过程的调试,一段时间没使用,做新功能就忘了! Postgresql 在开源的数据库里面算是很强悍的了,但现在就是不方便调试 ...
- sql优化点整理
此文是我最早开始sql优化至今整理的小知识点和经常遇到的问题,弄懂这些对优化大型的sql会有不少帮助 ---------------------------------使用了多余的外连接------- ...
- cocos2dx中的场景和使用方法
1.一个游戏中有且只有一个导演,但是至少有一个场景 2.场景是游戏元素节点数的根节点,也可以理解为该场景下的渲染树的根节点 3.场景是一个容器,包含了该场景下的所有游戏元素,比如层,精灵 4.场景是导 ...
- Sprint会议-初步组织划分
主题:Spring冲刺计划会议,组员已认领方式领取任务,对个人任务进行详细划分. 日期:2015.4.26 地点:学一食堂二楼 与会人员:王雪青.陆宇.徐擎天.张文冬.赵建松 索引表 因早期任务的认领 ...