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

lego组件接入记录 #3

Open
longyiyiyu opened this issue May 25, 2015 · 6 comments
Open

lego组件接入记录 #3

longyiyiyu opened this issue May 25, 2015 · 6 comments

Comments

@longyiyiyu
Copy link

lego组件接入记录 - on mobilev2

1. 准备工作

浏览lego网站,了解以下内容:

  • lego是什么
  • lego可以提供什么服务
  • lego的使用
  • 组件的开发
    • 初始化
    • 文档说明
    • 测试
    • 发布
  • 组件的使用
    • 资源组织方式
    • 资源使用方式

2. 安装lego

npm install -g lego

顺利安装,没什么问题
安装好lego之后,下面打算接入一个fis组件tip

3. 初始化组件

mkdir tip
cd tip
lego init

但是出现了常见的办公机代理问题
github-lego-1

通过命令lego help config发现配置方式和npm的很像,所以尝试了npm的代理设置方式:

lego config set proxy http://proxy.tencent.com:8080

结果还是不行,没办法,最后只能通过proxifier解决,在初始化的过程中还遇到一个小问题,记录如下:
github-lego-2

初始化之后的一些文件还是没有清除干净,还留了spmjs的痕迹,examples/index.md:
github-lego-3

4. 组件开发

在开发组件的过程中,最大的困扰点是路径依赖问题,包括图片,css,js,不知道有html的组件怎么办?
然后就想看看现有的组件是怎么写的,然后悲催的发现现在lego系统上已有的组件都是基础的逻辑组件,根本没有什么依赖,好不容易找到一个可能有依赖的组件,看源代码之后就会发现它是这么处理的:
github-lego-7

不是说好的commonJS么,我能说坑么。。

不管一直存在的通用组件的路径依赖问题,也不管fis的路径特性问题,我们在开发组件的时候考虑通用性就好,于是,在各种依赖路径的问题上,我们都是参考node方式,所以有如下代码:
github-lego-6

github-lego-4

github-lego-5

基本就是通过相对路径,去看arale组件的写法也是这样的,不过他们有seajs配合,但是fis就不行了。。
开发完之后怎么测试?反正我不知道。。。
好了,先发布再说:

lego login
lego publish

github-lego-8

然后我们可以看到lego系统上就出现了我们的组件:
github-lego-9

5.使用组件

怎么使用组件?系统上并没有较详细的说明,反正就一句:类似node
那既然如此,我们来试一下。
随便拉一个公众号的分支或者主干也成,然后到src/modules/文件下执行命令:

lego install tip

然后可以看到有以下目录结构:
github-lego-10

然后在首页那里尝试使用:
github-lego-11

样式也需要修改一下:
github-lego-12

运行,然后就可以看到tip出来了:
github-lego-15

然后我们看一下dist文件里面:
github-lego-13

github-lego-14

可以看到我们通过相对路径实现的css依赖和img依赖都没有问题。

但是我们关于其他组件的依赖是有问题的:
github-lego-16

在这里没有报错的原因是系统本身就有zepto库。

综上,如果实现了关于lego组件调用的fis插件的话,业务使用lego组件将会非常简单
只需要2步就可以使用lego组件:

#在适当的位置安装组件
lego install my-com
//在业务代码中
var myCom = require('my-com');

6. 组件更新

组件的更新维护也是很方便的
在测试的过程中,发现组件代码有一些问题,于是我们进行了修改:
github-lego-17

修改完毕之后,我们需要修改组件的版本号,这个要在组件根目录下面的package.json里面修改:
github-lego-18

最后,我们只需要和之前发布操作一样发布组件就可以更新了:
github-lego-19

刷新一下lego网站:
github-lego-20

升级维护一个组件是不是很方便?
组件更新了,那我们业务也可能需要使用最新的组件代码,于是我们回到之前的src/modules/目录下:

lego install tip

github-lego-21

这里应该有更新语句的,可能是update吧,不过没必要纠结,只要记住一条命令可以用就成!

可以看到新的组件已经下载下来了,不过并没有覆盖旧的版本:
github-lego-22

为了使用新组件的代码:
github-lego-23

如果lego组件的fis插件完成的话,我们业务使用的代码将会是:

require('tip').show('初始化...', {interval: 10000});

而fis插件将会帮助我们直接使用本地最新版本的tip组件代码,因此业务只需要更新组件的最新代码,完全不用修改业务源代码就可以使用到最新版本的lego组件。

另一种情况,如果首页使用最新的tip组件代码,但是详情页使用旧版的tip代码,这样也没有问题:

require('tip').show('初始化...', {interval: 10000}); //始终使用本地最新版本代码
require('lego_modules/tip/0.0.2/index').show('初始化...', {interval: 10000});    //使用0.0.1版本的代码

实际上fis插件只是帮助我们简写路径而已

7. 小结

可以看到lego系统基本可用,下面总结一下这次lego组件接入的情况

7.1 槽点

  • 使用lego要一直开着proxifier不是很爽
  • 开发组件的时候,需要依赖另一个组件时,需要到lego系统上面查找版本号,然后手动修改package.json,能不能开发一个命令,比如lego addDep zepto,然后系统自动帮我们查询zepto组件是否存在,最新版本号是多少,让我们输入依赖版本号之后自动帮助我们修改package.json

7.2 组件开发

组件开发时遵循下面两条即可

  • 依赖组件内部资源时写相对路径
  • 依赖其他组件时直接写组件路径

7.3 展望

其实lego组件非常适合用在移动端fis构建环境,从上面的接入过程就可以看到,基本没有遇到什么困难,但那是因为在移动端fis构建环境下
通用组件最大的问题在于依赖,其中有两个:

  1. css依赖,使用组件的时候,组件的css要怎么使用?是外链到html还是直接打入到main.css?其实不管哪一种,都是需要构建工具帮助我们识别css文件,然后放到合适的位置。但是在移动端fis却不用,因为fis可以把css文件当成js文件来处理,动态插入css代码,依赖js比依赖css简单多了,这里需要注意一点,如果是其他构件工具,需要把js代码里面依赖css的语句干掉。。。
  2. img依赖,css中的图片路径问题就不多说了,同样,因为在fis中把css当成了js对待,因此路径依赖也变成了js中的img路径依赖,也变得简单了

这就是为什么在公众号下使用lego组件好像没遇到什么困难的原因。。。
实际上,要在其他环境下使用lego组件是需要很好的构建工具支持的,具体的交给小卡君了。。。

最后提一下公众号这边的展望
目前内链html是通过这样的语法:

<link rel="import" href="modules/common/header/header.html?__inline">

在使用组件时,也希望可以使用这种语法来内链组件的html代码,比如:

<link rel="import" href="tip?__inline">

这里我们需要扩展__inline语法,支持自动在lego_modules文件夹下搜索本地最新版本的组件,并且自动内链组件目录下的index.html代码

另一点关于图片合并问题,不过公众号这边的css sprite工具都还没有,所以暂时就不展望了,不过如果组件包含图片,那这里肯定会有需要解决的问题的,不过一般组件不包含图片,所以优先级不高

@herbertliu
Copy link
Member

@longyiyiyu 非常的赞,大概扫了一下,很完整的建议,我慢慢消化。

@webryan
Copy link
Member

webryan commented May 25, 2015

非常赞的总结。 @herbertliu 尽快排期处理掉遇到的一些问题。

@chyingp
Copy link

chyingp commented May 25, 2015

几点想法:

  1. css依赖:结合组件的设想,这里有个初步的想法。假设tip组件内部的机构如下
tip/
tip/header.html
tip/header.css
tip/header.js

那么,组件的引用方可以直接引用组件。无论哪种引用方式,最终目的就是:组件适用方无需关心组件内部依赖了哪些资源。正在思考实现方式,敬请期待。

这样
<link rel="import" href="tip?__inline">

或
<component href="tip">

或
...

@jiangyuan
Copy link
Member

@herbertliu

使用lego要一直开着proxifier不是很爽

lego 在开发机使用的门槛太高。

@herbertliu
Copy link
Member

@jiangyuan 开发机目前不能访问imweb.io,公司网络环境决定。暂时先用代理解决吧。也可以考虑同步内部源,我们再统一同步。

@herbertliu
Copy link
Member

@longyiyiyu 办公网的问题,后面再看看是否通过代理来弄。组件规范后续会加强,严格遵循commonjs,其他的已优化。版本号查找正在排期中。

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

5 participants