转自:http://www.tuicool.com/articles/bmuaEbjavascript
今天早上初尝seajs,发现一个很是蛋疼的事情,使用官方demo中的jquery是没有问题,css
下载官方最新版jquery 2.1.1发现console.log($)返回null,百思不得其解!只能求助度娘!java
在GitHub发现了玉伯的说明 《 直接调用 jQuery 插件等非标准模块的方法 》jquery
不过这方法在2.3版本貌似已经不行,seajs.modify方法已在这版本移除!git
https://github.com/seajs/seajs/issues/286
这里的标准模块指的是AMD和CMD的定义github
引用玉伯在知乎的详细回答ruby
http://www.zhihu.com/question/20351507/answer/14859415
如下引用玉伯的回复你们会更加深刻了解ui
@lifesinger 昨天折腾得太累了,很差意思。后来仍是用 RequireJs 解决问题。 另外,我想问问:1. AMD 是否是容易卡死UI? 2. 为何采用与 SeaJs一样采用 CMD 规范编写的 NodeJs 模块 不能直接调用——我大概观察了下,好像定义格式不太同样,这也是问题啊,既然遵循一样的规范为何格式又不同,3. 用常规全局变量写法写的脚本通过 shim 配置,在 var ejs = require('ejs') 后会覆盖 ejs 的(全局)定义,可是能够直接 require('ejs'),而后 ejs 会注册到window 名下。4. 把一个常规脚本,换成 SeaJs 标准格式 跟 RequireJs 转换有什么不一样吗? 另另外,感受RequireJS 的自动加载插件机制挺不错。
@iahuAMD 是一加载就执行,当一次加载不少文件时,意味着会马上执行大量脚本,这时可能会致使 UI 卡。CMD 的执行是分散的,所以通常来讲不会形成 UI 卡。SeaJS 与 Node.js 的关系,可参考这篇文档:#275shim 配置后,require('ejs') 获得的 ejs 就是全局那个 ejs,也能够将挂载在 window 上的 ejs 去掉,好比 seajs.config({ plugins: ["shim"], alias: { src: 'path/to/ejs.js', exports: function() { var ejs = window.ejs; window.ejs = undefined; return ejs } }})RequireJS 的 shim 插件,本质上和 SeaJS 是同样的。
以上提到的方法已过期了,只好继续尝试其余办法!spa
方法一:插件
仍是玉伯老大的办法《seajs 2.1.1中去掉了seajs.modify 后,如何preload CDN 中的jquery ?》
https://github.com/seajs/seajs/issues/862
整个文章主要是说不修改成CMD模式下在模块内部使用jquery,玉伯老大是不推介这样,但仍是能够实现
不过jquery文件就不是在seajs.config里配置了,是直接在head头部引入文件,就像平时那样,而后在seajs内部某个事件机制触发将全局的jQuery对象带到内部module.exports对象;
seajs.on('exec', function(module) { if (module.uri === seajs.resolve('jquery')) { window.$ = window.jQuery = module.exports; } });
方法二:
固然就是按照CMD定义作封装一次jquery,方法也很简单,只要把源代码粘进去,而后返回jquery对象便可;
define(function(){ //jquery源代码 return $.noConflict(); });
这样就能够在seajs.config引入文件在内部其余模块使用,这里返回为何是$.noConflict(),请看w3c学校介绍
http://www.w3school.com.cn/jquery/core_noconflict.asp
seajs.config({ base : "../sea-modules/", alias : { "jquery" : "jquery.js" }});
define(function(require, exports, module){ var $ = require("jquery"); exports.showObj = function() { console.log($); } });
方法三:
参照seajs官方jquery封装方法
if ( typeof module === "object" && module && typeof module.exports === "object" ) { module.exports = jQuery;} else { if ( typeof define === "function" && define ) { define( "jquery", [], function () { return jQuery; } ); }}if ( typeof window === "object" && typeof window.document === "object" ) { window.jQuery = window.$ = jQuery;}
https://github.com/seajs/examples
在目录 sea-modules/jquery 里就有封装好的1.10版本;
https://github.com/seajs/seajs/issues/264