seajs的那些坑
seajs是what?
1 var loder = {}; 2 var define = loder.define = function(id,deps,factory){ 3 loader[id] = factory; 4 };
- 首先模块定义的方式,模块源代码中是这样编写模块的define(factory),非常简单,但是如果直接合并合并后多个define就会造成不知道如何引用具体的模块,于是涉及到第二个部分,如何让模块发布过程变得简单。
- 模块提取过程是,将源代码转换成seajs能正确解释的代码,即define(id,deps,factory)需要借助于grunt-cmd-transport或spm-build工具。
模块标识
- 一个模块标识由斜线(
/
)分隔的多项组成。 - 每一项必须是小驼峰字符串、
.
或..
。 - 模块标识可以不包含文件后缀名,比如
.js
。 - 模块标识可以是 相对 或 顶级 标识。如果第一项是
.
或..
,则该模块标识是相对标识
- 相对路径,以
.
或..开头
顶级路径,不以
.或..及
斜线(/
)开头- 普通路径,除相对和顶级路径外的,比如/(根路径)开头的,
"http://"
、"https://"
、"file:///"
等协议标识开头的 - 模块命名空间是seajs所在文件的根路径即所谓的base路径,去除了
seajs/x.y.z
字串,也可以指定seajs.config({base:});
- 只提取相对标识
- 相对标识相对
require
所在模块的标识来解析
- 顶级标识始终相对
base
基础路径解析。(顶级标识由字符串开头) - 绝对路径和根路径,即普通路径,始终相对当前页面解析,跟我们平时用的其他js和css路径一样,比如当前页面是www.simple.com/user/index.html ,路径为/js/hello.js,它解析后的地址为www.simple.com/js/hello.js。
模块定义中require
和require.async
的相对路径相对当前模块路径来解析。
如果我们能理解其模块标识解析设计的出发点,那么就可以轻易的理解这些而不用记忆这么多:
- 关注度分离。书写模块的时候我们是不用指定模块id的,require的模块时候只要填入依赖模块的相对路径,于是我们只要关注代码的书写而不是依赖,打包后工具会自动帮我们处理好模块id。
- 尽量与浏览器的解析规则一致。上线后在浏览器中的代码,模块路径的解析规则应该于平时用的css、js这些加载路径规则一样,普通路径和相对路径的都是相对当前页面的。
示例
目录结构如下:
www
--app --blog index.html --sea-modules --seajs
--2.2.0
sea.js
--blog
--user
--1.0.0
main.js
--static
--user
--src
a.js
b.js
main.js
--dist
main.js
package.json
Makefile
// /www/static/user/src/a.js define(function(require,exports,module){ module.exports = function(){ // .......................... }; });
// /www/static/user/src/b.js define(function(require,exports,module){ module.exports = function(){ // .......................... }; });
// /www/static/user/src/main.js define(function(require,exports,module){
var a = require(‘./a");
var b = require(‘./b");
// ..............
});
// /www/static/user/package.json { family:"blog", name:"user", version:"1.0.0", spm:{ output:["main.js"] } }
// /www/static/user/Makefile
build: @spm build deploy: @rm -rf ../../sea-modules/blog/user @mkdir ../../sea-modules/blog/user @mkdir ../../sea-modules/blog/user/1.0.0 @cp dist/*.* ../../sea-modules/blog/user/1.0.0 @echo @echo " deploy to seajs-modules/blog/user/1.0.0" @echo
// /www/static/user/dist/main.js
define("blog/user/1.0.0/main",["./a","./b"],function(require){ var a = require(‘./a"); var b = require(‘./b"); }); define("blog/user/1.0.0/a",[],function(require,exports,module){ // ....................... }); define("blog/user/1.0.0/b",[],function(require,exports,module){ // ....................... });
然后运行make deploy
会将 ../dist/main 部署到 /www/sea-modules/blog/user/1.0.0/main.js
在页面中如何加载模块呢?
<!-- www.expample.com/app/blog/index.html --> <script src="/sea-modules/seajs/2.4.0/sea.js" id="seajson"></script> <script> seajs.config({charset:"gbk"}); seajs.use("blog/user/1.0.0/main"); </script>
参考阅读:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。