创建 CLI 来搭建扩展

在之前的练习中,我们使用 typescript 构建了一个浏览器扩展。这涉及一系列步骤,包括创建 vite 项目并对其进行定制以满足浏览器扩展的特定要求。虽然该过程并不是特别漫长或复杂,但我们可以通过使用 node cli(命令行界面)实现自动化来进一步简化它。如果您是 cli 新手,请让我引导您完成我创建的 cli!

创建节点项目

当然,第一步是初始化和设置我们的 node 项目。使用以下命令为我们的代码创建一个文件夹并生成一个基本的 package.json 文件:

mkdir create-browser-extension-vite && cd create-browser-extension-vitenpm init --yes

接下来,我决定修改生成的 package.json 以包含“type”:“module”。这样我们将通知 node 将项目中的 .js 文件解释为 es 模块而不是 commonjs 模块。这是经过一些调整后更新的 package.json。

{  "name": "create-browser-extension-vite",  "version": "1.0.0",  "scripts": {    "test": "echo "error: no test specified" && exit 1"  },  "publishconfig": {    "access": "public"  },  "keywords": [      "cli",    "create-project"  ],  "author": "",  "license": "isc",  "description": "a cli tool to create browser extensions with vite",  "type": "module"}

第一步

让我们首先在名为 bin 的新文件夹中创建一个名为 create-project 的文件:

#!/usr/bin/env nodeconsole.log("hello world");

此文件将充当您的命令的入口点,并确保在全局安装软件包后可以直接在您的计算机上运行,请将以下字段添加到 package.json:

"bin": "bin/create-project"

现在是时候测试我们迄今为止构建的内容了。首先,我们通过运行以下命令在本地安装软件包:

npm linkcreate-browser-extension-vite // execute the cli 

链接后,您将拥有一个名为 create-browser-extension-vite 的新 cli 命令,该命令目前仅将“hello world”打印到控制台。

这就是创建基本 cli 所需的全部!从这里,您可以利用 node 生态系统的全部力量来构建您可以想象的任何东西。

处理用户输入

让我们向目标再迈进一步!此 cli 的目标是使用单个命令生成功能齐全的 typescript 浏览器扩展。为了实现这一点,cli 将接受几个可选参数。

创建 CLI 来搭建扩展

name:如果提供,将创建具有指定名称的文件夹。否则,当前文件夹将包含该项目。git:如果指定,将为项目初始化一个 git 存储库。install:如果指定,将自动安装项目依赖项。yes:跳过所有提示并使用默认设置生成项目。

第一步是创建一个新文件 src/cli.js,它将处理收集用户首选项的所有逻辑。这个新模块将从当前的 create-project 文件中调用:

#!/usr/bin/env nodeimport { cli } from "../src/cli.js";cli(process.argv);

为了简化收集用户偏好的过程,我们将使用两个有用的库:

npm install @inquirer/prompts arg

arg:一个强大的参数解析器,用于处理命令行输入。@inquirer/prompts:用于创建优雅的交互式命令行界面的库。

import arg from "arg";import { confirm } from "@inquirer/prompts";async function promptformissingoptions(options) {  if (options.skipprompts) {    return options;  }  return {    ...options,    git:      options.git ||      (await confirm({ message: "initialize a git repository?" })),  };}function parseargumentsintooptions(rawargs) {  const args = arg(    {      "--git": boolean,      "--help": boolean,      "--yes": boolean,      "--install": boolean,      "-g": "--git",      "-y": "--yes",      "-i": "--install",    },    {      argv: rawargs.slice(2),    }  );  return {    skipprompts: args["--yes"] || false,    git: args["--git"] || false,    runinstall: args["--install"] || false,    projectname: args._[0],  };}export async function cli(args) {  let options = parseargumentsintooptions(args);  options = await promptformissingoptions(options);  console.log(options);}

我将让您添加一个额外的选项来显示基本帮助消息。这将涉及引入由 –help 或 -h 参数控制的新用户首选项。如果提供此参数,cli 应显示一个简单的手册来解释该命令的用法。您可以在下面链接的存储库中参考我的解决方案。

创建项目

在此步骤中,将根据上一阶段选择的首选项创建项目。我们将首先创建一个名为 template 的文件夹,并将构成生成项目的文件复制到其中。

文件夹结构应该如下所示,您可以在我的 github 存储库中找到这些文件的内容。如果您对它们是如何创建的感到好奇,请查看我之前的文章,其中我讨论了使用 typescript 构建浏览器扩展。

创建 CLI 来搭建扩展

我们的代码将利用模板文件夹中的文件来生成用户的新浏览器扩展,以下包在实现此目的时特别有用:

npm install ncp chalk execa pkg-install listr

ncp:促进文件的递归复制。chalk:添加终端字符串样式。execa:简化运行 git 等外部命令。pkg-install:根据用户的偏好自动触发yarn install或npm install。listr:允许定义任务列表,同时为用户提供清晰的进度概述。

我们将首先创建一个新文件 src/main.js,以包含通过从模板文件夹复制文件来生成项目的代码。

import { createproject } from "./main.js";...export async function cli(args) {  let options = parseargumentsintooptions(args);  options = await promptformissingoptions(options);  await createproject(options);}
import chalk from "chalk";import ncp from "ncp";import path from "path";import { promisify } from "util";import { execa } from "execa";import Listr from "listr";import { projectInstall } from "pkg-install";const copy = promisify(ncp);async function copyTemplateFiles(options) {  return copy(options.templateDirectory, options.targetDirectory, {    clobber: false,  });}async function initGit(options) {  const result = await execa("git", ["init"], {    cwd: options.targetDirectory,  });  if (result.failed) {    return Promise.reject(new Error("Failed to initialize git"));  }  return;}export async function createProject(options) {  options = {    ...options,    targetDirectory: options.projectName || process.cwd(),  };  const currentFileUrl = import.meta.url;  const templateDir = path.resolve(    new URL(currentFileUrl).pathname,    "../../template"  );  options.templateDirectory = templateDir;  const tasks = new Listr([    {      title: "Copy project files",      task: () => copyTemplateFiles(options),    },    {      title: "Initialize git",      task: () => initGit(options),      enabled: () => options.git,    },    {      title: "Install dependencies",      task: () =>        projectInstall({          cwd: options.targetDirectory,        }),      skip: () =>        !options.runInstall          ? "Pass --install to automatically install dependencies"          : undefined,    },  ]);  await tasks.run();  console.log("%s Project ready", chalk.green.bold("DONE"));  return true;}

上面的代码利用 listr 执行生成新项目所需的一系列操作,从使用 ncp 复制文件到设置 git 存储库。另请注意我们如何使用 promisify 将 ncp 的基于回调的复制方法转换为基于 promise 的函数,使代码更具可读性和可维护性。

就是这样!这些是我创建新 cli 工具时遵循的步骤,我将使用该工具来简化新浏览器扩展的创建。你也可以用它!因为我已将其发布在 npm 上,供任何人生成自己的扩展。

https://github.com/ivaneffable/create-browser-extension-vite

参考

如何使用 node.js 构建 cli

以上就是创建 CLI 来搭建扩展的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1498753.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 20:44:07
下一篇 2025年12月12日 20:51:13

相关推荐

  • 未定义与未定义

    首先,我们需要了解 javascript 代码执行过程,它由两个阶段组成:内存创建阶段和代码执行阶段。 “未定义”和“未定义”都与内存空间有关。 未定义 在内存创建阶段,变量和函数被存储为键值对。 javascript 将 undefined 分配给每个变量作为占位符。这个临时值会一直保留,直到 j…

    2025年12月19日
    000
  • 如何快速稳定访问GitHub?

    稳定快速访问 github 对于日常开发人员来说,访问 github 十分重要,但有时,除了科学上网之外,在日常环境中打开 github 会遇到困难,严重影响工作效率。 针对这一问题,除了使用科学上网工具外,还有一些方法可以帮助你快速稳定地访问 github。其中一种方法是修改 hosts 文件。 …

    2025年12月19日
    000
  • 如何快速稳定地访问GitHub?

    如何快速稳定地访问 github? github 是许多开发人员不可或缺的平台,但由于服务器位于国外,国内访问时经常会遇到网络不稳定的问题。除了使用科学上网工具外,还有其他方法可以快速稳定地访问 github。 修改 hosts 文件 可以通过修改设备的 hosts 文件来解决访问 github 的…

    2025年12月19日
    000
  • 开发人员如何快速稳定地访问GitHub?

    如何快速稳定地访问 GitHub 对于开发人员来说,访问 GitHub 至关重要。但是,由于防火墙或网络问题,有时无法稳定访问 GitHub,这会严重影响工作效率。 以下介绍了一些无需科学上网即可快速稳定访问 GitHub 的方法: 手动修改 hosts 文件 使用 DNS 查询工具(例如 http…

    2025年12月19日
    000
  • 每个开发人员都应该掌握提高生产力和发展的基本工具

    在快速发展的软件开发世界中,生产力和持续增长至关重要。开发人员选择的工具可以显着影响他们的效率、创造力和职业发展。每个开发人员都应该掌握以下五个基本工具,以在他们的技术中脱颖而出: 版本控制系统(例如 Git)版本控制系统是现代开发工作流程的支柱。 Git 是最受欢迎的选择,它允许开发人员跟踪更改、…

    2025年12月19日
    000
  • Acro-Design中arco-scripts源码在哪里?

    如何在 Acro-Design 中查找 arco-scripts 源码 在 Acro-Design 源码中,我们可以看到有 arco-scripts 的引用。然而,在查找时却发现只有 npm 包而没有源码。因此,我们不禁好奇,acro-scripts 是否更换了仓库? 经过一番搜索和探究,我们找到了…

    2025年12月19日
    000
  • 基于 IT 的热门 CMS 比较(截至 4 月 4 日)

    DecapCMS(以前的 Netlify CMS) 统计数据:16,700 个 GitHub 星星 • 每周约 4 万次下载 • 400 多名贡献者链接:GitHub • NPM • 文档技术堆栈:框架不可知 • TypeScript 部分增长:明星增长 15%,NPM 增长 20%(6 个月)最适…

    2025年12月19日
    000
  • Arco-Design中acro-scripts源码去哪儿了?

    Arco-Design 中 Acro-Scripts 源码寻踪 在使用 Arco-Design 时,你可能会注意到其源码中包含 acro-scripts。但是,当你尝试查找其源码时,却只找到了 npm 包,而没有找到源码文件。你是否想知道这是否意味着开发者已将仓库迁移到了其他地方? 经过一番搜索,答…

    2025年12月19日
    000
  • Arco-Design项目中acro-scripts源码在哪里?

    如何在 acro-design 项目中找到 acro-scripts 源码? 在 acro-design 源码中,开发人员注意到存在对 arco-scripts 的引用。然而,在尝试查找该源码时,他们发现只有 npm 包可用,而源码似乎已消失。这引发了一个疑问:是否已更换代码仓库? 经过一系列搜索,…

    2025年12月19日
    000
  • Arco-scripts源码去哪儿了?寻找Arco-Design组件库脚本的历程

    勾勒 Acro-Scripts 源码之旅:仓库探寻之旅 前言: 在 Acro-Design 的源码探索中,大家发现提及了 arco-scripts,然而寻找源码却只找到了 NPM 包。探究背后的原因,仓库是否发生了变动?让我们踏上寻觅 arco-scripts 源码之旅。 探索之路: 一番搜索后,我…

    2025年12月19日
    000
  • Arco-scripts源码去哪儿了?如何找到arco-scripts的源码?

    如何获取 Acro-Design 的 arco-scripts 源码 在浏览 Acro-Design 源码时,人们注意到其中包含对 arco-scripts 的引用。然而,在尝试查找该源码时,却只发现了一个 npm 包,源码仍然无迹可寻。因此引发了疑问,arco-scripts 是否已更换仓库? 经…

    2025年12月19日
    000
  • 掌握异步 JavaScript:回调、Promise 和简化的 Async/Await

    异步 javascript:从回调到 promise 和 async/await 介绍 javascript 是一种强大的单线程编程语言,广泛用于 web 开发。 javascript 中的一个常见挑战是处理异步任务,例如从 api 获取数据或执行时间敏感的操作,而不阻塞主线程。随着时间的推移,开发…

    2025年12月19日
    000
  • 掌握 TypeScript 模板文字类型:提高代码安全性和表现力

    好吧,让我们进入使用模板文字类型在 typescript 中进行编译时元编程的迷人世界。这个强大的功能使我们能够创建一些非常酷的类型级魔法,使我们的代码更安全、更具表现力。 首先,模板文字类型到底是什么?它们是一种基于字符串文字操作和创建新类型的方法。这就像拥有一种适合您类型的迷你编程语言。很整洁,…

    2025年12月19日
    000
  • 了解 Playwright:自动化 Web 测试的未来

    剧作家的定义 Playwright 是一个现代的开源测试框架,使开发人员能够以速度、可靠性和跨浏览器支持自动执行 Web 应用程序的端到端测试。它由 Microsoft 构建,解决了传统测试工具面临的许多挑战,为现代 Web 应用程序提供无缝自动化。 什么是剧作家? Playwright 是一个 N…

    2025年12月19日
    000
  • 使人才与业务目标保持一致:数据驱动的方法

    介绍 在快速发展的技术环境中,企业必须聘用不仅满足最低可行要求(MVR)而且还能通过机会领域为未来增长做出贡献的人才。在 TeamStation AI,我们采用数据驱动的方法来进行人才调整。本文探讨了我们如何使用数学模型使人才与业务目标保持一致,重点关注投资回报率和长期战略成功。 了解人才调整 最低…

    2025年12月19日
    000
  • VShell:生产发布工作流程

    本周,我准备将我的命令行工具 vshell 发布到生产环境。此版本将使用户能够直接通过 npm 安装和使用 vshell,而无需在本地克隆和构建项目。该工具使用 javascript 和 node.js 编写,将托管在 npm 上以便于分发。以下是我实现此版本所遵循的步骤的详细分解: 自动化构建过程…

    2025年12月19日
    000
  • React开发:Vite打包和zustand状态管理是最佳选择吗?

    React 生态圈中的打包和状态管理新技术 一位开发者抛出了一个问题,询问 React 社区最近是否有新的打包或状态管理技术值得关注。 打包技术 该开发者目前正在使用 Vite 作为构建工具,并打算抛弃 webpack。社区推荐了 Vite 社区提供的众多 React 模板,其中可以选择最简约的模板…

    2025年12月19日
    000
  • React开发:如何用Vite、React Router和Zustand构建高效应用?

    react 最新打造和状态管理技术 作为一名久经沙场的 React 开发者,最近重拾 React 已成为许多人的当务之急。随着技术的不断发展,了解当前社区的最佳实践至关重要。 打造:抛弃 Webpack,拥抱 Vite Vite 的部署生产能力已经得到验证,因此它已成为构建新项目的最佳选择之一。其快…

    2025年12月19日
    000
  • React开发新趋势:打包工具和状态管理方案该如何选择?

    React 新技术巡礼:打包与状态管理 作为一名长期使用 React 的开发人员,你回到这一领域时可能会面临新技术的选择。本文将探讨 React 生态系统中打包和状态管理领域的最新发展。 打包 你已经提到了 Vite,这是一种备受赞誉的替代品,以其出色的开发体验和生产就绪构建而闻名。在 Vite 社…

    2025年12月19日
    000
  • React开发新趋势:Vite打包和Zustand状态管理好用吗?

    react 社区的打包和状态管理新技术 提问者使用 React 已有四年经验,近期打算重新拾起 React 进行开发,希望了解社区内有哪些好用的打包和状态管理技术。以下是提问者提出的具体问题: 打包技术:是否推荐使用最新的 CLI 推荐?状态管理:在 Vite 环境下,有哪些推荐的替代方案? 回答:…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信