написать впереди
Эта статья относительно проста, в основном с концепцией процесса. Вторая пуля вышла:портал
эффект каштана
Концепция строительных лесов
Так называемый скаффолдинг, на мой взгляд, представляет собой интегрированные процессы инициализации, отладки, сборки, тестирования, развертывания и других проектов, позволяющие пользователям сосредоточиться наcode
Инструмент. Говоря простым языком, здание уже построено, осталось только добавить кирпичи.
Полные леса обычно включают в себя три аспекта:
- Командный скрипт скаффолдинга: Нам нужно установить глобальный скаффолдинг, с помощью которого мы можем легко начать разработку проекта. (также цель этой статьи)
-
scripts
Пакет: Как правило, мы упаковываем, компилируем, тестируем и читаем пользовательские файлы конфигурации (такие какwebpack
связанные операции настройки, содержимое, связанное с локальным сервером и т. д.), сделанные отдельноnpm
Мешок. Пусть пользователям не нужно заботиться об этих операциях, сосредоточьтесь наcode
. - Файл шаблона: очевидно, что при инициализации проекта извлекается содержимое проекта.
Общие строительные леса каштаны:
create-react-app
vue-cli
- ...
Новый проект
$ mkdir project && cd project
$ npm init -y
существуетpackage.json
файл, добавитьbin
поле
{
//...
"bin": {
"hello": "./index.js"
},
//...
}
bin
Функция в том, что официальный сайт объясняет это так:
много
npm
Пакеты имеют один или несколько для установки вPATH
исполняемый файл в формате .package.json
предоставить поле вbin
, который представляет собой сопоставление имен команд с именами локальных файлов. Во время установкиnpm
будет символически ссылаться на файлprefix/bin
для глобальной установки или./node_modules/.bin/
Установить локально.
Грубо говоря, при установке он создаст快捷方式
,пройти через快捷方式
Можно использовать для удобстваnode
команда скрипта. Вот почему мы можем открыть командную строку напрямую и случайно, черезcra
способ создания проекта.
и соответствующийindex.js
файл, должен начинаться с#!/usr/bin/env node
.usr/bin/env
сказал идтиPATH
Найдите интерпретатор сценариев в каталоге и укажите использованиеnode
для выполнения файла.
#!/usr/bin/env node
console.log('hello world!');
затем пройтиnpm link
, создать симлинк в глобале, поставитьpackage.json
внутреннийbin
Содержимое поля отображается и связывается.
$ npm link
тогда его можно использовать прямо в любом местеhello
Заказ.
работа с командной строкой
Здесь я используюcommander.js
прочитать команду.
Заказ
const program = require('commander');
program
.command('create <name>')
.description('请输入项目名称')
.action(name => {
console.log(`你要创建的项目名称:${name}`);
});
program.parse(process.argv);
.command()
Первый параметр может настроить имя команды и параметры.Параметры поддерживают обязательные (обозначаются угловыми скобками), необязательные (обозначаются квадратными скобками) и параметры переменной длины (обозначаются точками, если используется, только последний параметр).
подсказка версии
общий какcreate-react-app -V
, который обычно читается самостоятельноpackage.json
серединаversion
поле, затем используйтеprogram.version
.
const program = require('commander');
const packageJson = require('./package.json');
program.version(packageJson.version);
справочная информация
help
даcommander.js
Автоматически генерируется на основе кода, вариант справки по умолчанию-h
,--help
.
Затем я кратко расскажу о некоторых рутинных операциях, о других операциях вы можете узнать в официальной документации, здесь я не буду подробно останавливаться.
проблема взаимодействия
Многие леса взаимодействуют с пользователями, когда они используются. Это можно сделать с помощьюinquirer.js
использовать.
//...
const answer = await inquirer.prompt([
{
type: 'input',
name: 'name',
message: '请输入项目名称',
},
]);
оперативная обратная связь
После выполнения команды скрипта в командной строке обычно появляются дружественные подсказки, например:loading
,success
,error
и т.п. Это можно использоватьora
const ora = require('ora');
const loading = ora('Loading unicorns');
loading.text = '疯狂加载中';
loading.color = 'green';
loading.start();
Также напримерcolors
,chalk
Подождите, я не буду объяснять это по одному.
Вытащите файл шаблона
Наиболее важной частью формирования шаблонов является извлечение различных файлов шаблонов на основе пользовательского ввода. Например, я ввожу выбор языкаtypescript
, то вытащенный файл шаблона естественно поддерживаетсяtypescript
Да, эта часть используетdownload-git-repo
.
download-git-repo
Поддержка трех платформ для загрузки:
-
GitHub
-github:owner/name
orowner/name
-
GitLab
-gitlab:owner/name
-
Bitbucket
-bitbucket:owner/name
Он также поддерживает#
Чтобы вытащить код на разные ветки, конечно, по умолчаниюmaster
. Затем мы можем получать различные типы данных непосредственно через пользовательский ввод.branch
Приведенный выше код используется для извлечения различных файлов шаблонов. (Или просто создайте несколько складов и используйте разные коды складов).
const download = require('download-git-repo');
const downloadAdress = lang => `owner/name#${LANG_LIST[lang]}`;
program
.command('create')
.description('初始化项目')
.action(async () => {
const answer = await inputer.prompt([
//...
{
type: 'list',
message: '使用哪种语言进行开发',
name: 'lang',
choices: ['typescript', 'javascript'],
},
]);
download(
downloadAdress(answer.lang),
`./${answer.name}`, // path
downloadCallback.bind(null, answer), // callback
);
});
Изменить package.json
Из-за извлеченного файла шаблонаpackage.json
Все фиксировано. И большинство скаффолдов заменяются в соответствии с пользовательским вводом во время инициализации.package.json
Соответствующее поле среды.
Это операция чтения и записи файла черезreadFileSync
Прочитайте содержимое файла, замените соответствующие поля и перезапишите.
const filename = `${answer.name}/package.json`;
if (fs.existsSync(filename)) {
let newPagJson = fs.readFileSync(filename).toString();
newPagJson = JSON.parse(newPagJson);
newPagJson = {...newPagJson, ...answer};
newPagJson = JSON.stringify(newPagJson, null, '\t');
fs.writeFileSync(filename, newPagJson);
//...
}
использоватьstringify
другие параметры будутnewPagJson
Форматирование так, чтобы оно перезаписывалось, также является правильным.
выпускать
После завершения разработки мы обычно выбираем публикацию наnpm
на платформе.
Процесс публикации также прост:
npm login
-
npm publish
, не забудьте обновитьversion
удалить пост
Потому что каждый раз, когда выпускается обновление, оно будетnpm
сохранить его в истории, если вы хотите удалить определенный или весьnpm
пакет, вы можете использоватьnpm unpublish
.
Он также очень прост в использовании
$ npm unpublish [<@scope>/]<pkg>@<version>
$ npm unpublish [<@scope>/]<pkg> --force
Первый означает удаление версииnpm
пакет, сразу после удаленияversion
больше нельзя использовать или переиздаватьversion
.
Последнее означает удаление всегоnpm
пакет, необходимый после удаления24
часов до повторной публикации.
Проверить наличие обновлений
После выпуска скаффолдинга некоторые пользователи могут не обновляться вручную.Если нет функции подсказки, они могут не выбрать обновление. Затем мы можем оценить, соответствует ли последняя версия текущей версии при использовании шаблона, и решить, запрашивать ли обновление.
Поскольку для извлечения версии требуется время, это, как правило, интервальная оценка.
Здесь я сохраняю последнее время растяжения, и разница между текущей временной меткой и последней извлеченной временной меткой определяется, нужно ли оценивать это время.
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
const resolve = _path => path.join(__dirname, _path);
const timePath = resolve('index.txt');
const MAX_TIME = 86400000;
const checkTime = () => {
const lastTime = +fs.readFileSync(timePath).toString();
const nowTime = new Date().getTime();
if (lastTime && nowTime - lastTime <= MAX_TIME) {
return;
}
fs.writeFileSync(timePath, nowTime);
const lastV = execSync('npm view yourNpmPackage version', { encoding: 'utf8' });
return lastV;
};
На самом деле это предполагаетnode
базовыйapi
работать. если правильноnode
Если вы не знакомы с ним, вы можете прочитать большеnode
документации по мере разработки строительных лесов, иnode
тесно связаны.
Вышеупомянутое содержание, по сути, все еще является базовым упражнением.
У меня также была идея в свободное время на этой неделе, и я решил сам сделать строительные леса, чтобы изучить их во время обзора. После этого я постараюсь его максимально улучшить, и если в будущем появится новый контент, я им тоже поделюсь.