Как разработать красивый интерфейс командной строки (2)

Командная строка Vue.js React.js Webpack
Как разработать красивый интерфейс командной строки (2)

Эта статья была впервые опубликована на личномGithub, вопросы/fxxk приветствуются.

предисловие

В последней статье серии «Как разработать симпатичный интерфейс командной строки (1)» я рассказал вам, как разработать простой инструмент для формирования шаблонов, который генерирует, визуализирует и конвертирует шаблонные файлы (Boilerplate). Эта статья будет приятной продвинутой частью - как основываться наwebpackНапишите инструмент командной строки с нулевой конфигурацией (назовем егоlovely-cli.), для достижения следующих функций:

lovely-cli dev    # 以开发环境,webpack watch的模式启动一个应用
lovely-cli build  # 以生产环境的模式构建应用

Во-первых, я хочу еще раз подчеркнуть концепцию. Хотя у меня есть замечания в первой статье:

“由于脚手架的英文 scaffolding 太长,本文我将以更可爱的 CLI 来代替。”

Но некоторые студенты все равно задавали вопросы (один одноклассник ответил, что я не видел, потому что обычно катаюсь слишком быстро...), поэтому в начале второй статьи я еще раз спросилCLI,ScafolldingКонцепция полностью разработана один раз:

  1. CLI, его полное название — Command-Line Interface, то есть интерфейс командной строки. Ваш обычный git — более известный инструмент командной строки (вы используете Source Tree party, когда я не говорил):

  1. Scaffolding, его английский перевод - Scafollding, о его концепции, пожалуйста, сначала посмотрите на эту картинку:

Да, это строительные леса.В сфере строительства, будь то большой проект или малый проект, нужны все виды строительных лесов.Инженеры строительных лесов сначала устанавливали стеллажи, а затем рабочие потихоньку укладывали в них кирпичи.

Если вы строите только 1-этажное бунгало, вам может понадобиться только лестница; если это 10 этажей, строительных лесов на картинке выше может быть достаточно; но если это 50 этажей, 100 этажей, ваши леса очень важны для конструкция, несущая, Соображений по безопасности будет больше (ПС: надо хотя бы добавить лифт.)

Вернемся к программированию. Почему концепция скаффолдинга начала распространяться в области фронтенда? В конце концов, все это связано с подъемом машиностроения. С развитием экономики и повышением уровня жизни людей у ​​богатых людей все выше и выше требования к программному опыту, а страницы интерфейса становятся все более и более сложными.Сейчас на это могут уйти сотни, а может и тысячи (плачу ). Позже появился Node, появилась модульность, появились инструменты планирования задач и построения, и зародился фронтенд-инжиниринг, а скаффолдинг играл ту же роль, что и в строительном инжиниринге — помогая вам построить базовую среду разработки, содержащую базовую конфигурацию и скрипты для создать базовую структуру проекта, базовый код и процесс разработки.

А vue-cli, во-первых, это CLI, во-вторых, это Scafollding, после 3.0 его можно рассматривать как инструмент сборки.

Итак, перестаньте спрашивать меня, почему в заголовке не используются строительные леса.

анализировать

Вернемся к нашим требованиям:

lovely-cli dev    # 以开发环境,webpack watch的模式启动一个应用
lovely-cli build  # 以生产环境的模式构建应用

В соответствии с требованиями мы можем разделить следующие подзадачи и задать соответствующие вопросы:

  1. Как написать глобально доступную команду CLI nice-cli с узлом?
  2. Как поддерживать подкоманды (dev, build)?
  3. Как заставить dev запускать webpack dev и строить для запуска webpack build?

воплощать в жизнь

Первые два требования, я полагаю, что большинство программистов интерфейсов/узлов имеют определенное понимание или хорошо знакомы с ними, вот статья г-на Руана.«Учебник по разработке программы командной строки Node.js»В качестве справки студенты, которые забыли, пересматривают его. Я пройдусь по нему быстро:

задача первая

  1. Структура нового проекта выглядит следующим образом:
lovely-cli
├── package.json
└── src
    └── index.js

index.js:

#!/usr/bin/env node

console.log('I am a lovely CLI')

Содержимое package.json следующее:

{
  "name": "lovely-cli",
  "version": "0.0.1",
  "description": "A lovely CLI",
  "bin": "src/index.js"
}

ссылка sudo npm, см. это, это означает, что глобальная регистрация прошла успешно.

/usr/local/bin/lovely-cli -> /usr/local/lib/node_modules/lovely-cli/src/index.js
/usr/local/lib/node_modules/lovely-cli -> /Users/haolchen/Documents/__self__/lovely-cli

ОК, запустите его:

задача вторая

Измените index.js следующим образом:

#!/usr/bin/env node

const command = process.argv[2] // 不懂为什么这样写的同学不够可爱哦,请回去复习。

if (command === 'dev') {
  console.log('Running in development mode.')
} else if (command === 'build') {
  console.log('Running in production mode.')
} else {
  console.log('I am a lovely CLI.')
}

Запустить его:

Примечание. Поскольку параметр командной строки handle не рассматривается в этой статье, демонстрации в этой статье будут демонстрироваться в vanilla node.js. Вы можете использовать старые библиотеки, такие как yargs, command.js и т. д., но я рекомендую прекрасный эгоистcac.

задача третья

Это основное внимание в этой статье, Я считаю, что студенты, которые заинтересованы в этом, должны уже иметь представление:

  1. Запустите nice-cli dev => запустите приложение webpack с помощью webpack-dev-server с конфигурацией среды разработки.
  2. Запускайте nice-cli build => используйте конфигурацию среды сборки и стройте напрямую с помощью webpack.

Первая пряжа:

yarn add webpack webpack-dev-server -D

Далее просто покажите код:

//  20行伪代码实现一个 lovely-cli
#!/usr/bin/env node

const command = process.argv[2]
const Webpack = require('webpack')
const WebpackDevServer = require('webpack-dev-server')

const defaultDevConfig = {} 
const defaultProdConfig = {} 

if (command === 'dev') {
  const compiler = Webpack(defaultDevConfig)
  const devServerOptions = defaultDevConfig.devServer
  const devServer = new WebpackDevServer(compiler, devServerOptions)
  devServer.listen(8080, 'localhost', () => console.log('Starting server on http://localhost:8080'));

} else if (command === 'build') {
  Webpack(defaultProdConfig)

} else {
  console.log('I am a lovely CLI.')
}

Это очень просто Теперь, когда у нас есть все идеи, давайте продолжим улучшать код и напишем простую и удобную версию.

Во-первых, улучшите структуру проекта:

lovely-cli
├── package.json
├── index.html (新增)
├── package.json
├── src
│   ├── default-webpack-config.js (新增)
│   ├── entry.js (新增)
│   └── index.js
└── dist (新增)

Среди них около 4 новых файлов:

  1. index.html: запись страницы, вы также можете использовать HtmlWebpackPlugin для ее решения;
  2. default-webpack-config.js: конфигурация веб-пакета по умолчанию;
  3. entry.js: запись кода клиента;
  4. dist: выходной каталог.

Сначала взгляните на default-webpack-config.js:

'use strict'

const { resolve } = require('path')

module.exports = {
  entry: resolve(__dirname, 'entry.js'),
  output: {
    path: resolve(__dirname, '../dist'),
    publicPath: '/dist/', 
    filename: 'bundle.js'
  }
}

Наиболее распространенная конфигурация, среди них, студенты, которые не использовали роль ProblicPath, пожалуйста, обратитесь кофициальная документация.

Далее идет index.html:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Lovely CLI</title>
</head>
<body>
<div id="app"></div>
<script src="/dist/bundle.js"></script>
</body>
</html>

И файл записи упаковки entry.js:

const app = document.querySelector('#app')
app.innerHTML = '<h1>Lovely CLI</h1>'

Прежде чем посмотреть, какие изменения были внесены в файл index.js, давайте посмотрим на наши результаты:

  1. Запустите разработчика love-cli:

Откройте браузер:

Хорошо, все работает, как и ожидалось.

  1. Затем запустите сборку nice-cli:

Также был сгенерирован запутанный файл:

Наконец, давайте посмотрим, какие изменения были внесены в основной файл ввода CLI:

#!/usr/bin/env node

const command = process.argv[2]
const Webpack = require('webpack')
const WebpackDevServer = require('webpack-dev-server')

const defaultConfig = require('./default-webpack-config')

const defaultDevConfig = Object.assign({}, defaultConfig, { mode: 'development' })
const defaultProdConfig = Object.assign({}, defaultConfig, { mode: 'production' })

if (command === 'dev') {
  const compiler = Webpack(defaultDevConfig)
  const devServerOptions = defaultDevConfig.devServer
  const devServer = new WebpackDevServer(compiler, devServerOptions)
  devServer.listen(8080, 'localhost', () => {
    console.log('[Lovely-CLI] Starting server on http://localhost:8080')
  })

} else if (command === 'build') {
  Webpack(defaultProdConfig, function (err, stats) {
    if (err) {
      throw err
    }
    if (stats.hasErrors()) {
      console.log().log('[Lovely-CLI]', stats.toString());
    }
    process.stdout.write(stats.toString({
          colors: true,
          modules: false,
          children: false,
          chunks: false,
          chunkModules: false
        }) + '\n\n')
  })

} else {
  console.log('I am a lovely CLI.')
}

Студенты, которые на самом деле запускают приведенный выше код, обнаружат, что браузер не будет автоматически обнаруживать изменения и обновлять.Этот вопрос я также оставляю студентам, которые действительно это делают.Я просто воспользовался этой возможностью, чтобы внимательно изучить документацию по веб-пакету. , что совсем не мило (рекомендуется английский).

Окончательный код выложен на Github:

lovely-cli

Сказав это, оглядываясь назад, вы знакомы с реактивными скриптами, упомянутыми в предыдущей статье?

Конечно, нужно подчеркнуть, что это всего лишь игрушка (или даже не игрушка), практичный инструмент, который должен поддерживать достаточное количество сцен, как сказал Ю Юйси:

«Судя по ссылке на игрушку, эта библиотека имеет компромисс из-за особых обстоятельств, возникающих в реальном производстве».

Для такого колеса вы можете рассмотреть возможность поддержки:

  1. Полная функциональность командной строки, поддержка -- и -- синтаксиса;
  2. Достаточно общая конфигурация по умолчанию (webpack4 также понимает правду о «соглашении важнее конфигурации».);
  3. Оставить сильно расширяемый интерфейс (плагин? пресет?);
  4. Более красивая страница журнала (снова идет мел...);
  5. Более элегантная перезагрузка (например: перезапустить dev-сервер в соответствии с новой конфигурацией после изменения конфигурации веб-пакета);

Конечно, если хотите, их гораздо больше.

Десерт

Старая практика, пора познакомить вас с некоторыми десертами.

poi

Github - poi

Это официальный перевод: используйте.jsфайл для написания приложения, будь то vue или react, poi сделает за вас все настройки разработки, больше никаких настроек.

Тонкость дизайна пои заключается в том, чтобы обеспечитьpresetsМеханизм, пресет можно понимать как набор некоторых конфигураций для конкретных сценариев.

В каждом пресете пои вы можетеwebpack-chainДизайн API для изменения конфигурации веб-пакета. Все предустановки будут вызываться последовательно перед запуском приложения. В Babel, с которым мы с вами знакомы, разные пресеты на самом деле являются набором разных плагинов преобразования синтаксиса.

Стоит отметить, что встроены Vue, Vue JSX и object-rest-spread.

В настоящее время пои поддерживает следующие пресеты: Есть что-нибудь, с чем вы знакомы?

w7

Github - w7

Концепция w7 отличается от концепции poi.Это больше похоже на чистый сервер разработки без какой-либо конфигурации.Он делает простую вещь, чтобы обслуживать определенный html-файл на определенном порту и отслеживать изменения файла.Когда файл меняется, браузер автоматически обновляется. Возможно, многие люди зададут вопросы: не является ли это противоположностью фронтенд-инжиниринга? Кто-нибудь до сих пор пишет чистый html?

Нет, наоборот, я заядлый энтузиаст фронтенд-инжиниринга. Причина рождения этого проекта на самом деле исходит из моих собственных потребностей.Интересно, обнаружили ли внимательные студенты, что на складе моего блога есть каталог тестов под каждым годом.Это потому, что я часто пишу относительно независимый интерфейс. Тестируйте, он не связан с проектом, но я все же хочу, чтобы он жил долго, я лично привык сохраняться в HTML, а не в сути.

w7 решает эту проблему, когда вам просто нужно выполнить несколько простых тестов, вам не нужны никакие инструменты сборки, вам просто нужен файл HTML. Несмотря на то, что существует только один HTML-код, w7 все же может помочь вам обнаружить изменения и обновить браузер.

  w7 app.html   

В то же время, w7 также имеет встроенные шаблонные файлы для vue, react и rxjs.Если вы просто хотите проверить, как написать счетчик с помощью vue, зачем тратить так много времени на загрузку vue-cli и оставлять кучу node_modules в ожидании убираться??

  w7 init              # Generate a simple html file with random filename (includes git user name.)
  w7 init --lib vue    # Generate a Counter boilerplate with vue.
  w7 init --lib react  # Generate a Counter boilerplate with React+JSX.

Суммировать

Будь то инструмент с нуля (например, посылка) или инструмент, разработанный на основе существующих зрелых решений (таких как react-скрипты и poi), хороший инструмент сборки, я думаю, таков: после проектирования достаточно простой API. время, он по-прежнему сохраняет свои возможности полного расширения. С этой точки зрения, я думаю, у эгоистки и ее пои все в порядке.

Конечно, не забывайте идти на компромисс с реальной производственной средой.

На этом серия CLI заканчивается. В следующие несколько месяцев я сосредоточусь на исходном коде, сравнении и размышлениях о vue и react, а также расскажу вам, как написать vue или react, включающий основные функции, поэтому название следующей серии будет ориентировочно установите на «Посмотрите на vue и реагируйте лучше, так что следите за обновлениями.

Выше полный текст заканчивается. )