ruby 社區的人喜歡把 JavaScript 包成一個 Gem,不知道現在的情況是怎麼樣的。
我個人是推崇 component 的,component 不僅僅是一個包管理工具,還是一套寫 JavaScript 的規範。使用 component 時,我會覺得確實在寫嚴肅的庫。而 jquery plugin 的方案,總給人玩具感。
這一帖算調查,也算推薦 component 吧。
大概一年前了解到 Component, 但是最终没有在我们的前端项目里面使用,基于以下几点:
基于我们项目的需求,自己开发了 Linner, 这个项目的灵感其实是从 brunch 来的。基于我们使用的是 SCSS, 以及速度和定制性方面的考虑,选择了自己开发。
从现在的使用效果上来说,团队成员还是比较满意的,即使有很一些新的需求,也能很快的加上。
模块可以有选择性的被包装为 CMD, 这样我就不用在每一个模块里面都声明一下 require "jquery"
, 只需要指定需要被包装的路径就可以了。在被包装过的模块里,大家的命名空间不会相互污染。
我们现在的项目代码量属于比较多的,其中的模块数量非常多。所以第一次 watch 的时间往往需要 5 秒左右,但是一旦 watch 完毕,接下来的修改只需要在 300ms 左右就能响应完毕并且完成 LiveReload. 这种响应是别的产品做不到的。
最近也新加了一个 bundle(包管理) 机制,直接从远端拉取源码,不用考虑什么注册机制,是不是 CMD, AMD 包装,简单实用。
我们的自己的项目也是在用 bundle 机制组织。
正好这周看了下 linner,感觉代码比 sprockets 好读多了...类关系没有那么乱。
component 的 js/css/template 以及依赖关系在配置里面怎么体现的呢?没搞明白groups
和bundles
的区别。
#10 楼 @krazy bundle 现在还不能以 component 粒度来依赖。
我们现在的用法是:自己有一套类似 bootstrap 的框架。包含 JavaScript 与 CSS 还有一些前端模板,这些东西被 Linner watch 之后生成 *.js 与 *.css 两个文件。别的项目文件分别在 bundle 里面依赖这两个文件。而依赖这两个文件的项目内部便以 component 的形式继续编写模块。
bootstrap 是同理的,你可以在 bundle 里面依赖 bootstrap 压缩好的 bootstrap.js 与 bootstrap.css 文件,然后用 order 去排序,使他们在最前面就可以了。类似这样:
order:
- vendor/jquery.js
- vendor/bootstrap.js
- ...
- app.js
...
是 Linner 支持的排序 omit 元素,代表中间的。
下一步准备支持 zip/tar 文件的依赖,就可以解决 component 依赖问题了,实际上现在的前端项目里,依赖管理暂时还不是那么重要。因为人们很在意前端文件的大小,很深层次的依赖会让这个问题变复杂。所以这是 Linner 对待依赖的解决方案。现在工作的很好。
@Saito 赞...
。所以这个 component 还是一个逻辑上的概念?比较想要的是指定 component 名和版本就可以得到最后 build 得到的 css 和 js 以及模版
#13 楼 @krazy 下个版本支持 zip/tar 就可以做到了。同样是用 bundle 这种方法,只不过最后拿到的是一个文件夹,而不是一个文件。
以前的依赖一个文件这么写:
bundles:
jquery.js:
version: 1.10.2
url: http://code.jquery.com/jquery-1.10.2.js
依赖一个 zip 或者 tar 可以这么写:
bundles:
awesome-component:
version: 1.0
url: http://code.awesome-component.com/downloads/1.0.zip
这样会默认 install 到 vendor
下面,是一个解压过的文件夹。
CMD 是一个规范,SeaJS 是一个 CMD 规范的实现。
AMD 也是一个规范,RequireJS 是一个 AMD 规范的实现。
这是两个概念,其实 Linner 里面也有一个 CMD 规范的实现。不过对用户是透明的。
SeaJS 把这个声明暴露给了用户,加上巨复杂的配置。Sigh...
对我来说,没有包管理最好,就图个清静,拿常见的 Twitter Bootstrap 来说:
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
<!-- Optional theme -->
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap-theme.min.css">
<!-- Latest compiled and minified JavaScript -->
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
我去年带的一个 Nodejs 项目 Cantas,完全用 javascript 技术栈实现,当时定下的目标是做一个Trello的开源版本。当时我们就遇到这个问题,一开始直接上,自己定义 scaffold 目录。在同时参考网上资料后,开始使用 RequireJS,同事都是 pythoner,接受不了,对我发出强烈反应。我们决定先用纯 JS,代码重写吧。scaffold 目录又经过讨论重新定义了一遍。自己管理 JS,加上 Grunt.js 可以快速上手。后来在开发中慢慢体会到包管理的概念。但至今没有找到合适自己口味的。期间有 Linner 第一版发布,我们已经到后期,就没有用过。
还有一个方面就是 coffeescript 的使用。这个对包管理的一致性也有要求。所以目前我还没找特别合适的工具。