Next.js 14中无法使用lnurl npm库?技术问题求助
问题:Next.js 14中导入lnurl库触发语法错误
问题重现
- 新建Next.js 14初始项目,执行安装命令:
npm i lnurl - 在API路由(如
src/app/api/auth/route.ts)中仅添加导入语句:import lnurl from 'lnurl' - 触发以下语法错误:
⨯ ./node_modules/lnurl/lib/subprotocols/channelRequest.js
Error:
× Cannot use a reserved word as a shorthand property
╭─[.../channelRequest.js:44:1]
44 │ let { remoteid, localAmt, pushAmt, private } = params;
· ───────
× Expression expected
× Expected ',', got 'private'
Caused by: Syntax Error
注:该库在Next.js 13演示项目中可正常运行。
原因分析
private是JavaScript的保留字(作为类私有字段修饰符),lnurl库的channelRequest.js中直接将其用作解构赋值的变量名,而Next.js 14的编译环境(如SWC)启用了更严格的语法检查,导致触发错误。Next.js 13演示项目可运行可能是因为使用了旧版库或宽松的编译配置。
解决方案
方案1:用patch-package持久化修复库代码
- 安装patch-package:
npm i patch-package --save-dev - 找到
node_modules/lnurl/lib/subprotocols/channelRequest.js,修改第44行的解构语句:// 原代码 let { remoteid, localAmt, pushAmt, private } = params; // 修改为(用别名避开保留字) let { remoteid, localAmt, pushAmt, private: isPrivate } = params; - 替换后续所有用到
private的变量为isPrivate:// 第46行 assert.ok(typeof isPrivate !== 'undefined', new HttpError('Missing required parameter: "private"', 400)); // 第47行 isPrivate = parseInt(isPrivate) === 1; - 生成补丁文件:
npx patch-package lnurl - 在
package.json的scripts中添加:
确保每次"postinstall": "patch-package"npm install后自动应用补丁。
方案2:配置Next.js转译lnurl库
在next.config.js中添加转译配置,让Next.js处理库的语法兼容性:
/** @type {import('next').NextConfig} */ const nextConfig = { transpilePackages: ['lnurl'], } module.exports = nextConfig
方案3:使用演示项目的lnurl版本
查看演示项目package.json中的lnurl版本,安装对应版本以避开问题:
npm i lnurl@<演示项目中的版本号>
内容的提问来源于stack exchange,提问作者keating
相关产品推荐
相关产品推荐

