Skip to content
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

简化一下 module.conf 中 combine 的配置逻辑 #83

Open
leeight opened this issue Apr 9, 2015 · 16 comments
Open

简化一下 module.conf 中 combine 的配置逻辑 #83

leeight opened this issue Apr 9, 2015 · 16 comments

Comments

@leeight
Copy link
Member

leeight commented Apr 9, 2015

现在配置模块合并的工作,需要写不少的代码,例如我想配置depstartup两个模块的话,就需要写如下的代码:

var dep = [
    base,
    echarts,
    negative(invalid)     // 不合法的amd,需要去掉
];

var startup = [
    bizCommon,
    negative(base),       // common/dep里面已经包含base的代码了,这里就不需要了
    negative(echarts),    // common/dep里面已经包含base的代码了,这里就不需要了
    negative(invalid)     // 不合法的amd,需要去掉
];

var combine = {
    'common/dep': {
        modules: compact(dep)
    },
    'startup': {
        modules: compact(startup)
    }
};

return combine;

这里面比较纠结的事情是一直在重复negative相关的代码(因为前面的模块合并了,其它的模块就不要再合并),为了
简化这个事情,我打算这么做,支持.v2这个配置参数来识别是新的格式(因为模块名不太可能是.v2开头吧)

{
  "combine": {
    ".v2": true,
    "exclude": [
      "~er", "xxx", "foo", "bar/**"
    ],
    "modules": [
      {
        "ria": [
          "~er", "~esui"
        ]
      },
      {
        "startup": [
          "~foo",
          "~bar"
        ]
      }
    ]
  }
}

因为modules是一个数组,所以可以按照顺序来处理。合并完毕ria之后,ria包含的模块Id默认就变成了startup
exclude配置,这样子来简化上面negative的重复写法。

另外新增了一个exclude这个是针对所有modules里面配置的模块生效的,目的是简化negative(invalid)的写法。系统中
总会存在一些不太符合 amd 要求的文件,我们在发布的阶段需要忽略掉这些文件。

@otakustay
Copy link
Member

感觉上可以用,但直觉上是会有问题的,比如我有startup/foostartup/bar,分别是用在2个页面里的,那么它们是不应该互斥的

回到最初的问题,我认为是不是这样就能解决:

combine = {
  foo: {
    modules: [...]
  },
  bar: {
    modules: [...], // 这里不要去管是否会重复
    negative: ['foo'] // 表示要把`foo`里有的去掉
  }
}

当然这样如果有N个配置,还是要写一些negative配置,只是相比之前的一堆自己写要简单也逻辑清晰

@leeight
Copy link
Member Author

leeight commented Apr 9, 2015

foobar如果是 key 的话,那么执行的顺序是不太容易保证的。万一 bar 先执行了 或者 foo negative bar 并且 bar negative foo,我感觉好像是一个很麻烦的事情。

我有startup/foo和startup/bar,分别是用在2个页面里的,那么它们是不应该互斥的

是不应该互斥的,这里提到的foobar应该就是具体的某个 Action 了,他们应该把 公共代码中的 模块id 排除掉。

{
  "combine": {
    ".v2": true,
    "exclude": [
      "~er", "xxx", "foo", "bar/**"
    ],
    "modules": [
      { "ria": [ "~er", "~esui" ] },
      { "startup": [ "~foo", "~bar" ] },
      {
        "negative": ["ria", "startup"],
        "modules": [
          {"bcc/List": ["bcc/ListView", "bcc/ListModel"]},
          {"bcc/Form": ["bcc/FormView", "bcc/FormModel"]},
        ]
      }
    ]
  }
}

@errorrik
Copy link

errorrik commented Apr 9, 2015

太复杂了,combine的object里有modules item,里面每个module还有modules item,看着都哭了

@errorrik
Copy link

errorrik commented Apr 9, 2015

2015-04-09 2 58 23

@leeight
Copy link
Member Author

leeight commented Apr 9, 2015

这应该不是最终的样子,只是用来说明一下采用的方式吧

@otakustay
Copy link
Member

我想的是这样的效果:

var combine = {
    'base': {
        include: ['jquery', 'underscore']
    },
    'startup/foo': {
        include: ['foo/**'],
        negative: ['base']
    },
    'startup/bar': {
        include: ['bar/**'],
        negative: 'base'
    },
    'lazy/fooDetail': {
        include: ['detail/foo/**'],
        negative: ['foo']
    }
}

上面的表示:

  1. 有一个base包含基础库
  2. foobar分别用于2个html页面,所以它们各自有自己的策略,但都不要base
  3. fooDetail用于在foo.html中点击某个按钮时要加载的模块,所以它不要foo,同时因为foo不要basefooDetail也就隐式地不要了base

@errorrik
Copy link

errorrik commented Apr 9, 2015

我理解 @leeight 的意思,是希望很多combine的模块里,公共的部分能有地方去进行统一配置。但是我觉得,combine是一个Object,每一个key代表一个希望被合并的module,这点最好还是不要变,否则会不太好理解。

可以为每个希望被合并的module,增加一些项,这些项在modules处理后的集合中进行处理。参考了下rjs,我觉得,可以有:

  • includes: 要引入的模块,包含其依赖
  • includeShallows: 要引入的模块,不包含其依赖
  • excludes: 要排除的模块,包含其依赖
  • excludeShallows: 要排除的模块,不包含其依赖

这样,配置代码可能会变成这样:

var base = [sys-base, echarts];

var combine = {
    'common/dep': {
        modules: base
    },
    'startup': {
        modules: [bizCommon],
        excludes: base
    }
};

return combine;

@otakustay
Copy link
Member

事实上不用数组,我们也可以根据每个配置项里的negative之类的属性,来算出顺序的,无非是一个依赖图,把这个交给程序更合适。用数组并且前后negative关系反了是会很麻烦的,甚至问题都排查不到

@errorrik
Copy link

errorrik commented Apr 9, 2015

事实上不用数组,我们也可以根据每个配置项里的negative之类的属性,来算出顺序的

没理解

@leeight
Copy link
Member Author

leeight commented Apr 9, 2015

立理指的应该是先处理哪个后处理哪个的问题

@otakustay
Copy link
Member

没理解

我是基于你的观点进行的补充,我也认为使用数组其实不是太合适,保持原有的对象的模式,让程序来计算这些对象间的互斥关系,进而决定build的顺序即可

@leeight
Copy link
Member Author

leeight commented Apr 9, 2015

  1. 那就保持对象的模式吧,也可以
  2. 新增一个negative应该就可以了,多重复几次就多重复几次吧,不过看起来会更清晰。
  3. includeShallowsexcludeShallows我感觉好像意义不是很大耶。

最终推荐的配置应该就是这样子了吧?

var combine = {
    'base': {
        modules: ['jquery', 'underscore']
    },
    'startup/foo': {
        modules: ['foo/**', '!foo/bar'],
        negative: ['base']
    },
    'startup/bar': {
        modules: ['bar/**', '!bar/foo'],
        negative: 'base'
    },
    'lazy/fooDetail': {
        modules: ['detail/foo/**'],
        negative: ['foo']
    }
}

@errorrik
Copy link

errorrik commented Apr 9, 2015

我建议还是不要叫negative,毕竟negative这个单词还没在edp或者rjs里出现过。叫exclude或者excludes?

@errorrik
Copy link

errorrik commented Apr 9, 2015

关于includeShallows和excludeShallows,有时候还是有意义的。我为echarts写optimizer的时候就遇到了适用的场景。在项目的build中,excludeShallows的意义比includeShallows大些。不过我觉得可以不加,以后遇到在加好了

@leeight
Copy link
Member Author

leeight commented Apr 9, 2015

叫exclude或者excludes?

includeexclude最早就已经被用掉了,现在exclude的实现貌似就是excludeShallows的意思,只把本模块排除掉(实际上也就把它依赖的模块也间接的排除了)。如果继续采用exclude的话,貌似就需要让他扮演真正exclude的意思(把它以及它依赖的模块都排除在外?)

@errorrik
Copy link

@otakustay 主席给点意见?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants