云函数和云对象支持公共模块。多个云函数或云对象的共享部分,可以抽离为公共模块,然后被多个云函数或云对象引用。HBuilderX 5.25 及以上版本支持使用 TypeScript 开发公共模块。
以下面的目录结构为例,介绍一下如何使用。
cloudfunctions
├─common // 云函数公用模块目录
| └─hello-common // 云函数公用模块
| ├─package.json
| └─index.js/index.ts // 公用模块源码,根据创建时选择的语言生成其中一个入口文件
└─use-common // 使用公用模块的云函数
├─package.json // 在 use-common 目录执行 npm init -y 生成
└─index.js/index.ts // 云函数源码入口,根据创建时选择的语言生成其中一个入口文件
JavaScript 公共模块可以不使用默认的index.js,修改package.json内的main字段可以指定其他入口文件。TypeScript 公共模块通过根目录的index.ts识别,请勿重命名该文件。
创建并引入公用模块
cloudfunctions目录下创建common目录common目录右键创建公用模块目录(本例中为hello-common,见下方示例图),选择 JavaScript 或 TypeScript。JavaScript 公共模块会生成index.js,TypeScript 公共模块会生成index.ts,并在package.json的main字段中记录入口文件。不要修改此package.json的name字段hello-common右键上传公用模块管理公共模块依赖,添加依赖的公共模块
公共模块依赖其他公共模块同理

注意事项
common目录下的公用模块目录(本例中为hello-common)右键选择更新依赖本模块的云函数npm install创建的软链接失效,如果遇到这种情况请删除node_modules和package-lock.json重新npm install
使用公用模块
仍以上面的目录为例,在公用模块内exports,在云函数内require即可。示例代码如下:
// common/hello-common/index.js
function getVersion() {
return '0.0.1'
}
module.exports = {
getVersion,
secret: 'your secret'
}
// use-common/index.js
'use strict';
const {
secret,
getVersion
} = require('hello-common')
exports.main = async (event, context) => {
let version = getVersion()
return {
secret,
version
}
}
如果仅需要导出一个function还可以使用以下写法
// common/hello-common/index.js
module.exports = function(e){
return e
}
// use-common/index.js
'use strict';
const echo = require('hello-common')
exports.main = async (event, context) => {
let eventEcho = echo(event)
return {
eventEcho
}
}
需 HBuilderX 5.25 及以上版本。
TypeScript 公共模块支持使用export导出,TypeScript 云函数或云对象可以使用import引入。例如:
// common/hello-common/index.ts
export function getVersion() {
return '0.0.1'
}
export const secret = 'your secret'
// use-common/index.ts
import { getVersion, secret } from 'hello-common'
export async function main() {
return {
secret,
version: getVersion()
}
}
TypeScript 公共模块上传时,HBuilderX 会先进行类型检查,再将 TypeScript 编译为 JavaScript。存在类型错误或编译错误时会取消上传。编译配置及类型声明的说明参见使用 TypeScript 开发。