├── README.md ├── article ├── 关于console.log的使用 └── 由seajs.config函数引发的Object赋值问题 └── seajs ├── sea.config └── sea.js /README.md: -------------------------------------------------------------------------------- 1 | study 2 | ===== 3 | 4 | 学习js 5 | -------------------------------------------------------------------------------- /article/关于console.log的使用: -------------------------------------------------------------------------------- 1 | console.log打印一个对象的时候,是对象的一个引用,使用不当可能在调试中被坑。 2 | 可使用直接值如console.log(data.msg)代替console.log(data),或者打断点调试。 3 | -------------------------------------------------------------------------------- /article/由seajs.config函数引发的Object赋值问题: -------------------------------------------------------------------------------- 1 | seajs.config = function(configData) { 2 | 3 | for (var key in configData) { 4 | var curr = configData[key] 5 | var prev = data[key] 6 | 7 | // Merge object config such as alias, vars 8 | if (prev && isObject(prev)) { 9 | for (var k in curr) { 10 | prev[k] = curr[k] 11 | } 12 | } 13 | else { 14 | // Concat array config such as map 15 | if (isArray(prev)) { 16 | curr = prev.concat(curr) 17 | } 18 | // Make sure that `data.base` is an absolute path 19 | else if (key === "base") { 20 | // Make sure end with "/" 21 | if (curr.slice(-1) !== "/") { 22 | curr += "/" 23 | } 24 | curr = addBase(curr) 25 | } 26 | 27 | // Set config 28 | data[key] = curr 29 | } 30 | } 31 | 32 | emit("config", configData) 33 | return seajs 34 | } 35 | 36 | 源码如上,其中var prev = data[key] 37 | 关键点在if (prev && isObject(prev)),此处判断prev属性,如果是Object,证明是引用复制,故改变prev,同时就把data值改变了。 38 | (ps:困扰了3天,最终用debugger解决了) 39 | -------------------------------------------------------------------------------- /seajs/sea.config: -------------------------------------------------------------------------------- 1 | 参考地址:https://github.com/seajs/seajs/issues/262 2 | 配置 3 | 4 | 可以对 Sea.js 进行配置,让模块编写、开发调试更方便。 5 | 6 | seajs.config seajs.config(options) 7 | 8 | 用来进行配置的方法。 9 | 10 | seajs.config({ 11 | 12 | // 别名配置 13 | alias: { 14 | 'es5-safe': 'gallery/es5-safe/0.9.3/es5-safe', 15 | 'json': 'gallery/json/1.0.2/json', 16 | 'jquery': 'jquery/jquery/1.10.1/jquery' 17 | }, 18 | 19 | // 路径配置 20 | paths: { 21 | 'gallery': 'https://a.alipayobjects.com/gallery' 22 | }, 23 | 24 | // 变量配置 25 | vars: { 26 | 'locale': 'zh-cn' 27 | }, 28 | 29 | // 映射配置 30 | map: [ 31 | ['http://example.com/js/app/', 'http://localhost/js/app/'] 32 | ], 33 | 34 | // 预加载项 35 | preload: [ 36 | Function.prototype.bind ? '' : 'es5-safe', 37 | this.JSON ? '' : 'json' 38 | ], 39 | 40 | // 调试模式 41 | debug: true, 42 | 43 | // Sea.js 的基础路径 44 | base: 'http://example.com/path/to/base/', 45 | 46 | // 文件编码 47 | charset: 'utf-8' 48 | }); 49 | 支持以下配置选项: 50 | 51 | alias Object 52 | 53 | 当模块标识很长时,可以使用 alias 来简化。 54 | 55 | seajs.config({ 56 | alias: { 57 | 'jquery': 'jquery/jquery/1.10.1/jquery', 58 | 'app/biz': 'http://path/to/app/biz.js', 59 | } 60 | }); 61 | define(function(require, exports, module) { 62 | 63 | var $ = require('jquery'); 64 | //=> 加载的是 http://path/to/base/jquery/jquery/1.10.1/jquery.js 65 | 66 | var biz = require('app/biz'); 67 | //=> 加载的是 http://path/to/app/biz.js 68 | 69 | }); 70 | 使用 alias,可以让文件的真实路径与调用标识分开,有利于统一维护。 71 | 72 | paths Object 73 | 74 | 当目录比较深,或需要跨目录调用模块时,可以使用 paths 来简化书写。 75 | 76 | seajs.config({ 77 | paths: { 78 | 'gallery': 'https://a.alipayobjects.com/gallery', 79 | 'app': 'path/to/app', 80 | } 81 | }); 82 | define(function(require, exports, module) { 83 | 84 | var underscore = require('gallery/underscore'); 85 | //=> 加载的是 https://a.alipayobjects.com/gallery/underscore.js 86 | 87 | var biz = require('app/biz'); 88 | //=> 加载的是 path/to/app/biz.js 89 | 90 | }); 91 | paths 配置可以结合 alias 配置一起使用,让模块引用非常方便。 92 | 93 | vars Object 94 | 95 | 有些场景下,模块路径在运行时才能确定,这时可以使用 vars 变量来配置。 96 | 97 | seajs.config({ 98 | vars: { 99 | 'locale': 'zh-cn' 100 | } 101 | }); 102 | define(function(require, exports, module) { 103 | 104 | var lang = require('./i18n/{locale}.js'); 105 | //=> 加载的是 path/to/i18n/zh-cn.js 106 | 107 | }); 108 | vars 配置的是模块标识中的变量值,在模块标识中用 {key} 来表示变量。 109 | 110 | map Array 111 | 112 | 该配置可对模块路径进行映射修改,可用于路径转换、在线调试等。 113 | 114 | seajs.config({ 115 | map: [ 116 | [ '.js', '-debug.js' ] 117 | ] 118 | }); 119 | define(function(require, exports, module) { 120 | 121 | var a = require('./a'); 122 | //=> 加载的是 path/to/a-debug.js 123 | 124 | }); 125 | 更多用法可参考:调试实践 126 | 127 | preload Array 128 | 129 | 使用 preload 配置项,可以在普通模块加载前,提前加载并初始化好指定模块。 130 | 131 | // 在老浏览器中,提前加载好 ES5 和 json 模块 132 | seajs.config({ 133 | preload: [ 134 | Function.prototype.bind ? '' : 'es5-safe', 135 | this.JSON ? '' : 'json' 136 | ] 137 | }); 138 | preload 中的空字符串会被忽略掉。 139 | 140 | 注意:preload 中的配置,需要等到 use 时才加载。比如: 141 | 142 | seajs.config({ 143 | preload: 'a' 144 | }); 145 | 146 | // 在加载 b 之前,会确保模块 a 已经加载并执行好 147 | seajs.use('./b'); 148 | preload 配置不能放在模块文件里面: 149 | 150 | seajs.config({ 151 | preload: 'a' 152 | }); 153 | 154 | define(function(require, exports) { 155 | // 此处执行时,不能保证模块 a 已经加载并执行好 156 | }); 157 | debug Boolean 158 | 159 | 值为 true 时,加载器不会删除动态插入的 script 标签。插件也可以根据 debug 配置,来决策 log 等信息的输出。 160 | 161 | base String 162 | 163 | Sea.js 在解析顶级标识时,会相对 base 路径来解析。详情请参阅 模块标识 164 | 165 | 注意:一般请不要配置 base 路径,把 sea.js 放在合适的路径往往更简单一致。 166 | 167 | charset String | Function 168 | 169 | 获取模块文件时,