该包装方法依靠Function.prototype.toString()将函数内容赋予一个有意义的字串值,但在一些设备如PS3及一些老的Opera手机浏览器中不起作用。考虑在这些设备上使用优化器将依赖导出为数组形式。
§ 1.3.6 定义一个命名模块
你可能会看到一些define()中包含了一个模块名称作为首个参数:
//Explicitly defines the "foo/title" module: define("foo/title",["my/cart", "my/inventory"],function(cart, inventory) { //Define foo/title object in here. } );
这些常由优化工具生成。你也可以自己显式指定模块名称,但这使模块更不具备移植性——就是说若你将文件移动到其他目录下,你就得重命名。一般最好避免对模块硬编码,而是交给优化工具去生成。优化工具需要生成模块名以将多个模块打成一个包,加快到浏览器的载人速度。
§ 1.3.7 其他注意事项
一个文件一个模块: 每个Javascript文件应该只定义一个模块,这是模块名-至-文件名查找机制的自然要求。多个模块会被优化工具组织优化,但你在使用优化工具时应将多个模块放置到一个文件中。
define()中的相对模块名: 为了可以在define()内部使用诸如require("./relative/name")的调用以正确解析相对名称,记得将"require"本身作为一个依赖注入到模块中:
define(["require", "./relative/name"], function(require) { var mod = require("./relative/name"); });
或者更好地,使用下述为转换CommonJS模块所设的更短的语法:
define(function(require) { var mod = require("./relative/name"); });
相对路径在一些场景下格外有用,例如:为了以便于将代码共享给其他人或项目,你在某个目录下创建了一些模块。你可以访问模块的相邻模块,无需知道该目录的名称。
生成相对于模块的URL地址: 你可能需要生成一个相对于模块的URL地址。你可以将"require"作为一个依赖注入进来,然后调用require.toUrl()以生成该URL:
define(["require"], function(require) { var cssUrl = require.toUrl("./style.css"); });
控制台调试:如果你需要处理一个已通过require(["module/name"], function(){})
调用加载了的模块,可以使用模块名作为字符串参数的require()调用来获取它:
require("module/name").callSomeFunction()
注意这种形式仅在"module/name"已经由其异步形式的require(["module/name"])
加载了后才有效。只能在define内部使用形如"./module/name"的相对路径。
§ 1.3.8 循环依赖
如果你定义了一个循环依赖(a依赖b,b同时依赖a),则在这种情形下当b的模块函数被调用的时候,它会得到一个undefined的a。b可以在模块已经定义好后用require()方法再获取(记得将require作为依赖注入进来):