в нашем предыдущем упражнении мы построили расширение браузера с помощью TypeScript. Это включало серию шагов, в том числе создание проекта Vite и настройка его для удовлетворения конкретных требований расширений браузера. Хотя процесс не был особенно длительным или сложным, мы можем упростить его, автоматизируя его с помощью Node CLI (интерфейс командной строки). Если вы новичок в CLI, позвольте мне пройти вас через тот, который я создал!
], естественно, первый шаг - инициализация и настроить наш проект узла. Используйте следующие команды, чтобы создать папку для нашего кода и сгенерировать базовый файл package.json:
mkdir create-browser-extension-vite && cd create-browser-extension-vite npm init --yes]
Далее я решил изменить сгенерированный пакет. При этом мы сообщим 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" }]
начнем с создания файла с именем create-project в новой папке с именем bin :
]
#!/usr/bin/env node console.log("hello world");]
Этот файл будет действовать как точка входа для вашей команды и убедиться, что он может быть REN напрямую на вашем компьютере, как только пакет установлен во всем мире, добавьте следующее поле в Package.json:
"bin": "bin/create-project"]
теперь пришло время проверить то, что мы построили до сих пор. Сначала мы устанавливаем пакет локально, работая:
]
npm link create-browser-extension-vite // execute the CLI]
, однажды связанная, у вас будет новая команда CLI под названием Create-Browser-Extension-Vite, которая в настоящее время печатает на консоли «Hello World».
]и это все, что нужно, чтобы создать базовый CLI! Отсюда вы можете использовать всю мощность экосистемы узла, чтобы построить все, что вы можете себе представить.
давайте сделаем еще один шаг к нашей цели! Цель этого CLI - генерировать полностью функциональное расширение браузера TypeScript с помощью одной команды. Для этого CLI примет несколько дополнительных параметров.
]
первый шаг - создать новый файл, src/cli.js, который будет обрабатывать всю логику для сбора пользовательских предпочтений. Этот новый модуль будет вызван из текущего create-project file:
]
#!/usr/bin/env node import { cli } from "../src/cli.js"; cli(process.argv);]
, чтобы упростить процесс сбора пользовательских предпочтений, мы будем использовать две полезные библиотеки:
npm install @inquirer/prompts arg]
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 должен отобразить простое руководство, объясняющее использование команды. Вы можете ссылаться на мое решение в репозитории, связанном ниже.
]на этом этапе проект будет создан на основе предпочтений, выбранных на предыдущем этапе. Мы начнем с создания папки с именем шаблона и копирования в него файлов, которые составляют сгенерированный проект.
]структура папок должна выглядеть так, и вы можете найти содержимое этих файлов в моем репозитории GitHub. Если вам интересно, как они были созданы, ознакомьтесь с моим предыдущим постом, где я обсуждаю создание расширения браузера с TypeScript.
]
Наш код будет использовать файлы в папке шаблона для создания нового расширения пользователя, и следующие пакеты будут особенно полезны для выполнения этого:
]
npm install ncp chalk execa pkg-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. Также обратите внимание, как мы использовали Speakify для преобразования метода копирования на основе обратного вызова в функцию, основанную на обещаниях, что делает код более читаемым и поддерживаемым.
]и это все! Это те шаги, которые я выполнил, чтобы создать свой новый инструмент CLI, который я буду использовать для оптимизации создания моих новых расширений браузера. Вы тоже можете использовать это! Потому что я опубликовал его на NPM, чтобы кто -либо мог генерировать свои собственные расширения.
]https://github.com/ivaneffable/create-browser-extension-vite
]как построить CLI с node.js
] ] ]Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3