Neon cloud, 小程序云函数共享代码的正确姿势

961 阅读2分钟

相较传统的服务端程序开发,云开发帮助小程序开发者排除了环境、部署等等烦恼,快速实现云端特性集成,谁用谁真香。 但是使用过云开发的同学一定都会发现云开发也有一个显著的短板,就是代码共享。

例如,我们往往在开发的过程中会整理一些常用的或全局统一的工具函数,以一个 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 作者表示支持~

参考链接