storage 插件 #877

Open
lifesinger opened this Issue Aug 6, 2013 · 16 comments

8 participants

@lifesinger
seajs member

woods 分享出来了:

#287 (comment)

这个月迁移到 seajs/seajs-storage 库下,成为官方正式插件并持续维护。

感谢 @woodsrong

https://github.com/QzoneTouch/commonWidget/tree/master/seajs-plugin/src

@afc163
seajs member

这个是不是丹侠那里可以很快用起来?

@lifesinger
seajs member
@woodsrong

感谢玉伯将插件官方化,有问题就交流:)

@woodsrong woodsrong referenced this issue Aug 13, 2013
Closed

localcache #886

@popomore
seajs member

现在需要确认的方案,在 #886 中提到缓存的分割方式

一般是按照文件来缓存,而不是按照 define 的模块来缓存,所以需要确定用怎么规则来切割。下面提供一些解决方案。

自定义函数

@QzoneTouch 提供的使用方式

(function(){
  define.pack = function(){
    //blablabla
  }
})();

define.pack(){
  //一个模块
}

闭包

按上面的方式其实可以直接使用闭包

(function() {
  define(...);
  define(...);
});

使用注释

可以定义注释规则

/* url start */
define(...);
define(...)
/* url end */
@popomore
seajs member

@lifesinger 能否提供一个 api,可指定模块和请求路径之间的关系,我觉得这个应该 seajs 内置的,比如

// path/to/a.js
define(function(require) {
  require('./b');
  require('./c')
});

编译后

// path/to/a.js
define('path/to/a', ['path/to/b', 'path/to/c'], function(require) {
  require('path/to/b');
  require('path/to/c')
});
define('path/to/b', [], function(require) {
  ...
});
define.alias('path/to/b', 'path/to/a');
define('path/to/c', [], function(require) {
  ...
});
define.alias('path/to/c', 'path/to/a');

这样还是可以按 define 分割,当不存在时应该按照路径去请求,而不是按照模块 id。

@popomore
seajs member

@lifesinger 关注下这个话题

@lepture
seajs member

@popomore 你这是 component 的节奏呀。

@popomore
seajs member

@lepture 啦啦啦,借鉴

@lifesinger
seajs member

还在想怎么合适

@lifesinger
seajs member

一种可能性:

define(id, deps, fn, { fileId: 'path/to/file' })

module.requestUri = resolve(fileId)

define 时通过最后一个参数,在构建时附加上 模块 所在文件的信息。

define 运行后,module 上会增加 requestUri 属性,表示模块来自那个 uri 路径。

@lifesinger
seajs member

还得再想想。

@applezqp

目前的解决方案是依据源码分析:

例如 http://xxx/??id1.js,id2.js,combo的文件id1.js和id2.js,这里的前提是文件名称和包的名称是相同的。
根据文件名找到对应包的模块,再分析该模块的依赖中含相对路径的模块,就可以找到这个包所打包的模块。

defind('id1', ['$', './a', './b'], fn);

defind('a', [], fn);

defind('b', [], fn);

defind('id2', ['$', './d', './e'], fn);

defind('d', [], fn);

defind('e', [], fn);
...

支付宝的模块通过测试过确实可行,之前玉伯提到根据seajs.cache来分析依赖,因为切割的时候还未解析,所以模块不在seajs.cache中。

这个方案需要修改seajs-localcache插件splitCombo的接口,splitCombo需要传combo的文件数组:

var splitedCode = splitCombo(resp, splited.files)

该修改暂不提交,@QzoneTouch可考虑是否统一~

@QzoneTouch

splitCombo应该作为一个更通用的combo拆分函数,不依赖于某种具体的combo组织形式,所以我觉得这里应该有三个参数:
response, url, files

@donson

请问这个插件官方化了吗?官方地址在哪?

@popomore
seajs member

@donson 现在还没有官方的

@lifesinger lifesinger removed this from the 2.2.0 milestone Mar 3, 2014
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment