1. 每个模块文件(module)的定义部分 define 里面写的 路径都是基于这个js文件所在位置来写的,比如 './../../app/views/login/login', 切记加上开头的./ 。因为在firefox 和 谷歌浏览器中对路径的自动补全是不一样的 , chrome会加上 ./ 而 firefox 不会,所以相同的路径:'../../app/views/login/login' 在firefox 中自动补全是这样的 '/spec/../../app/views/login/login' 而在 chrome 中是 './spec/../../app/views/login/login' 。
你可能会问这会有什么问题呢?问题在于 require.js 加载 js的原理是动态的用 node=document.createElement('<script>') 后再把 node.src = url (就是我们刚刚写的自动补全的路径) 。但是我们知道相对路径如果以 / 开头意思是相对于域名+端口号后的/开始的,而不是这个文件所在的文件夹的路径开始的。所以 '/spec/../../app/views/login/login' 会变成 node.src = 'http://localhost:8080/app/views/login/login' 。因为 /spec 这个文件从根目录开始找的话是不存在的,下一个动作 ../ 就变成了 localhost:8080 ,下一个动作 ../ 结果后还是 localhost:8080,下一个动作 /app/views/login/logon 这回Url被接上了就变成了 http://localhost:8080/app/views/login/login 。 而如果你在路径的头部写了 ./ 就不会出现这个错误,所以相对路径开头写上 ./ 是良好的编程习惯。
进一步的研究表明,在 require.config.path 里面定义 appBaseUrl:'./../app' 这样的写法,将 ../ 这类不好看的路径写在 path 定义里面,然后define头写上 'appBaseUrl/views/login/login' ,这种写法更好。
例外情况:在 require.config.path 里面定义的路径比如 backbone:'./../asset/lib/backbone/backbone.wrapper' 这个里面的 backbone.wrapper.js 文件虽然也是写成 define([...],function());的形式,但是它的define参数内的路径却是以main.js 文件所在路径为起始的