前端架构: 脚手架包管理工具之lerna的全流程开发教程

Lerna


1 )文档

  • Lerna 文档
    • https://www.npmjs.com/package/lerna
    • https://lerna.js.org [请直达这个链接]
  • 使用 Lerna 帮助我们做包管理,并不复杂,中间常用的命令并不是很多
  • 这里是命令直达:https://lerna.js.org/docs/api-reference/commands

2 )使用

  • 现在我们开始使用 Lerna, 首先创建目录 lerna
  • 安装并查看 lerna 版本 $ npx lerna -v 这里没有安装,会自动安装 lerna
  • 目前lerna的版本是8.1.2
  • 在 lerna 这个目录下执行 $ npx lerna init
  • 这时候,项目初始化完成了,就会多处一个 lerna.json 这个是lerna配置文件
  • 现在基于 lerna 创建 a包 $ npx lerna create a 一路回车
  • 现在出现了 packages/a 包,里面有一系列配置
  • 同workspace使用一致,在使用a的时候,把a加到分组中, 修改 a/package.json中的name
  • "name":"@somegroup/lerna-a", 并且把 a/lib/a.js 修改成 a/lib/index.js
  • 同步 a/package.json 中 "main": "lib/index.js", 同时修改成ESM的形式 "type":"module"
  • 修改 a/lib/index.js 的代码
    'use strict';export default function() {return 'Hello from a';
    }
    
  • 这样,a包就调试好了, 可以在 lerna/package.json 中看到
    "workspaces": ["packages/*"
    ],
    
    • 这里的worksapces 使用了通配符*的方式
  • 不同于 npm的workspace添加依赖的方式,lerna提供的方式是:$ npx lerna add -h
  • 注意,这里 The “add” command was removed by default in v7, and is no longer maintained.
  • 所以,新提供的方式是: https://lerna.js.org/docs/legacy-package-management#replacing-your-usage-of-lerna-add
  • 现在给a包添加chalk依赖: $ npm i chalk -w @somegroup/lerna-a 注意这里a包的name变化了,所以安装方式也要如此
  • 这里,a包就绪之后,就可以着手创建b包了,在创建的时候,可以看下一些辅助参数 $ npx lerna create -h
  • 可以看到常用的有
    --access        When using a scope, set publishConfig.access value                        [可选值: "public", "restricted"] [默认值: public]
    --bin           Package has an executable. Customize with --bin <executableName>          [默认值: <name>]
    --es-module     Initialize a transpiled ES Module                                         [布尔]
    
  • 这样,在创建b包的时候,就可以这样 $ npx lerna create b --access public 回车,注意name配置为:@somegroup/lerna-b
  • 创建 cli 包的时候,就可以这样 $ npx lerna create cli --access public --bin --es-module 回车,注意name配置为:@somegroup/lerna-cli
  • 对于b包
    • 修改 b/lib/b.js 为 b/lib/index.js, 同时修改 b/package.json 中的 "main": "lib/index.js""type": "module"
      • 注意,这里和 cli包的区别在于生成b包的时候 --es-module 没有添加,所以要手动添加这个 "type": "module"
    • 修改 b/lib/index.js 的内容
      'use strict';export default function () {return 'Hello from b';
      }
      
  • 对于 cli 包
    • 修改 cli/package.json 中的 bin属性为:"bin": { "lerna-cli": "bin/cli.js" }, main属性 "main":"src/cli.js"

    • 修改 cli/bin/cli.js 中

      #!/usr/bin/env node'use strict';import cli from '../src/cli.js';cli().parse(process.argv.slice(2));
      
    • 修改 src/cli.js

      import factory from 'yargs/yargs';export default function cli(cwd) {const parser = factory(null, cwd);parser.alias('h', 'help');parser.alias('v', 'version');parser.usage("$0","TODO: description",yargs => {yargs.options({// TODO: options});});return parser;
      }
      
  • 回到最外层 lerna 目录,尝试连接下:npx lerna link,发现报错
    • 报错内容为:The “link” command was removed by default in v7, and is no longer maintained.
    • 解决方案:https://lerna.js.org/docs/legacy-package-management#replacing-your-usage-of-lerna-bootstraplerna-link
  • 使用 $ npm i -ws 这样,三个包都会在 lerna/node_modules/@somegroup 组中会被同步,这样可以替代之前lerna的link命令
    • npm i -ws 是更新所有 workspaces 中的依赖
  • 现在在 lerna/package.json 中的最外层加上一个 cli 的 scripts
    {"scripts": {"cli": "lerna-cli"}
    }
    
  • 执行 $ npm run cli
  • 这样,cli 包就可以直接在 lerna 目录下执行了, 验证
    • $ npm run cli -v 得到 10.2.3 这里得到的是 npm 的版本
  • 至此,基于 lerna 的脚手架的功能框架完成,目前并没有提供什么实质的功能
  • 现在,要在 cli 包中使用a包和b包,在 lerna 目录下,执行 $ npm i @somegroup/lerna-a @somegroup/lerna-b -w packages/cli
  • 在 lerna/packages/cli/bin/cli.js 中使用
    #!/usr/bin/env node'use strict';import cli from '../src/cli.js';
    import a from '@somegroup/lerna-a';
    import b from '@somegroup/lerna-b';console.log(a());
    console.log(b());cli().parse(process.argv.slice(2));
    
  • 执行 cli,$ npm run cli 可以看到,打印出了a, b包中的方法提供的字符串

3 )测试

  • 使用 lerna 添加测试脚本 $ npx lerna run test 它会把 packages 目录中所有 test 脚本全部执行
  • 如果要单独测试某个包,比如a包,修改 packages/a/__tests__ 目录下的 a.test.js
    'use strict';import a from '../lib/index.js';
    import assert from 'assert';const { strict } = assert;assert.strictEqual(a(), 'Hello from a');
    console.info('a tests passed');
    
  • 这时候,在 packages/a 下执行 $ npm run test 测试通过
  • 同样,packages/* 下的所有包都可以这样修改后,执行测试用例

4 )发布

  • 发布前的再次检查
    • 每个包的版本都要注意同步检查,发布的时候,不要有错误
    • 发布的配置检查,在 package.json 中 "publishConfig": { "access": "public" } 都要有
    • 提交代码到远程仓库后(必须)
  • 所有事项准备完成,就可以执行发布的流程了,执行 $ npx lerna publish
    • 这里有步骤,可以选择下一个版本,填入必要信息或选项
    • 选择之后,本地packages下包的每个版本都会帮忙升级,非常方便

5 )验证

  • 发布完成后,可以本机全局安装我们的 @somegroup/lerna-cli 工具了
  • $ npm i -g @somegroup/lerna-cli@latest 或者指定版本号
  • 再执行 $ lerna-cli 就可以运行我们的脚手架了
  • 这样基于lerna开发的脚手架就已经完成了

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

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

相关文章

掌汇云 | FBIF个性化票务系统,展会活动数据好沉淀

“把票全卖光&#xff01;卖到一票难求&#xff0c;现场座无虚席。” 卖票人和买票人可能永远不在一个频道上。 2022年办活动&#xff0c;就是一个字&#xff0c;搏&#xff01;和“黑天鹅”赶时间&#xff0c;能不能办不由主办方说了算。这种情况在2023年得到了改善&#xff…

【字典树】【KMP】【C++算法】3045统计前后缀下标对 II

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 字符串 字典树 KMP 前后缀 LeetCode:3045统计前后缀下标对 II 给你一个下标从 0 开始的字符串数组 words 。 定义一个 布尔 函数 isPrefixAndSuffix &#xff0c;它接受两个字符串参数 str1 和 str2 &#xff1a; 当 st…

C++——内存管理(new和delete)详解

目录 C/C内存管理 案例&#xff1a;变量在内存中到底会在哪&#xff1f; New和delete Operator new和operator delete函数 New和delete的原理 对内置类型 对自定义类型 定位new New/delete和malloc/free的区别 C/C内存管理 C/C内存管理分布图&#xff1a;&#xff08;从…

项目案例:图像分类技术在直播电商中的应用与实践

一、引言 在数字化浪潮的推动下&#xff0c;电商行业迎来了一场革命性的变革。直播电商&#xff0c;作为一种新兴的购物模式&#xff0c;正以其独特的互动性和娱乐性&#xff0c;重塑着消费者的购物习惯。通过实时的直播展示&#xff0c;商品的细节得以清晰呈现&#xff0c;而互…

matlab:涉及复杂函数图像的交点求解

matlab&#xff1a;涉及复杂函数图像的交点求解 在MATLAB中求解两个图像的交点是一个常见的需求。本文将通过一个示例&#xff0c;展示如何求解两个图像的交点&#xff0c;并提供相应的MATLAB代码。 画出图像 首先&#xff0c;我们需要绘制两个图像&#xff0c;以便直观地看…

【JavaEE】_HttpServletResponse类

目录 1. 核心方法 2. 关于setStatus(400)与sendError 2.1 setStatus(400) 2.2 sendError 3. setHeader方法 4. 构造重定向响应 4.1 使用setHeader和setStatus实现重定向 4.2 使用sendRedirect实现重定向 本专栏已有文章介绍HttpServlet和HttpServletRequest类&#…

仿真科普|CAE技术赋能无人机 低空经济蓄势起飞

喝一杯无人机送来的现磨热咖啡&#xff1b;在拥堵的早高峰打个“空中的士”上班&#xff1b;乘坐水陆两栖飞机来一场“陆海空”立体式观光……曾经只出现在科幻片里的5D城市魔幻场景&#xff0c;正逐渐走进现实。而推动上述场景实现的&#xff0c;就是近年来越来越热的“低空经…

前端开发——ElementUI组件的使用

文章目录 1. Tabs标签页2. 单选框 el-radio3. 复选框 el-checkbox4. 下拉框 el-select5. 表格 el-table6. 对话框 el-dialog7. 文字提示 el-tooltip8. 抽屉 el-drawer 1. Tabs标签页 <template><el-tabs v-model"activeName" tab-click"handleClick&q…

如何实现WordPress后台显示文章、分类目录、标签等的ID?

我们平时在使用WordPress的过程中&#xff0c;偶尔需要用到文章的ID&#xff0c;或分类目录ID&#xff0c;或标签ID&#xff0c;或媒体库ID&#xff0c;或评论ID&#xff0c;或用户ID等&#xff0c;但是WordPress后台默认是不显示它们的ID的。 今天boke112百科就跟大家分享如何…

聚观早报 | 爱奇艺2023年Q4财报;苹果将加大AI投入

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 3月1日消息 爱奇艺2023年Q4财报 苹果将加大AI投入 意大利正与多家车企谈判 多家企业与百度达成合作 比亚迪宋PL…

SDR架构 (一)为什么基带有I和Q路?

我之前做过自己的RTL-SDR。一直有一个疑惑。为啥rtl2832u芯片有一对差分I路&#xff0c;还有一对差分Q路。差分很好理解是为了抗干扰&#xff0c;但为啥要I和Q呢&#xff1f;并且我也知道不少人在自己修改的时候&#xff0c;保留I路对接在r820t2&#xff08;跟原版一样&#xf…

逆变器专题(12)-弱电网

相应仿真原件请移步资源下载 通常情况下&#xff0c;理想电网都为强电网&#xff0c;但随着光伏并网系统的大力发展&#xff0c;分布式光伏也越发鼎盛&#xff0c;越来越多的电力电子设备接入大电网、并且考虑能源利用问题&#xff0c;大部分光伏电站都建在戈壁沙漠等地区&…

多行业万能预约门店小程序源码系统 支持多门店预约小程序 带完整的安装代码包以及搭建教程

随着消费者对于服务体验要求的不断提升&#xff0c;门店预约系统成为了许多行业提升服务质量、提高运营效率的重要工具。然而&#xff0c;市面上的预约系统往往功能单一&#xff0c;无法满足多行业、多场景的个性化需求。下面&#xff0c;小编集合了多年的行业经验和技术积累&a…

岩土工程中的振弦采集仪技术发展与前景展望

岩土工程中的振弦采集仪技术发展与前景展望 河北稳控科技振弦采集仪是一种常用的岩土工程监测仪器&#xff0c;用于测量土壤或岩石的振动特性。随着岩土工程领域的发展和技术的进步&#xff0c;振弦采集仪技术也得到了不断的发展和改进。以下是对振弦采集仪技术发展与前景的展…

css5定位

css 一.定位1.概念&#xff08;定位定位模式边位移&#xff09;2.静态位移static&#xff08;不常用&#xff09;3.相对定位relative&#xff08;不脱标&#xff09;&#xff08;占位置&#xff09;4.绝对定位absolute&#xff08;脱标&#xff09;&#xff08;不占位置&#x…

VScode 单步断点调试Nodejs方法总结

目录 方法一 方法二 方法三 方法一 使用vscode开发nodejs程序,能够启动单步调试模式,在指定代码处添加断点,像chrome、firefox浏览器上一样进行JavaScript的调试。 新建一个nodejs的工程,编写代码后,配置代码调试的步骤: 1、切换到代码调试界面 2、界面提示,新建一…

基于springboot实现在线考试系统项目【项目源码+论文说明】

基于springboot实现在线考试系统演示 摘要 时代在变化&#xff0c;科技技术以无法预测的速度在达到新的高度&#xff0c;并且被应用于社会生活的各个领域&#xff0c;随着生活的加快&#xff0c;也使很多潜在的点逐渐突显出来&#xff0c;社会对于人才的要总是非常迫切的&…

IDEA-DeBug理论与实践

文章目录 01_Debug简介和意义02_IDEA中的Debug步骤03_跳转到当前代码执行的行04_步过调试的使用05_步入调试的使用06_强制步入调试的使用07_步出调试的使用08_回退断点调试的使用09_运行到光标处10_计算表达式11_条件断点12_多线程调试 在软件开发中&#xff0c;IDEA&#xff0…

THINKPHP 跨域报错解决方案

报错&#xff1a;has been blocked by CORS policy: Response to preflight request doesnt pass access control check: No Access-Control-Allow-Origin header is present on the requested resource. 环境&#xff1a;thinkphp6 nginx 今天和VUE配合调用接口的时候发现跨…

果园预售系统|基于Springboot的果园预售系统设计与实现(源码+数据库+文档)

果园预售系统目录 目录 基于Springboot的果园预售系统设计与实现 一、前言 二、系统功能设计 三、系统功能设计 1 、果园管理 2、水果管理 3、果树管理 4、公告管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获…