zx@lite:zx 脚本工具的极简核心版本、功能矩阵与分发实现原理
zxlitezx 脚本工具的极简核心版本、功能矩阵与分发实现原理【免费下载链接】zxA tool for writing better scripts项目地址: https://gitcode.com/GitHub_Trending/zx/zx本文围绕 zx 官方文档中的zxlite主题展开先讲清这个精简发行渠道的定位、安装方式与全量版的完整功能差异矩阵再结合仓库源码剖析zxlite包是如何由构建脚本自动裁剪、打包与发布的帮助你在为自有工具链选型 zx 依赖时做出准确判断并能读懂其底层分发机制。zxlite 是什么zxlite是 zx 的“仅核心功能”版本。它剥离了全部扩展能力只保留最底层的核心函数官方文档docs/lite.md给出的要点是体积约为全量版的 1/7~7x smaller than the full version不内嵌 CLI、文档与 manpage 等资产包名与全量版完全相同都是zx只是通过不同的 npm publish channel 区分——即lite代码更少意味着更快的加载与更可靠的 ISEC供应链安全审计面官方推荐基于 zx 构建自有工具包custom toolkits的项目使用它。安装命令在 docs/lite.md 中明确给出两种写法npm i zxlite npm i zx8.5.5-lite第一种跟随litechannel 拉取最新的精简版第二种锁定到具体版本的精简发行版本号后带-lite后缀。安装后核心 API 的用法与全量版一致import { $ } from zx await $echo foo注意这里导入名仍然是zx而不是zx/lite——因为精简版发布时保留了原包名只是package.json的exports与files被重写为只指向核心入口。功能矩阵latest 与 lite 的完整差异docs/lite.md 指向详细对比文档 versions该页面说明 zx 以三个 channel 分发latest功能完整的稳定版、lite核心与扩展分离后的精简版、dev实验性快照与 RC。两者逐 API 的差异如下完整版为 ✔lite 版缺失的条目即被裁剪的扩展Featurelatestlitezx/globals✔zx/cli✔$✔✔ProcessPromise✔✔ProcessOutput✔✔argv✔cd✔✔chalk✔✔defaults✔✔dotenv✔echo✔expBackoff✔fetch✔fs✔glob✔kill✔✔log✔✔minimist✔nothrow✔os✔✔parseArgv✔path✔✔ps✔✔question✔quiet✔quote✔✔quotePowerShell✔✔resolveDefaults✔✔retry✔sleep✔spinner✔syncProcessCwd✔✔tempdir✔tempfile✔updateArgv✔useBash✔✔usePowerShell✔✔usePwsh✔✔version✔which✔✔within✔✔YAML✔MAML✔从矩阵可以清楚看到边界lite 保留的是“进程执行 环境操作”这条主链路——$模板命令、ProcessPromise/ProcessOutput两大核心类、cd/kill/within/defaults/resolveDefaults等配置与目录函数、useBash/usePwsh/usePowerShell等 shell 切换、log/chalk/which/ps/quote等基础工具而glob、fs、dotenv、fetch、retry、spinner、tempdir等便利扩展以及zx/cli、zx/globals子入口则只存在于全量版。定位图谱在工具尺寸谱系中的位置docs/lite.md 用一条轴来描述选型空间工具尺寸从左到右递增内置功能也依次增多tool size ←child_processzurkzxlitezx→ built-in functionality也就是说如果你只需要裸的进程控制用 Node 内置child_process即可需要更优雅的进程管理可以看zurkzx 上游的进程库见 package.json 的 devDependencies 中的zurk需要“核心 zx 能力 更小的安装体积”就是zxlite需要glob、fs、fetch、retry等全家桶则是完整zx。源码剖析lite 包是如何生成的lite 版并不是手写的一份独立代码而是由构建脚本在全量构建完成后自动裁剪出来的。触发链路在 package.json 的 scripts 中build:lite: node scripts/build-pkgjson-lite.mjs, build:manifest: npm run build:pkgjson npm run build:lite npm run build:jsr, postbuild: node scripts/build-clean.mjs npm run build:manifest即每次npm run build产物输出到build/目录结束后postbuild会执行build:lite生成package-lite.json。核心逻辑见 scripts/build-pkgjson-lite.mjs分四步1. 以core.js为入口做依赖闭包分析。脚本先假定 lite 包只需包含./core.js与./3rd-party-licenses两个入口文件然后用depseekSync解析build/core.js源码中引用的模块凡是本地相对引用./xxx就追加进依赖集合并同步加入对应类型声明文件const entries new Set([./core.js, ./3rd-party-licenses]) // ... const deps depseekSync(contents) for (const { value: file } of deps) { if (file.startsWith(.)) { entries.add(file) entries.add(file.replace(/\.c?js$/, .d.ts)) } }这就是“~7x 更小”的来源files字段最终只列出core.js依赖闭包内的文件而全量版 package.json 的files还包含cli.js、globals.js、deno.js、index.js等所有入口及更庞大的 vendor 捆绑包如vendor-extra.cjs包含 YAML、glob、MAML 等第三方库的打包产物。2. 白名单过滤 package.json 字段。只保留name、version、description、type、main、types、typesVersions、exports、files、engines、optionalDependencies、publishConfig、keywords、repository、homepage、author、license等字段devDependencies、scripts、bin、overrides等一律剔除const whitelist new Set([ name, version, description, type, main, types, typesVersions, exports, files, engines, optionalDependencies, publishConfig, keywords, repository, homepage, author, license, ])3. 重写入口为 core。生成的package-lite.json中version追加-lite后缀version: _pkgJson.version -litemain指向./build/core.cjstypes指向./build/core.d.tsexports只保留.与./package.json两个子路径import/require均指向build/core.js/build/core.cjsfiles由上一步的依赖闭包映射为build/xxx并排序。4. 集成测试验证产物。集成测试 test/it/build-npm.test.js 中有专门的zxlite用例将package-lite.json临时替换为package.json后执行npm pack解包断言产物中devDependencies与bin均为undefined文件清单与预期一致最后实际运行node -e import {$} from ./package/build/core.js; $.verbose true; await $echo hello并匹配 stderr 中出现hello证明 lite 包脱离全量版环境后核心命令仍可独立运行。lite 版到底导出了什么core 模块边界lite 包的入口build/core.js由 src/core.ts 编译而来。从该文件的导出声明src/core.ts#L61-L67可以看出 lite 的完整 API 表面export { bus } from ./internals.ts export { default as path } from node:path export * as os from node:os export { Fail } from ./error.ts export { log, type LogEntry } from ./log.ts export { chalk, which, ps } from ./vendor-core.ts export { type Duration, quote, quotePowerShell } from ./util.ts再叠加文件主体中定义的defaults/resolveDefaultssrc/core.ts#L135-L153、src/core.ts#L1090-L1104、$与sync$、ProcessPromise、ProcessOutput、within基于AsyncLocalStorage的选项作用域src/core.ts#L155-L176、cd、kill、useBash/usePwsh/usePowerShellsrc/core.ts#L1009-L1017以及syncProcessCwd。对比之下全量版的入口 src/index.ts 在export * from ./core.ts的基础上追加了两层export * from ./goods.ts即 src/goods.ts 中的tempdir/tempfile、argv/parseArgv/updateArgv、sleep、fetch带pipe能力、echo、question、stdin、retry、expBackoff、spinner、versions等便利函数export { minimist, dotenv, fs, YAML, MAML, glob } from ./vendor.ts从 vendored 的第三方库再导出的工具集。这正是功能矩阵中 lite 缺失条目的代码级解释这些函数与zx/globals、zx/cli入口都不在core.js的依赖闭包内因此不会进入 lite 包的files清单。值得说明的是lite 版仍保留了完整的Options配置体系cwd、timeout、stdio、verbose、nothrow、preferLocal等见 src/core.ts#L93-L122与ZX_环境变量前缀的默认值解析src/core.ts#L77-L90resolveDefaults支持ZX_cwd、ZX_timeout、ZX_shell等环境选项注入。也就是说裁剪的是“附加功能”而不是$模板引擎的执行、管道pipe、超时、信号处理等核心机制。适用场景与选型建议自有工具链/内部 CLI 框架如果你的脚本库只是需要$、ProcessPromise/ProcessOutput、cd/kill/within这类核心能力npm i zxlite可以显著缩小 node_modules 体积并缩短冷启动时间这也是文档明确给出的推荐场景供应链审计考量lite 版files清单由依赖闭包静态推导生成包含的第三方代码更少不捆绑 YAML、glob、MAML 等审计范围更可控普通脚本/CI 脚本若用到了glob、fs、fetch、retry、spinner或需要zx命令行入口zx script.mjs与--quiet/--verbose等 CLI 参数见 man/zx.1应安装完整版zx环境要求与全量版一致engines声明为node 12.17.0见 package.json构建与测试基于 Node 24volta配置锁定版本时建议使用文档示例中的zxx.y.z-lite精确写法。小结zxlite通过“同名包 独立 channel 构建期依赖闭包裁剪”的方式把 zx 的核心进程执行引擎$、ProcessPromise、ProcessOutput及 shell 切换、目录/进程控制等基础能力从完整工具集中分离出来体积约为全量版的 1/7且不包含 CLI、文档与 manpage 资产。其分发产物由 scripts/build-pkgjson-lite.mjs 自动生成、由 test/it/build-npm.test.js 的集成测试持续验证功能边界则完整记录在 docs/versions.md 的矩阵中。对于基于 zx 构建自有工具包的项目它是官方推荐的更轻、更易审计的依赖形态。【免费下载链接】zxA tool for writing better scripts项目地址: https://gitcode.com/GitHub_Trending/zx/zx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
