云函数不能直接require外部JS文件路径,必须通过公共模块或npm包引入;因部署时只打包当前目录及子目录,不包含上级或平行目录文件,故相对路径引用会报错。

云函数不能直接 require 外部 JS 文件路径,必须通过公共模块或 npm 包方式引入。uniCloud 云函数运行在隔离的 Node.js 环境中,require('./utils/helper.js') 这类相对路径引用会报 Error: Cannot find module —— 不是因为语法错,而是打包部署时未包含该文件,且云函数加载机制不支持跨文件夹动态解析。
为什么 require('./lib/utils.js') 会失败
云函数上传部署时只打包当前文件夹及其子目录(如 index.js、package.json、node_modules),但不会自动扫描或递归包含上级或平行目录的 JS 文件。即使文件物理存在,require 也找不到模块入口。
- 常见错误现象:
Cannot find module './utils/format'或require is not defined(后者多见于误在前端 context 调用) - 不是 Node 版本问题,也不是路径写错,而是部署结构没对齐
- HBuilderX 的「上传部署」动作只认当前右键的云函数文件夹,不会帮你把项目根目录下的
common/或lib/一起打进去
正确做法:用「公共模块」而非相对路径
uniCloud 提供了原生支持的跨云函数复用机制——公共模块(public modules),它会在所有云函数部署时被统一注入,无需手动拷贝或 npm link。
- 右键
uniCloud目录 → 「管理公共模块」→ 「新建公共模块」,填入名称如shared-utils - 在该模块内放
index.js,导出函数:exports.formatTime = (ts) => new Date(ts).toLocaleString();
- 在任意云函数中这样引入:
const utils = require('@cloud/shared-utils'); - 注意:
@cloud/是固定前缀,后面跟的是你在「管理公共模块」里定义的模块名,大小写敏感
npm 包方式同样有效,但要注意兼容性
如果你已有封装好的 npm 包(比如自己 publish 的 @myorg/utils),或想用 cheerio、lodash 等第三方库,走 npm 安装是完全可行的,但需满足两个前提:
- 必须在云函数**自身目录下**执行
npm install(例如cloudfunctions/get-user/index.js所在文件夹),不能在项目根目录或uniCloud根目录下装 - 包必须纯 JavaScript / CommonJS,不依赖
fs、net等 Node 原生模块(uniCloud 阿里云/腾讯云环境禁用部分 API) - 部署时确保
node_modules被上传(HBuilderX 默认包含,但 CLI 部署需确认--include node_modules) - 引入写法统一用
require('package-name'),ESM 语法(import)在云函数中不稳定,尤其阿里云环境不推荐
别踩「本地调试假成功」这个坑
在 HBuilderX 开启「本地云函数调试」时,require('./xxx') 有时看似能跑通,那是因为本地 Node 进程直接读取了项目文件系统;一旦部署到云端,立刻失效。这种“本地行、线上崩”的情况,90% 出现在没走公共模块或 npm,而是硬写相对路径的场景。
真正可靠的复用逻辑,只有两条路:走 @cloud/xxx 公共模块,或者走 require('xxx') + 云函数目录内 node_modules。其它任何路径拼接、动态 eval、fetch 加载远程 JS 的方式,都不符合 uniCloud 的部署模型和安全策略。


















