-
Notifications
You must be signed in to change notification settings - Fork 32
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
关于组件规范的几个想法,大家看下 #6
Comments
肯定不应该是 |
给个建议个格式? |
require.config({
"packages": [
{
"name": "ui",
"location": "dep/ui/0.6.8/src",
"main": "main"
}
]
});
require( "ui/tabs" ); |
@leeight 可能有点误解我的意思。这里解释下
|
那在专题页面 |
拿刀逼着 @errorrik 把 |
设想一个场景:zx模板数量达到几百以后,已经有数十个模板采用tabs组件。但这时组件要做一次整体升级,因为交互和样式发生了巨大变化,导致无法兼容升级,这时新的一批模板采用了新版tabs,而之前那数十个模板,因为人力等原因,短期内还无法升级到最新版,所以在搜索结果页就会出现新旧版共存情况。
map也没法完美解决一个页面多个ui版本共存情况。当然, |
多版本共存是需要的,但首贴的例子有些问题,小版本的升级应该是向后兼容的,而
我觉得是可以的, |
jQuery 这么大的库都接入了, esl 支持 map 增加的体积应该可以接受,@errorrik 你就从了吧,要不然实现 require.config 的 上下文 require 也能解决 |
首先,先解释下,moye自身的模块是不受版本号影响的。 因为require的都是相对路径。 而在模板的开发中,开发者需要先配置下map,可能有下面两种方式:
无论哪种方式,都需要开发者先配置map,那么就存在命名可能不规范、冲突情况。 如果对map的理解有误,请指出。 带版本号方式如下:
相比之下,尽管看起来不太优雅,但模块名称是不能随意修改的,可以避免命名混乱,而且调用方式也不复杂。 |
感觉 首先你有个
然后这么写
你会发现其实
总之你本身模块根本不关心自己用的 |
结果页模板的情况是:
如果这么配置,则是全局生效的,比如 所以, @otakustay 说的这种map方式,不太合适。 总之,这种
|
通过build脚本,先把 我的观点是
如果真的不喜欢在标准的范围下通过架构和设计来满足,那就直接在源码里写版本号吧……我认为前面 @jpssff 提的2个方案都不靠谱:
|
还是把svn发出来讨论吧 |
其实 requirejs 有个类似的实现: var requireContext = require.config({ .... } ); requireContext(['a'], function () {} ); 这样在 a 模块相关的 require 都使用 requireContext 的配置 |
这方面文档在下周一之前出 |
后面讨论的有点偏了。 上面我说的map示例,只是是表达map的作用以及和版本号方式比较。并不推荐使用map。 |
又看了下上面的讨论,感觉我没太描述清楚 为什么要加版本号
map为什么不能解决版本号问题因为map实际是用来解决 关于我提到两种map方式,仅仅表达如何设计map,才能实现上面情形下,每个模板 所以,我第一帖关于版本的,建议的用法是直接在前缀加上版本号。比如 |
刚才跟大佛在群里讨论的解决方式是这样子的: 因为不同的模板代码有可能都会输出到大搜索的结果页,但是输出的时候,把匿名的模块改成具名的模块就可以继续使用map来处理这个问题了。例如: <!-- 1.tpl -->
<div>blabla...</div>
<script>define(function(){ require( 'tabs' )})</script>
<!-- 2.tpl -->
<div>blabla...</div>
<script>define(function(){ require( 'tabs' )})</script> 当输出到大搜页面的时候,编译成如下的代码: <div>blabla...</div>
<script>define( 'tpl/1/main', function(){ require( 'tabs' )})</script>
<div>blabla...</div>
<script>define( 'tpl/2/main', function(){ require( 'tabs' )})</script> 这样子一切都可以在amd的规则下运行。 |
map早就实现了诶,多少年前的事情了..... |
我觉得 @leeight 在上两楼提的方案还是比较靠谱的。 |
esl 有 map 就好,多版本的问题有最优解了 |
这个方法看似行得通。但操作起来,仍有点问题。最终生成的模板如下: <div>aaa...</div>
<script>
require.config({
map: {
'tpl/a/main': {
'tabs': 'tabs0.1.0'
}
}
});
define( 'tpl/a/main', function(){ require( 'tabs' )});
</script>
<div>bbb...</div>
<script>
require.config({
map: {
'tpl/b/main: {
'tabs': 'tabs0.2.0'
}
}
});
define( 'tpl/b/main', function(){ require( 'tabs' )});
</script> 两个问题:
|
我觉得,define的module,应该是一个template的renderer。 假设在页面内容flush前,我们就知道有哪些templates,输出就应该是: <script>
require.config({......});
define( 'tpl/a/main', function(){ return function (wrap) {} });
define( 'tpl/b/main', function(){ return function (wrap) {} });
</script>
<body>
<div>aaa...</div>
<script>require(['tpl/a/main'], function(aMain) {
aMain(wrapDiv)
});
</script>
<div>bbb...</div>
<script>require(['tpl/b/main'], function(bMain) {
bMain(wrapDiv)
});
</script> 当然,如果是chunk,那可能会输出多份define,那是没办法的事情,本来代码也是输出多份的。只要实现的是动态渲染,并且使用是
开发者要使用基础组件的什么版本,其实是由开发者自己决定的。他可以完全不care map,直接按版本号指定自己要使用的版本。但如果这么做,会带来一个后果: so,我觉得这个问题,不是现在设计基础结构要考虑的,而是在指导开发者怎么开发怎么选择时,才去考虑。 |
不错,这样没问题。大家可以再review下,我觉得讨论可以关闭了。 |
上面讨论的方案在ps上面怎么用? |
@leeight 目前,ps对兼容的升级采用类似map方式使用最新版,对于非兼容的升级,修改了组件名,格式为 A.use('tabs'); //api不变的最新版
A.use('tabs2'); //非兼容升级,api发生变化 |
都是A.use,有啥区别? |
名称 |
组件类
建议给出一个具体的指导风格,比如使用
Control.extend()
扩展原型。接口规范。
一方面可以统一api,另一方面,可以更好在业务层面做控制。目前想到的一个必须实现的接口。 @jinzhubaofu @chriswong 看看呢,缺少这个规范,感觉对贡献者有点疑问。
版本控制
根据之前沟通,使用上可以分为最新版,带版本号两种方式。版本号和release的三位号码一致。如:
其中moye组件最新版前缀为
'ui'
, 带版本号前缀格式为'ui_版本号'
。求拍。
The text was updated successfully, but these errors were encountered: