研究过Seajs都会发现factory方法参数中必须是特定的require,exports,module这三个参数,这个虽然是符合CMD规范,但是为什么我们不能将三个参数一起放在一个对象里面呢?
我知道 require是在define的时候要实现在factory.toString()中通过正则表达式找到require中定义的依赖项,但是我们把正则表达式改一下我们同样能够找到:
例如:
define('a',['b','c'],function(cmd){ var b = cmd.require('b'); var c = cmd.require('c'); });
此时将原来的正则表达式----- /"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|\/\*[\S\s]*?\*\/|\/(?:\\\/|[^\/\r\n])+\/(?=[^\/])|\/\/.*|\.\s*require|(?:^|[^$])\brequire\s*\(\s*(["'])(.+?)\1\s*\)/g,
改成 /"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|\/\*[\S\s]*?\*\/|\/(?:\\\/|[^\/\r\n])+\/(?=[^\/])|\/\/.*|\.\s*\.require|(?:^|[^$])\b\.require\s*\(\s*(["'])(.+?)\1\s*\)/g,
详见红色加粗部分;
由于使用seajs的风格,我在spm压缩合并的时候需要特别小心,在使用其他压缩合并工具的时候有会出现require被混淆掉;而上述方案我则可以只需要一个简单的压缩合并工具,就可以了;不用纠结在spm的build上了;
其实我想知道是不是这个规范不能被打破? 希望大牛能解决下我的疑问;谢谢;