为什么小弟我要放弃meteor

为什么我要放弃meteor

最近接了一个老外的项目,对方要求用meteor开发。刚开始我觉得这个框架太好了,甚至打算以后在自己项目中也用这个框架,经过这段时间的使用,我今天来谈谈自己对这个框架的理解。meteor是一个基于nodejs平台的实时web开发框架,采用全新的编程理念,全新的通信模式。具体情况,可以百度,这里就不废话了。


先来说说优点:

1. 搭建环境非常简单,可以轻松建立开发环境,文档还算齐全。

2. 前后端语言统一,前后端完全整合,后端与前端完全可以共享代码,比如,定义在一个文件中的常量,函数,在后端可以调用,你要是喜欢,在浏览器上也可以调用。最大限度地共享代码。减少工作量。

3. 可以快速迭代,缩短开发周期和成本。

4. 代码以同步方式运行,尽量避免回调(其实回调这东西,你要是习惯了,真觉得没啥,有很多库可以使做好这个事,可能有些人从其他语言转到nodejs刚开始不太习惯)。

5. 浏览器里模拟了一个mini Mongo,你可以直接在客户端查询数据,感觉就像在服务器上查询一样。

6. 反应式编程,很多地方你只要更新数据了,更新数据之后的其他操作,不需要程序员做。比如刷新视图。

7. 采用DDP协议,以后可以扩展到其他语言,实事上已经有社区版本的,但官方只有js。


再来说说缺点:

1. 框架基本都使用全局变量,它自己这么做就算了,而且程序员也必须这么做,这是由它的实现机制决定的,这对小项目还行,但稍大一点的工程, 将是灾难,谁也不知道别人定义了什么全局变量,更要命的是框架自己还有很多全局变量,这些有可能是你不知道的,但也无从可查,比如框架自己带underscore库,用了全局变量’_‘, 如果有谁不知道这个是被underscore使用的,覆盖了,后果很严重,更要命的是,整个框架都是这种模式。在你使用之前,你必须清楚框架或你使用的第三方包中已经使用了哪些全局变量,哪些变量不能用。如果你想使用一个变量名,如果这个变量名已经被某个包使用,你就只能换。所以从这一点上来讲,这个尤其不适合多人协作,大型项目的开发。

2. 不能手动控制文件的加载顺序,在普通的nodejs工程中,你可以通过reqiure来加载一个文件,但在meteor中这个是不可用的。程序员不能去决定这个,框架完全按自己的方式去加载文件,官方提供的方法是改文件名,改成字母序,或放到一个子目录中,因为meteor是按文件名字母序和子目录优先加载。这个做法感觉太山寨了。为了省去程序require的步骤,做了这样一种自动加载。我觉得不可取,也很不方便,比如我在一个项目中就遇到这样一个总是,想加载 bootstrap.js  和bootstrap-switch.js ,而bootstrap.js必须在后面这个文件之前加载,但实际情况是bootstrap-switch.js加载到前面去了,结果会报错,相当头疼,解决方法要么把bootstrap.js重命名为a-bootstrap.js要么把bootstrap.js放到子目录,这两种方式 我都不喜欢,凭什么我不能用这个名字,非要换个,作为程序员的我,还不能*给文件取名了?,凭什么我要把它放到一个子目录,我就喜欢把同一类文件放到一个目录。所以这点让人觉得很不愉快 。

3. Session问题,meteor里的session只能在浏览器里使用,服务端是没有session这个东西的,这个感觉很不方便,有时候需要在服务器上保存一些状态,只能保存在数据库中,每次自己去查询。更不方便的是如果没用使用登录接口存下用户的id,你根本无法区分游客用户。因为它里面没有cookie这样的东西。解决办法 也有,就是在浏览器第一次访问的时候,生成 一个随机字符串,然后每次传给服务器,服务器存下来,用来区分是哪个用户。

4. 内存问题,meteor应用的内存占用比一般应用是要大很多的,可能跟他实现的实时特性有关系,因为它要维护每个客户端的连接和数据状态,一是客户端订阅的数据状态发生变化,服务器会主动通知客户端这些变化,所以内存消耗是很可怕的。

5. 分页支持,分页是一个应用最基本的功能,但这个功能居然没有一个很好的官方支持,在discover in meteor, 作者有提到,为什么不能很好的支持分页,但有很多插件辅助,但这些功能,我还是希望有官方的解决方案。

6. 没有完整的测试解决方案,官方虽然提供了一些测试方案,但感觉都是轻描淡写,而且官方的解决方案还在探索中,不适合大型产品的完整测试。

7. 不能直接使用npm上的包,如果是没有异步的包,可以直接用,但如果一个包有异步想关的功能,你就不能直接使用,需要你自己重新封装,封装成同步的,虽然官方提供了方法,但感觉还是很麻烦。

8. 性能问题,虽然nodejs是高效的,但meteor为了做到实时,在服务器上做了大量计算比较操作,还占用了大量内存,每个浏览器都用websockt与服务器建立了一个长连接,所以性能并不是多好,这一点在你开发的时候不容易感觉出来,但稍有点用户访问你的网站,你将会立即感觉到。

9. 不支持windows环境开发,有社区支持的,但没有官方支持的。


总结下:

meteor作为一个全新的框架,有它的过人之处,有其他框架不能提供的特性,但我们同时也应该看到它的的不足,还有很大的成长空间,就个人观点而言,仅仅适合做一些小项目,绝对不要用于大型项目的开发,至少现在还不能。我有一种不袢的预感,如果你用它来开发大点的工程,将会让你疯狂。