[TOC]
截止 10 Apr, 2020 ,
微信小程序的云函数仅支持 Node.js 语言,函数在生产环境执行于 CentOS 7.2
的 Node.js 8.9
,因此若有二进制模块使用需求请注意相关配置。
现以 gRPC 为例说明。
建议使用 NVM 安装 8.9
的最新版:
nvm install v8.9.4 --latest-npm
为了之后随微信环境要求变化,建立一个 alias :
nvm alias weapp v8.9.4
为了减少与其它项目依赖的冲突概率,
可将版本写入 .nvmrc
并用该脚本来做环境自动切换。
前往小程序项目的云函数目录,建立 .nvmrc
文件:
echo weapp > ~/mini-program-proj/cloud/.nvmrc
此时当切换至云函数目录将自动切换至所需的 Node 版本。
我们可根据指引进入对应函数的本地调试器,并修改本地 Node.js 执行文件路径为 ~/.nvm/versions/node/v8.9.4/bin/node
。(请根据实际路径调整)
此时我们 npm i
可正常安装对应版本和平台的 gRPC 二进制模块。
如在 macOS 下模块位于 node_modules/grpc/src/node/extension_binary/node-v57-darwin-x64-unknown
。
当我们对云函数执行上传并部署(云端安装依赖)
到生产环境后,
程序可能会抛出 Failed to load gRPC binary module...
错误,
原因是 gRPC 二进制模块在云端安装失败。
解决方法是本地安装对应的二进制模块后, 再将 node_modules 全量上传。 (听起来很唬烂,但似乎是目前唯一的办法)
从错误日志中我们得知所需的二进制模块是 node-v57-linux-x64-glibc
,
我们可以在 CentOS 7.2 环境下(如借用 Docker 容器)编译取得,
或更简单地做交叉编译。
进入对应的云函数目录执行:
npm rebuild --target=8.9.4 --target_platform=linux --target_arch=x64 --target_libc=glibc --update-binary
然后在本地安装其它所有模块依赖之后对函数执行上传并部署(所有文件)
。
至此我们已解决 gRPC 的二进制模块依赖问题, 其它模块的大同小异。