构建用的grunt,我看seajs的example应用里的require关键词都被替换了,能够正常运行,是否我的环境哪个地方没配置到?有没有同学碰到过类似的坑?
我调试了一下seajs的源码发现,确实用正则表达式来解析模块依赖,如果保留require关键字时,能够正常解析出依赖模块,但是压缩后就解析不出来了。
seajs自带的demo将main和模块压缩到一块了。但是就像我搭建的环境,几个页面共同依赖某些模块,能否将main和模块分开压缩呢?
@blackey629
一、#426 已经说的很清楚了。
二、seajs 自带的 demo 并没有将 main 和其他模块压缩到一块,就是分开压缩的。
我看了 #930 之后,也检查了自己的环境,没看出问题。
如图,开发环境的base
为js
文件夹,构建后的base
为dist
文件夹,我将js/module
下的所有文件合并到dist/module/pp.js
中,这样只要加载了pp.js
,其他的所有模块应该都加载的,也遵守ID和路径匹配原则
啊。
难道说concat的时候,定义的src文件按照依赖有先后顺序吗?
访问地址:http://programshare.duapp.com/pp.jsp
目前使用seajs为debug版本,2.3.0。
#1146 和这个是同一个问题。
http://programshare.duapp.com/skins/dist/main/menu.js 文件里面依赖了 module/pp 和 module/menudata ,这两是并行
下载的,互相无法知道谁包含了谁,都会发请求。
为了简化调试,我只调用了main/groupsend.js
,注释掉main/menu
。构建后的groupsend
,代码如下:
define("main/groupsend",["module/msgsender","jquery","template","module/msgsendertmpl","module/popwin","module/selectappmsg","module/appmsg"],function(a){var b=a("module/msgsender"),c=new b("#js-msgSender");c.render()});
我将concat之后的文件名改为msgsender.js
,然后测试还是有问题。从后面代码可以看出,groupsend
只依赖module/msgsender
,我又把其依赖项手动处理为["module/msgsender"]
,这样就没有问题了。
可以看出确实是由于并行加载导致的。
#1146 给出的答案感觉没有通用性。seajs模块划不能随便乱分,是否有一定的划分原则呢?,请指点一下。
我本来的思路:应用有多个页面,就做多个main
模块,每一个页面都调用对应的main.js
,这就相当于应用的main
函数,然后公用的模块可以由这些页面的main
调用。
那看来这种思路和seajs
有冲突?将所有的js构建为一个文件,然后只有一个main
,在这里面根据页面做路由,这样应该可行吧?
我终于将所有的SeaJS模块打包成了一个文件,解决了重复加载的问题,说一说我的思路吧。
主要思路就是加上了模块的路由。原来每一个页面对应一个主模块,后来我在这些主模块之上增加了一个简单的入口模块,主要作用是路由,根据页面的请求url解析主模块的名称,然后使用require.async()
函数加载对应主模块。举例说明:
请求url为http://localhost/pp/index.htm
,根据既定的规则解析出模块名称为index
,同时应该存在主模块为index
,这样就能加载了。
路由模块的代码
define(function(require){
var r = new RegExp(/\w+.htm/g);
var url = location.href;
var postfix = url.match(r);
var moduleName = 'index';
if(postfix && postfix.length > 0){
moduleName = postfix[0].split('.')[0];
}
var module = 'main/' + moduleName;
require.async(module, function(cb) {
if(!cb) {
alert('页面加载错误,请刷新!');
}
})
});
所有的页面只调用入口模块main
就OK了。
这种做法的缺点是SesJs模块和请求的url耦合在一起了,不过在当前项目的环境下还是很合适的,因为控制层+jsp采用了一套框架,url也有规则。
我在按照实际项目搭建seajs环境时碰到该问题,模块压缩后无法正常加载,但是我手动保留require关键字之后可以正常运行。seajs版本为2.3.0。
下图是压缩后的请求过程
下图是自动保留require关键字后的请求过程
项目结构,模块module/pp是存在的
以下是关键代码
请各位帮忙诊断一下,谢谢了。