前端架构: 脚手架之包管理工具的案例对比及workspaces特性的使用与发布过程

npm的workspaces 特性


1 )使用或不使用包管理工具的对比

  • vue-cli 这个脚手架使用 Lerna 管理,它的项目显得非常清晰
  • 在 vue-cli 中包含很多 package 点开进去,每一个包都有package.json
  • 它里面有很多项目,再没有 Lerna 之前去维护和管理这么多包是会非常困难的
  • 而 webpack 至今还没有用任何的包管理工具,在其 lib 下会有非常多的模块
  • 而且它还自己写了很多脚本来进行管理各种功能
  • 同上上述正反两个例子,可见,不使用包管理工具,整个项目维护起来会很麻烦
  • 比如说你想去给 webpack 做一些贡献,很麻烦很困难,因为你不太清楚,你的改动对整体一个影响
  • 如果使用包管理以后,它就会拆的很清楚,你的改动就是聚合在一个package里面的,这个就是用包管理一些好处
  • 包管理目前流行的两种方式是 workspaces 和 Lerna

2 )workspaces 的基本使用

  • 在一个脚手架项目中,比如xyzcli项目中(之前一直用这个脚手架演示)创建workspaces 目录
    • $ mkdir workspaces && cd workspaces
  • 在 workspaces 目录中执行
    • $ npm init -y
    • 其实,在使用 npm init 的过程中,通过 $ npm init --help
    • 可以看到 Options 中存在 [-w|--workspace <workspace-name> [-w|--workspace <workspace-name> ...]]
    • 也就是 -w 的参数, 比如:$ npm init -w a -w b 默认一路回车
    • 这样,就会在 workspaces 目录下新建了两个包:a 和 b,每个包中,都存在package.json,其name属性分别为 a 和 b
    • 在 workspace/node_modules下 生成a和b的两个软链
    • 在 workspace/package.json 中,存在 workspaces 的配置
      "workspaces": ["a","b"
      ]
      
  • 好,现在结构基本搭建完成,现在我要在 workspaces 目录对a包进行安装依赖
    • $ npm i vue -w a
    • 这时候,a包中安装了 chalk 的依赖,但是a包中没有生成 node_modules 目录
    • 在 workspaces 目录下的 node_modules 中安装了 chalk, 而 a 的 package.json 中的 dependencies 是 chalk
    • 同时,b包中的package.json中是没有的
  • 这是 workspace 非常有意思的特性,它把各个内层包的依赖抽象到了最外层来进行管理
  • 这里借助了 commonjs 中对 node_moduels 查找的特性,如果当前查找不到,去上一层目录中去查找
  • 由于此特性,可以通过最外层来管理依赖包,这样的好处是非常明显的
  • 现在在a包中使用chalk, 在package.json中添加 "type": "module" 在 a/index.js 中编写
    import  chalk from 'chalk';export default {print() {console.log(chalk.red('Hello workspace'))}
    }
    
  • 现在继续修改 a/package.json 中的 name属性,修改为:“@somegroup/a”
  • 这时候,a包就会在后续发布中,自动在 somegroup 分组中了,这个 somegroup 可以是自己起的任意组名
  • 好现在在workspaces目录中新增一个具有cli功能的包,比如就叫做 cli 这个脚手架包
  • $ npm init -w cli 一路回车, 创建了 cli 这个脚手架包
  • 将 cli 包的 package.json 目录中的name属性改成和a包同组,如:"name": "@somegroup/cli"
  • 同时在 workspaces/cli 的package.json中添加 bin 属性
    {"bin": {"cli": "bin/cli.mjs"}
    }
    
  • 因为这时候 cli 脚手架包的 name 不是在一开始创建的,而是一路回车之后,要确定和a同组的,需要执行下 $ npm i -ws 来更新下分组
    • 这时候可以看到 workspaces/node_modules/@somegroup/下存在 a 和 cli 两个软链
    • 同时,可以删除 workspaces/node_modules/cli 这个软链
  • 这时候,想要在 cli 这个脚手架包中引用 a包来调试,需要 在 workspaces 目录下执行
    • $ npm i @somegroup/a -w cli
    • 这时候,会在 cli 脚手架目录中添加了 @somegroup/a 这个 dependencies
  • 新建 bin/cli.mjs 编写
    #!/usr/bin/env nodeimport * as a from '@somegroup/a'const { print } = a.default;
    print();
    
  • 最后,可以将 这个 cli 工具在workspaces下配置使用, 因为在 workspace/node_modules/.bin 下有这个cli的软链
  • 所以在 workspaces/package.json 中添加配置
    "scripts": {"cli": "cli"
    },
    
  • 这时候在 workspaces 下执行 $ npm run cli, 这样,我们的脚手架就可以直接使用了,如下图
  • 以上就是使用 workspace 来进行包的管理,这里生成了3个包,其中包a和包cli都在@somegroup组下

  • 这里演示了脚手架包cli如何使用包a,在不发布的场景下进行调试,并且对cli包本地的调试

  • 同时,可以参考之前的文章:https://blog.csdn.net/Tyro_java/article/details/136112045

  • 好,现在发布之前, 还需要处理一下b包,毕竟建立这个包是有用的,不在远程发布有问题的包

  • 将b包的name修改成 "name": "@somegroup/b", 目前这三个包都在 @somegroup 组中了

  • 在b中新建 index.js, 在b/package.json中同步"main": "index.js", 并添加 "type": "module"

  • 给b包安装 ora 依赖,在 workspaces 目录下执行 $ npm i ora -w b

  • 编写 b/index.js

    import ora from 'ora';export default function() {const spinner = ora().start('loading');setTimeout(() => {spinner.stop();}, 3000)
    }
    
  • 因为修改了 b 的package.json的name属性,需要同步下 $ npm i -ws

  • 并且注意删除下之前 workspaces/node_modules/b 这个叫b的软链

  • 好,现在b包作为工具库为 cli 脚手架提供方法,为cli安装b包, 回到 workspaces 目录下

  • 执行 $ npm i @somegroup/b -w cli, 修改 cli/bin/cli.js 文件

    #!/usr/bin/env nodeimport a from '@somegroup/a'
    import bLoading from '@somegroup/b'const { print } = a;print();console.log('----------');bLoading();
    
  • 这时候万事俱备了,就可以发布上线了, 在 worksapces 目录中

    • npm publish -ws 发布所有 workspace 包内容,这个是全部包发布的举例
    • npm publish -w a 发布a包,这个是单个包发布的举例
  • 注意,如果包存在发布报错,可能是因为权限问题,可修改对应包的package.json

    {"publishConfig": {"access": "public"}
    }
    
  • 这样就顺利发布成功了,注意,Lerna 使用时会帮助我们考虑到这一点,Lerna 会省事一些

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

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

相关文章

代码随想录算法训练营第四天

● 自己看到题目的第一想法 24.两两交换链表中的节点 方法&#xff1a;虚拟头节点 思路&#xff1a; 设置虚拟头节点dummyhead 设置临时指针cur dummyhead; cur每次向前移动两步 循环条件&#xff1a; cur ! nullptr && cur->next ! nullptr && cur->…

ntp时钟服务安装- 局域网节点时间同步

场景&#xff1a; 一般部署大数据相关应用服务&#xff0c;各个节点之间需要时间同步&#xff1b;内网情况下&#xff0c;很可能各节点之前时间可能不一致&#xff0c;或者过一段时间后 又不一致了 ntp 时钟服务器&#xff1a; 可用于内网各个节点之前得时间同步&#xff0c;安…

MATLAB环境下使用相关图可视化相关矩阵

为了处理各行各业中出现的高维数据&#xff0c;迫切需要寻找适用的统计学方法。大维随机矩阵理论是处理高维数据的理论工具之一&#xff0c;在高维统计分析中&#xff0c;表现出良好的性能并有着广泛的应用。 二十世纪四十年代和五十年代初期&#xff0c;大维随机矩阵理论起源…

前端,测试,后端,该如何选择?

前端开发&#xff0c;测试&#xff0c;后端&#xff0c;该如何选择&#xff1f;说实话&#xff0c;只要对互联网行业有了解的&#xff0c;都会推荐你学测试。 首先必须声明&#xff0c;能在前端开发、测试、后端&#xff08;主要是Java&#xff09;这三个岗位中进行选择&#…

【Intel oneAPI实战】使用英特尔套件解决杂草-农作物检测分类的视觉问题

目录 一、简介&#xff1a;计算机视觉挑战——检测并清除杂草二、基于YOLO的杂草-农作物检测分类2.1、YOLO简介2.2、基于YOLO的杂草-农作物检测分类解决方案 三、基于YOLO的杂草-农作物检测分类系统设计3.1、基于flask框架的demo应用程序后端3.2、基于Vue框架的demo应用程序前端…

Unity 使用脚本获取组件,代码生成预制体

代码获取组件 using System; using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine;// 必须要继承 MonoBehaviour 才是一个组件 // 类名必要与文件名一致public class c1 : MonoBehaviour {// 使用 public 初始变量时…

day09_面向对象_构造方法_封装

今日内容 零、 复习昨日 一、构造方法 二、重载 三、封装 零、 复习昨日 1 类和对象是什么关系? 类是模板(原材料)对象是具体实例(成品)类创建出对象 2 类中有什么?(类的成员) 成员属性(成员变量), 成员方法 3 创建对象的语法? 类名 对象名 new 类名(); 4 调用对象属性,方法…

Go开发 入门以VSCode为例

一、Go环境搭建 1.1 安装 进入Golang官网 https://go.dev&#xff0c;点击 Download 若无法打开网页可以使用国内的Go语言中文网 https://studygolang.com/dl 进入下载 找到合适的平台点击链接下载即可&#xff08;这里以Windows距离&#xff09; 下载完成后 Next Next 安…

js 对象总结

文章目录 1、创建对象的6种方式总结一、new 操作符 Object 创建对象二、字面式创建对象 2、js 如何判断对象是否为空3、获取对象长度4、js 遍历对象的 5 种方法1、for … in2、Object.keys(obj)3、Object.values(obj)4、Object.getOwnPropertyNames(obj)5、使用Reflect.ownKey…

C# OpenVINO Nail Seg 指甲分割 指甲检测

目录 效果 模型信息 项目 代码 数据集 下载 C# OpenVINO Nail Seg 指甲分割 指甲检测 效果 模型信息 Model Properties ------------------------- date&#xff1a;2024-02-29T16:41:28.273760 author&#xff1a;Ultralytics task&#xff1a;segment version&#…

VirtualBox虚拟机安装 Linux 系统

要想学习各种计算机技术&#xff0c;自然离不开Linux系统。并且目前大多数生产系统都是安装在Linux系统上。常用的Linux系统有 Redhat&#xff0c;Centos&#xff0c;OracleLinux 三种。 三者的区别简单说明如下&#xff1a; Red Hat Enterprise Linux (RHEL): RHEL 是由美国…

InnoDB锁介绍

本文主要介绍MySQL InnoDB引擎中的各种锁策略和锁类别&#xff0c;并针对记录锁做演示以便于理解。 以下内容适用于MySQL 8.0版本。 读写锁 处理并发读/写访问的系统通常实现一个由两种锁类型组成的锁系统。这两种锁通常被称为共享锁(shared lock)和排他锁(exclusive lock)&…