Meteor基于Node.js,但是却有自己的包管理系统(atmosphere)以及代码加载机制,且meteor是非异步的,这些都意味着,node.js包(npm package)和代码通常不能直接用于meteor程序。
这里分享三种方法以在meteor中复用node.js包和代码。
meteorhacks:npm + meteorhacks:async
npm+async是复用npm包最便捷的方式。meteor程序添加npm包之后,便可以在packages.json中声明包依赖,在程序中通过Meteor.npmRequire来加载包。
值得一提的是,由于大部分npm包都是异步调用的,而meteor是同步运行的,所以需要某种方法将异步调用转为同步调用。async就是这样一个meteor包,添加之后,通过Async.runSync方法便可以同步地调用异步方法。
具体安装、使用方法以及更多介绍,请参考文档。
适配node.js代码
如果需要复用的代码仅仅是个别文件、函数、片段等,可以手工修改代码以适配meteor程序。
需要注意到,node.js的每一个文件都是一个模块,通过module.exports和require进行组织,但是在meteor中,每一个文件都是会被自动加载的(具体顺序参考meteor文档),通过全局变量进行跨文件调用;meteor中不能直接加载npm包;meteor框架是同步运行的(非异步)。
综上,适配代码的工作包括:
- 使用meteorhacks:npm来加载npm包
- 修改跨文件调用方式,将原来的module.exports=xxx改为暴露全局变量,而调用方,将require(xxx)改为直接引用全局变量
- 直接被meteor框架调用的方法,使用meteorhacks:async包,将其从异步调用改为同步调用形式
创建meteor包
这种方法更复杂,但是也更进阶,不仅可以封装npm包,也能封装任意node.js代码(当然需要修改、适配),更能创建新的meteor包。
创建meteor包的具体方法不再赘述,参考如下:
学会创建meteor包之后,只需要按照上述方法适配代码,并封装成meteor包,便可以方便地使用和分享了。
参考项目
该项目规模很小,便于分析。原始代码在submail-sdk文件夹中,其余代码为对原始代码的适配和封装。