限制与常见问题
编译相关
- 所有应用都由浏览器内编译器打包,Node 内置模块按以下分级支持(
node:前缀写法同样适用):- 浏览器 polyfill,可正常使用:
process/events/util/stream/url/querystring/assert/string_decoder等 - 本地实现:
path、buffer、timers完整可用;crypto只支持部分 API(Web Crypto、randomBytes、pbkdf2,以及 md5 / sha1 / sha224 / sha256 的createHash,不支持scrypt);zlib只支持异步的 gzip / deflate(*Sync、Brotli 和流式接口调用时报错);fs/fs/promises只支持异步 API,且只能在终端run临时脚本里使用,应用源码中调用会以WORKSPACE_LEASE_REQUIRED拒绝 - 可以 import 但调用即报错(错误信息带
[lf-node-shim]前缀):http/https/net/tls/dns/os/readline/tty等 - 直接编译失败:
child_process/cluster/worker_threads/vm/v8/inspector/module/repl
- 浏览器 polyfill,可正常使用:
- 本地模块请用标准 ESM
import。@require只接受内置库 id,写本地文件(如// @require ./lib.js)会编译失败 - 插件构建只读入口文件的
@require:组件或工具文件里用到的内置库也必须在入口声明,非入口文件头部的@require只在终端直接run该文件时生效(编辑器给 Warning) - Vue 通过正常
import { createApp } from "vue"引入,不再作为内置运行时别名
运行时相关
LFHttp只拒绝本机 PluginX 客户端端口(任何回环写法的41720)、chrome-extension://、file://与非 http(s) 目标,重定向后的最终地址同样复核;只校验字面主机名。本地客户端只能经LFHttp.client访问。默认携带目标域名已有 cookie,也可以用headers.Cookie显式指定(会整体替换浏览器自动附带的 cookie);Referer/User-Agent等浏览器保留头在网络层写入,结果见响应的headerOverridesLFNetwork在已保存 bundle、liveDebug 主路径(USER_SCRIPT 世界)与run --tabMAIN world 脚本(经网络中继桥)均可用;代码中直接使用须显式// @require network(@require dom不够)LFRuntime.readFile/writeFile/execTerminalCommand只能在终端run临时脚本(run/run -c/run --tab/run --target background)里直接调用。应用源码(liveDebug、已启用 / 已安装、后台应用)直接调用会编译报错,须用LFRuntime.cli.register({ workspace: ['read' | 'write' | 'exec'] })注册命令,在 handler 里通过ctx.workspace.readFile/writeFile/exec访问,租约只在本次plugincmd call期间有效- 本机命令执行、本机文件访问与 CLI 注册表请求只接受 PluginX 编辑器页面发起,插件应用(页面注入、后台、USER_SCRIPT world)直接发送这些扩展消息会以
EACCES_PERMISSION被拒绝 LFStore按 JSON 存储:值里含Map/Set/ 函数 /Symbol/BigInt/ 循环引用时set直接报错并指出路径(如at value.cache),请先转成普通 JSON 数据- 使用
LFRuntime.network.onResponse/interceptRequest/interceptResponse拦截页面请求必须在入口头部声明@intercept,否则点「编译」直接报错(liveDebug 与run --tab不检查此项)
IDE 相关
- 保存(Ctrl+S)只存源码;点「编译」(会自动先保存)才会编译并更新已注册的产物。只保存不编译时,已启用的应用和刷新后的页面仍运行上一次编译的版本
- 文件树顶部可新建文件/文件夹,右键菜单支持重命名、删除,终端也可用
mv/rm调整;重命名或移动入口文件时,入口设置会自动跟随 - 首次编译 npm 依赖需要联网下载,之后命中 IndexedDB 缓存(可在「系统信息」查看缓存量)
- liveDebug 按浏览器 documentId 判断页面生命周期:SPA 弹窗、
history.pushState等仅改变 URL 但不更换 document 的操作不会重注入,也不会注销 CLI 命令。只有完整导航/刷新产生新 document 时,旧 USER_SCRIPT 和正在执行的plugincmd调用才会结束;新 document 加载完成后会自动重注入并恢复注册,已中断的调用需在injectionHealthy: true后重试 - 若具名 USER_SCRIPT world 的 messaging 配置失败,liveDebug 会自动重试三次,再报错并停止注入,不会运行缺少 LFStore/LFUser/LFNetwork/CLI 能力的半残实例;环境恢复后执行
liveDebug reload重试
权限相关
已安装应用要真正运行,浏览器必须为扩展开放 userScripts 能力(「允许运行用户脚本」开关或开发者模式)。未开启时应用管理页会出现引导横幅,按步骤开启后点「重新检测权限」即可。