fex-team / fis3

FIS3
http://fis.baidu.com
BSD 2-Clause "Simplified" License
2.79k stars 693 forks source link

发现一个天坑。。。 #449

Open xiyangjun opened 8 years ago

xiyangjun commented 8 years ago

使用fis-components的时候会出现如下情况,A,B两个目录同时使用了query这个组件,release后在A,B map表里会出现A:jquery,B:jquery两个不同命名空间的jquery,这样在加载页面的时候就会出现两个jquery文件。。。,如果更改发布策略把components打平的话又会出现另一个问题,我上线的时候希望把所有JS文件打包成一个,就会发生一个文件会对应两个pkg包的问题。。。。。 求解决方案

2betop commented 8 years ago
  1. 把 B 里面的打包中,将 jquery 排除。
  2. 设置 paths,假如你用的是 commonjs 规范的话。 这样 b 项目里面实际上用的是 A 里面的 jquery
fis.hook('commonjs', {
  paths: {
    jquery: 'A:coponents/jquery/jquery.js'
  }
});
xiyangjun commented 8 years ago

莫非所有可能公用的组件都要手动去设置么。。。

xiyangjun commented 8 years ago

fis3不能制定某些规则下文件的namespace么。

2betop commented 8 years ago

只要不跨模块调用,那是不用配置,但是要跨模块就需要配置,只用改 fis-conf.js 不用改源码,成本还行啊。

xiyangjun commented 8 years ago

设置path不太好使啊

xiyangjun commented 8 years ago

现在默认打包出来map表里namespace默认都是当前目录,有没有什么办法让A,B模块里打包出来的组件都在同一个命名空间下,比如A模块里打包出来的jquery是components:jquery/jquery.js,B模块里打包出来的jquery也是components:jquery/jquery.js

2betop commented 8 years ago

目前有个产品线的模式是这样的:所有 components 都安装在 common namespace 下面。对 components 什么的打包都在 common 里面做。

然后其他 namespace 下面的都是配置 path 来映射到 common.

你说的让打包资源把 moduleId 中 namespace 去掉,貌似也没什么用,如果 component 每个 namespace 下面都单独安装,最终上线,文件还是会有多份。

所以,我觉得如果既要有多个 namespace 又要用 components 的话,让 components 都在 common namespace 下面去管理吧。然后其他 namespace 下就麻烦点设置下 paths.

xiyangjun commented 8 years ago

现在的问题是设置paths后不好使。。。

2betop commented 8 years ago

我猜应该是 hook 的顺序的问题,先 unhook('components') 然后在 commonjs 后面补上。

// 让 commonjs 先查找
fis.unhook('components');
fis.hook('commonjs', {
  paths: {
    react: 'components/react/react-with-addons.js'
  }
});

// 再查找组件库中资源。
fis.hook('components');
oxUnd commented 8 years ago

这个问题不好让用户去解决吧。

2betop commented 8 years ago

这个问题,没法预知其他模块里面用了哪些组件。