还在为调试组件库发愁吗?yalc 帮你一把

前言

哈喽大家好!我是 嘟老板。最近在开发组件库的过程中,发现了一个比较好用的工具,让我可以用 npm 的操作轻松完成本地调试,分享给大家。

什么是 yalc

  • 定位 : 本地"迷你私有 npm 仓库"。将包发布到本机的 yalc 仓库,再让其他项目从这个"仓库"安装,避免 npm link 带来的软链与重复依赖问题。
  • 优势
    • 可复现: 以打包产物为准,接近真实发包。
    • 稳定 : 解决 npm link 多 React/多实例等问题。
    • 简单: 一条命令推送更新,消费者一条命令升级。

安装

bash 复制代码
npm i -g yalc
# 或
pnpm add -g yalc
# 或
yarn global add yalc

核心命令

  • yalc publish: 在包项目中发布到本机 yalc 仓库(不推送给消费者)
  • yalc push: 在包项目中将最新产物推送给所有已 yalc add 的消费者项目
  • yalc add <package>: 在消费者项目中从 yalc 仓库安装此包
  • yalc update: 在消费者项目中更新已安装的 yalc 包
  • yalc remove <package>: 在消费者项目中移除 yalc 包
  • 其他:yalc installations show(查看安装情况)、yalc check(检查状态)

提示:默认是"拷贝产物"模式,避免软链带来的解析/构建问题。若确需软链可用 yalc add <pkg> --link,但不推荐。


推荐工作流(单包)

  1. 在"包项目"(要被消费的库)中:

    bash 复制代码
    # 1) 构建(确保输出产物完整,如 dist/)
    npm run build
    
    # 2) 将打包产物发布到本机 yalc 仓库
    yalc publish
  2. 在"消费者项目"(业务应用)中:

    bash 复制代码
    # 3) 从本机 yalc 仓库安装
    yalc add <your-package-name>
    
    # 4) 安装依赖并启动
    npm i
    npm run dev
  3. 后续库代码改动:

    bash 复制代码
    # 在包项目中重新构建并推送
    npm run build
    yalc push
    
    # 在消费者项目中如果未自动刷新,可手动
    yalc update
  4. 完成后回归 npm 正式包:

    bash 复制代码
    # 在消费者项目中移除本地 yalc 包
    yalc remove <your-package-name>
    npm i <your-package-name>@latest

示例场景

1.本地组件库与业务项目并行开发

以组件库(如包名 @your/awesome-lib)为例:

  • 在库项目中:

    bash 复制代码
    npm run build
    yalc publish
  • 在业务项目中:

    bash 复制代码
    yalc add @your/awesome-lib
    npm i
    npm run dev
  • 库更新迭代:

    bash 复制代码
    npm run build && yalc push
    # 业务项目中(如需)
    yalc update
  • 踩坑提示:

    • reactreact-domantd 等放入库的 peerDependencies,避免消费者安装时出现重复实例。
    • 确保库的 package.jsonfiles 或打包产物(如 dist/)包含所有必需文件(样式、图片、类型声明等)。

2.Monorepo 多包联调(pnpm/yarn workspace)

  • 对"被消费的库包"使用 yalc publish / push 与"应用包" yalc add / update 的模式,而不是直接 workspace 软链,减少构建器/解析器差异带来的问题。

  • 库包脚本示例:

    json 复制代码
    {
      "scripts": {
        "build": "tsc -b",
        "dev:push": "npm run build && yalc push",
        "dev:pub": "npm run build && yalc publish"
      }
    }
  • 应用包脚本示例:

    json 复制代码
    {
      "scripts": {
        "yalc:add": "yalc add @your/awesome-lib",
        "yalc:update": "yalc update"
      }
    }

  • yalc: 拷贝打包产物,接近真实发包,减少"多实例 React/依赖解析异常"。
  • npm link: 软链源码,调试直观,但在复杂依赖/多构建器下容易出现不可预期的行为。

最佳实践与注意事项

  • 打包产物为准 :始终 npm run build 后再 yalc publish/push
  • peerDependencies :库将运行时单例依赖(如 React)放入 peerDependencies;消费者负责安装。
  • 忽略文件 :在库中检查 .npmignorefiles,避免发布缺文件(样式、图片、声明)。
  • .yalc 与 yalc.lock
    • .yalc/ 通常不提交;yalc.lock 可在短期联调分支提交以确保一致,避免污染长期分支。
  • CI/CD :不建议在 CI 中依赖 yalc。CI 用正式发包(私服/beta tag)或 npm pack 产物。
  • 回滚 :完成联调后尽快 yalc remove,切回正式 npm 版本。
  • 常见问题
    • 依赖冲突/重复 React:检查库的 peerDependencies 与消费者实际安装版本是否一致。
    • 更新不生效:确认库已 yalc push,应用执行 yalc update;必要时删 node_modules 重装。
    • TS 类型缺失:确保库产物包含 .d.tstypes/typings 指向正确。

常用命令速查

bash 复制代码
# 库项目
npm run build && yalc publish     # 首次发布到本机仓库
npm run build && yalc push        # 推送更新给所有消费者
yalc check                        # 检查状态
yalc installations show           # 查看哪些项目安装了本包

# 消费者项目
yalc add <package>
yalc update
yalc remove <package>

最小可用脚本示例

package.json

json 复制代码
{
  "scripts": {
    "build": "tsc -p tsconfig.build.json",
    "yalc:publish": "npm run build && yalc publish",
    "yalc:push": "npm run build && yalc push"
  },
  "peerDependencies": {
    "react": "^18",
    "react-dom": "^18"
  },
  "files": ["dist", "package.json", "README.md"]
}

应用 package.json

json 复制代码
{
  "scripts": {
    "yalc:add:lib": "yalc add @your/lib",
    "yalc:update": "yalc update"
  }
}

结语

技术简而不凡,创新生生不息。我是 嘟老板,咱们下期再会。

相关推荐
小周同学@16 小时前
谈谈对this的理解
开发语言·前端·javascript
Wiktok16 小时前
Pyside6加载本地html文件并实现与Javascript进行通信
前端·javascript·html·pyside6
一只小风华~16 小时前
Vue:条件渲染 (Conditional Rendering)
前端·javascript·vue.js·typescript·前端框架
柯南二号16 小时前
【大前端】前端生成二维码
前端·二维码
程序员码歌16 小时前
明年35岁了,如何破局?说说心里话
android·前端·后端
博客zhu虎康17 小时前
React Hooks 报错?一招解决useState问题
前端·javascript·react.js
灰海17 小时前
vue中通过heatmap.js实现热力图(多个热力点)热区展示(带鼠标移入弹窗)
前端·javascript·vue.js·heatmap·heatmapjs
王源骏18 小时前
LayaAir鼠标(手指)控制相机旋转,限制角度
前端
大虾写代码18 小时前
vue3+TS项目配置Eslint+prettier+husky语法校验
前端·vue·eslint
wordbaby18 小时前
用 useEffectEvent 做精准埋点:React analytics pageview 场景的最佳实践与原理剖析
前端·react.js