相较传统的服务端程序开发,云开发帮助小程序开发者排除了环境、部署等等烦恼,快速实现云端特性集成,谁用谁真香。 但是使用过云开发的同学一定都会发现云开发也有一个显著的短板,就是代码共享。
例如,我们往往在开发的过程中会整理一些常用的或全局统一的工具函数,以一个 Todo 应用为例:
// create-todo.js
const formatTodo = require('utils/format-todo')
exports.main = function (event) {
const { data: todo } = db.collection('todos').add({ data: event })
return formatTodo(todo)
}
// todo-list.js
const formatTodo = require('utils/format-todo')
exports.main = function (event) {
const { data: todos } = db.collection('todos').get()
return todos.map(formatTodo)
}
在云函数环境中,每一个云函数是物理隔离的,我们无法从一个云函数中直接导入另一个云函数中的模块,因此这个 format-todo.js 就需要在两个云函数中各写一遍。当然,也不是完全没有解决方法。
方法一:把 utils 做成一个包发布到 npm?
自从 npm 支持了 scope 之后,命名隔离已不是难事。只要你的代码中没有什么私密的业务代码,发布到 npm 即可让你的各个云函数中都能使用到。但这样做的缺点也很明显:当你需要修改 utils 中的代码,你需要重新发布版本以便在各个包中使用,这尤其会给本地调试带来不少麻烦。
方法二:为 utils/format-todo 单独创建一个云函数,使用云调用?
?
方法三:使用 @mpneon/cloud。
话不多说先上代码:
// functions/create-todo.js
const formatTodo = require('../utils/format-todo')
module.exports = function (request) {
const { data: todo } = db.collection('todos').add({ data: request.event })
return formatTodo(todo)
}
// functions/todo-list.js
const formatTodo = require('../utils/format-todo')
module.exports = function (request) {
const { data: todos } = db.collection('todos').get()
return todos.map(formatTodo)
}
是不是感觉和开头的示例代码没太大区别?这就对了。别忘了,之前的示例在真实的云函数环境中是无法实现的。而使用了 Neon cloud 之后,就变得可以实现了。
(Q:可是 Neon cloud 具体是怎么用的呢?)
你只需要创建一个云函数,比如我们把它叫做 neon,安装 @mpneon/cloud 作为依赖,以下是 neon/index.js 的内容:
const app = new (require('@mpneon/cloud').Application)()
app.route('create-todo', require('./functions/create-todo'))
app.route('todo-list', require('./functions/todo-list'))
exports.main = (event, context) => app.handle(event, context)
这便是 Neon cloud 的路由功能,它允许你将多个云函数集中到一个项目中,充分的发挥公共代码的复用性。
而路由只是 Neon cloud 最基础的功能,更详细的说明以及更多好用易用的特性欢迎前往 repo 查阅。如果 Neon cloud 让你眼前一亮,或者对你有用,请 star 该项目或者 follow 作者表示支持~