imweb / issue-Ideas

Ideas
2 stars 0 forks source link

包管理方案探讨 #4

Open miniflycn opened 10 years ago

miniflycn commented 10 years ago

包管理方案探讨

急需一种包管理方案来解决组件管理,避免组件复制问题以及,组件更新后无法在多个项目同步。

Review

bower是目前市面上最火的包管理器,让我们看看它解决了什么问题,以及为什么火?

bower的出现本质上是npm不能解决client端的问题,那么npm首要问题是什么?

npm依赖安装不够flat(官方说法)。简单的说就是,在client端我们不可能需要两个jQuery,所以组件a和组件b都依赖jQuery,那么安装a、b后会出现两个jQuery:

node_modules/a/node_modules/jquery

node_modules/b/node_modules/jquery

更糟糕的是,jQuery如果还有两个版本……

于是bower将依赖树打平,于是bower就出现了。当然其依赖源放在github,并且可自定义依赖源,这些也是bower比npm好的地方。

但为什么bower目前是最火的呢?

足够简单。bower除了包管理没有做其他多余的事情,所以当项目在中期时,很容易将bower添加进来,配合已有的打包方案,就能很容易的组成一套完成的开发方案。

browserify

browserify不是什么包管理方案,她应该算是一种代码组织方式,但其直接使用npm进行包管理。所以,browerify有没有bower说的npm会遇到的问题呢?

当然有,但是可以通过构建规避。

例如上面的例子,则browserify相当于在= require('jquery')时候配置一下,则打包的时候变成= window.$。这样即使node_modules里面有两个jquery也无关紧要(反正我不用= =b)。

但这样基于npm的版本管理还有意义么?

当然我们可以从browserify学到很多东西,例如:

component的背景是web component的出现,所以我们先说说web component。

以前我们的代码分割方式是横向的,即:

内容(HTML) + 表现(CSS) + 行为(Javascript)

但这样有个问题就是,如果引用一个组件的时候就麻烦死了,如果一个组件有HTML、CSS、Javascript,则我们需要在这三个地方引用一个组件的不同部分,这对于组件的管理带来了很多困难。

所以web component提供了另一种代码分割方法,即:

组件 + 组件 + 组件 ……

component也是基于这个思想。bower在组织只有js的组件是非常成功的,但是如果一个组件如果有css、js、template、font、image时就力不从心了。

因为在bower.json没有关于这个包其他资源文件的描述。

这很重要么?很重要,因为没有这些描述,所以使用者必须非常了解一个包里哪些资源文件是他需要的,否则他可能无法使用。

举个例子,如果组件的作者升级组件的时候将目录结构变更了,那么引用的代码或者构建的代码就只能根据这个变更进行更改了。

那么component怎么解决这个问题呢?

包管理和构建一揽子做了。

简单的说就是,在component.json声明的依赖直接打包进构建后的build.css和build.js文件中,并将相关静态文件移到特定目录。

但有几个问题没有解决:

component的想法是好的,但是却没有解决诸多问题,所以一直难以火起来。

duo

duo是component团队的下一代解决方案,那么她又是为了解决什么问题呢?

duo从component和browserify学到了:

duo的野心很大,她想将所有包都用统一的方式进行管理,不论是browserify、bowewr、component还是别的什么包。由于bower没有像component一样声明了所有资源文件,所以无法分析其资源文件的摆放方式。于是他们改了方案,利用使用者引用来索引这些资源,这点显然是偷学了browserify的思想。这个想法不错,但是这样切换特定版本号不是很麻烦?

比如组件a,拥有a.css,和a.js,并且已在component.json声明了静态文件,然后项目引用了组件a,那时候使用了版本0.1.0,可能在其main.js有:

var a = require('QQEDU/a@0.1.0');

而main.css中有:

import "QQEDU/a@0.1.0";

如是当我要升级到0.2.0的时候,难道要将这些分散的引用全改了?配置真的可以不要么?还是说只能在大部分情况下不用?

spm

支付宝包管理方案,已从2.0变成3.0,又有什么变化呢?

2.0从3.0的转变最大的差别还是,2.0仅仅负责包管理,3.0又把构建统一进去了,可见很多时候包管理和构建还是难以分家的。

Requirement

所以我们的需求是什么?

  • 可以管理组件的版本,可以升级、指定版本或指定大于某个版本。
  • 由于我们是项目中期,所以应当使用一种渐进的方案过度,所以bower应当是首选。
  • 定位和移动资源文件的方案,因为大部分组件都不是纯js。
  • tag可以保存构建当时的包信息,避免不同人通过同一tag打包出来的内容不一致,但目前似乎没有包管理器能满足这个需求,还是说要用某种开发规范来约定,或者直接将bower_component提交到svn?

好,现在砖头出来了,需要各位玉的参与了。

ousiri commented 10 years ago
  1. 版本问题. 可以参考http://semver.org/ 的设定. 把版本号分为major.minor.patch, 对于minor和patch的升级, 可以允许自动升级, 对于major, 则需要用户和组件开发者手动升级.
  2. 平台处于项目中期, 但是很多小项目要转变起来的成本比较低, 这些可以先行试水.
  3. 是否可以先考虑修改项目架构, 改为以组件的组织方式. 当然, 这样与compass编译冲突, 可以尽早替换为node-compass.