最近给 node 项目写 CLI 库的时遇到的两个开发问题

news/2026/1/16 22:03:38/文章来源:https://www.cnblogs.com/aurora5090/p/19465400

node 环境,项目形式是 monorepo。

工程可以认为是某种开放的引擎(有一个 packages 文件夹装所有的库,以及一个用户的目录)

我的 cli 库需要动态执行用户的一些文件(.ts)。

压根没料到这么麻烦

这个事情看起来很简单,如果 cli 也在用户目录下,我们直接运行 tsx 之类的工具就行。

不过现在的情况是,因为仓库是 monorepo,这里 cli 库是一个子库,于是流程是

  • 用 vite 把 cli 提前打包成 bin
  • 在用户目录里安装到 devDependencies

这样就遇到了两个很神秘的问题。

--import tsx

用 node 执行 cli.js (里面包含 import("xxx.ts") 语句) 会报错,因为原生肯定不支持 ts。
一个解决方案是 node --import tsx cli.js,这样肯定能工作,然而

简单研究了一下,vite 打包成 bin 以后没办法加参数 --import tsx,除非手工改产物(也可能是我不知道怎么做)

解决方案就比较邪恶,我们把入口文件换成一个 bin.js(而不是 cli.js)
我们 spawn 一个子进程,把参数加上去以后,运行 dist/cli.js

#!/usr/bin/env nodeimport { spawn } from 'node:child_process';
import { fileURLToPath } from 'node:url';
import path from 'node:path';const __dirname = path.dirname(fileURLToPath(import.meta.url));const CLI_DIST = path.join(__dirname, 'dist', 'cli.js');const args = ['--no-warnings', '--import', 'tsx', CLI_DIST, ...process.argv.slice(2)];const child = spawn(process.execPath, args, {stdio: 'inherit',shell: false,
});child.on('exit', (code) => process.exit(code ?? 0));

这个代码是个原型,如果你写正式工程,这里还要提前判用户 node 版本(因为低版本没有 --import)

这样的好处是 cli 打包结果很纯洁,非常小,不含 tsx 等解释器的东西(peer 装到用户那边)。
同时 cli 实际拿到的 process.argv 依然是不含 --import tsx 的,保留了原样。

执行环境不同

这里遇到了第二个问题,执行环境不同

// cli 的代码
import { some } from '@repo/lib'
await import('user.ts');
console.log(some)// user.ts 的代码
import { some } from '@repo/lib'
console.log(some)

这两个 some 不是同一个,估计是因为 user.ts 是被动态导入的。

解决方法是我们让 cli 拿到用户侧导入的库的储存地址,然后 import 进来就行

import { createRequire } from 'module';
import { pathToFileURL } from 'url';const require = createRequire(import.meta.url);
const libPath = require.resolve('@repo/lib'); // 拿到用户的那个 lib 的 pathconst { some } = (await import(pathToFileURL(path).href)).default as typeof import('@repo/lib');

这样是 some 就是同一个了,有点神秘啊这个做法。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1170149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

真正的风险在于工作流安全而非模型安全

随着AI副驾驶和智能助手被嵌入到日常工作中,安全团队仍然专注于保护模型本身。但最近的事件表明,更大的风险在别处:围绕这些模型的工作流程。最近发现两个伪装成AI助手的Chrome扩展程序从90多万用户那里窃取了ChatGPT和DeepSeek的聊天数据。另…

本周网络安全威胁通报:AI语音克隆漏洞等多起事件

互联网从未平静过。每周都有新的黑客攻击、诈骗和安全问题在某个地方出现。本周的安全事件显示了攻击者改变策略的速度有多快,小错误如何演变成重大风险,以及相同的老工具如何不断找到新的突破方式。请继续阅读,在下一波攻击到来之前了解最新…

Anaconda+CUDA+PyTorch下载教程

@目录前言工具介绍1.Anaconda2.PyTorch3.CUDA4.整体工作关系图Anaconda安装(推荐)1.概述2.下载安装包3.下载步骤4.修改虚拟环境位置5.删除AnacondaCUDA安装(可选)1.概述2.版本匹配3.确认显卡型号4.获取CUDA安装包5…

设备一离线任务就挂?我在鸿蒙分布式项目中踩过的失败恢复坑

摘要 在鸿蒙系统(HarmonyOS / OpenHarmony)中,分布式能力已经从“概念阶段”进入了实际落地阶段。 手机、平板、智慧屏、车机、穿戴设备之间的协同已经非常常见,但在真实环境下,一个绕不开的问题是:失败随时…

有关平衡树

本篇将详细介绍FHQ-Treap的核心思想以及代码实现 一:BST BST是二叉搜索树,说白了就是一颗二叉树,它满足这样的性质: 对于任意节点x,它的左子树中的所有值都比x小,右子树中的所有值都比x大 (…

关于DAG定向问题的一些补充

DAG 定向是一个经典的集合划分容斥问题,我们想要做到每次删去一个 极大 的出度为零的点集,这个东西没有办法直接做到,所以我们考虑给每个集合分配一个容斥系数去做到,通过各种方式都可以得到 \((-1)^{|S|-1}\) 的容…

51单片机_DS1302

实时时钟芯片 DS1302DS1302时钟 main.c #include <REGX52.H> #include "LCD1602.h" #include "DS1302.h"void main() {LCD_Init();DS1302_Init();LCD_ShowString(1,1," - - ")…

工具Cursor(三)MCP(2)自定义mcp tools集成到cursor中的demo

借助 Cursor 对 MCP Servers 的支持&#xff0c;我们可以灵活定制 MCP 工具&#xff0c;有效提升整体工作效率。一、demo ①——调用系统接口你有没有遇到过&#xff1a;通过postman调用本地接口&#xff0c;需要携带token&#xff0c;这就需要登录到系统中抓取token&#xff1…

Playwright处理验证码的自动化解决方案

验证码&#xff08;CAPTCHA&#xff09;一直是自动化测试中最让人头疼的环节之一。每次碰到那些扭曲的文字、点选图片的挑战&#xff0c;自动化脚本就像撞上了一堵墙。我负责的电商项目最近就卡在了登录自动化这个环节——那个该死的滑动验证码让我们的回归测试屡屡失败。 经过…

20260116紫题训练总结 - Link

A - 算术天才⑨与等差数列 简单题,切了。考虑用线段树维护 \(\max\)、\(\min\)、\(\gcd\) 和每个数字前面最后一个等于祂的数字的位置,判断是简单的。 B - Building Bridges 由于 \(T1\) 写+调了一整场,根本没看题。…

【2026目标检测】高质量模型汇总

目标检测模型选型指南&#xff1a;从高精度慢模型到实用型算法全盘点 在目标检测领域&#xff0c;模型的速度与效果往往难以两全&#xff0c;有一批模型虽运行速度较慢&#xff0c;但凭借出色的检测效果占据一席之地&#xff0c;同时还有各类实用型算法和框架可供选择&#xff…

工具Cursor(三)MCP(1)介绍

一、在哪里添加McpServers 1、位置 Cursor是一个很好的Mcp Client&#xff0c;可以通过Cursor Setting--Tools & MCP --New Mcp Server来管理mcp tools。 添加之后都会展示在tools列表&#xff1a; 2、mcpServers 与 MCP 协议的边界 这是很多人会混淆的地方&#xff1a;…

拥有AI员工,才发现误会了领导

人工智能爆火三年&#xff0c;大模型和AI工具好用之后&#xff1a;职场从个人单刷模式&#xff0c;转变成带几个AI助手打团战&#xff0c;可以更高效的干活&#xff0c;但节奏却慢不下来。打工人成领导&#xff0c;不知薪水涨多少&#xff1f;虽说只是几个AI助手&#xff0c;但…

阿里千问落地谷歌UCP+A2UI,中国率先进入AI办事时代

刚刚&#xff0c;阿里千问App上线千问任务助理1.0&#xff0c;目前可以通过客户端申请邀测。千问打通了淘宝、支付宝等核心业务&#xff0c;标志着中国互联网正式进入AI办事时代。AI从单纯的对话框聊天&#xff0c;迈向了真正的办事助手。前不久&#xff0c;谷歌在大洋彼岸联合…

浙大陆展团队突破铁催化难题,实现高效氢联硅化反应 | 乐研试剂

在有机硅化学与合成化学的前沿领域&#xff0c;如何在不破坏关键Si–Si键的前提下&#xff0c;实现联硅前体的高选择性官能团化&#xff0c;一直是困扰研究人员的重大挑战。近日&#xff0c;浙江大学化学系陆展教授及其合作团队在联硅化学领域取得里程碑式突破。他们创新性地设…

P3349 [ZJOI2016] 小星星 - Link

先枚举一个集合 \(S\),设状态 \(f_{i,j}\) 表示树上 \(i\) 号点对应图上 \(j\) 号点 \((j\in S)\) 的方案数(可以多个树上的点对应一个图上的点)。转移是简单的。最后对于集合 \(S\),有容斥系数 \((-1)^{\left|S\r…

企业如何破解业法财融合痛点?AI风控探针的 4 个落地步骤

本文由幂律智能团队发布&#xff0c;核心探讨了 2026 年法律科技的关键技术——AI 风控探针。文章详细拆解了 AI 如何通过多 Agent 协作模式解决业法财深度融合中的数据割裂难题。重点涵盖&#xff1a;1. 如何通过拆解任务解决大模型幻觉&#xff0c;使合同审查准确率提升至 95…

【RAG召回排序】2025最全排序模型梳理

2025年检索重排模型全景盘点&#xff1a;从顶尖榜单到实用工具 在检索增强生成&#xff08;RAG&#xff09;和智能搜索领域&#xff0c;检索与重排模型的性能直接决定了系统的最终效果。今天我们就从权威排行榜出发&#xff0c;盘点当前最受关注的模型与工具。 一、权威检索重…

Nature发表、Science点赞!清华揭秘AI让科学家走捷径却让科学走窄路

AlphaFold获得诺贝尔奖标志着人工智能工具已深入科学的核心地带。清华大学一项基于41,298,433篇论文的深度研究揭示了一个令人深思的悖论。AI显著提升了科学家的个人产出与职业进程&#xff0c;却导致整个科学探索的领域变得狭窄且固化。该研究发表在Nature上&#xff0c;而且被…

AI技术唾手可得的时代,挖掘新需求是产品突围的关键——某知名聚合DNS管理系统的需求洞察

a.内容描述 核心功能定位&#xff1a;该项目是一个聚合DNS管理系统&#xff0c;旨在为用户提供一个统一的Web界面&#xff0c;集中管理分布在多个主流云服务商和DNS服务平台的域名解析记录。其核心定位是解决用户在多平台间切换管理DNS解析的繁琐问题。关键应用场景&#xff1a…