Рассказать о статус-кво и идеях построения фронтенд-проекта

внешний интерфейс JavaScript
  • суг команда
  • Автор: Луис

источник

После нескольких лет осадок реформа начального этапа наконец вышла на плато на этом этапе. Оглядываясь назад на путь, по которому шли предшественники, в основном нужно решить следующие проблемы:

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

Для решения этих проблем появились следующие решения:

  • babel, преобразуйте ES6 и typescript в код ES5, поддерживаемый браузерами
  • DSL (доменный язык), например: меньше, sass и т. д. для расширения css, jsx, шаблон vue, угловой шаблон для расширения html
  • Инструмент управления зависимостью NPM
  • Используйте инструменты для обработки сжатого кода, сжатия изображений, создания HASH файлов и других функций.
  • Используйте инструменты live reload, browsersync, hot reload для обновления браузера в режиме реального времени.

Эти решения стали незаменимыми функциями в нашей разработке, поэтому нам нужен инструмент, чтобы соединить их вместе, поэтому перед и после появляются интерфейсные инженерные инструменты построения, такие как grunt, gulp, fis, webpack и т. д. После периода обновлений и итераций, с идеей о том, что все является модулем и его мощными функциями, веб-пакет постепенно выделяется из многих инструментов и становится широко используемым инструментом построения во внешних проектах.

статус-кво

На данном этапе я лично чувствую, что построение фронтенд-проектов становится все тяжелее и громоздче. Для нового проекта всегда необходимо установить кучу зависимостей (сотни M node_modules), а затем написать кучу элементов конфигурации для инструментов сборки, прежде чем можно будет выполнять бизнес-разработку. Когда проект становится все больше и больше, каждый его запуск занимает много времени. Потому что инструмент сборки должен выполнить анализ зависимостей и компиляцию проекта и, наконец, вывести файлы, которые может выполнить браузер. На данный момент оптимизация конфигурации инструментов сборки поставлена ​​в рабочий график каждого.

Текущая схема оптимизации построения, на примере webpack, в основном имеет следующие направления:

  • Облегчить анализ зависимостей: решить конфигурацию веб-пакета, исключить конфигурацию лодера.
  • Подпакет, динамическая загрузка: import(), require.ensure()
  • Извлеките общие части и уменьшите количество зависимостей, которые необходимо скомпилировать: DllPlugin, внешние компоненты.
  • Параллельная компиляция с многопоточностью и многопроцессорностью: thread-loader, happyPack
  • Кэш: кеш-загрузчик, жесткий-исходный-веб-пакет-плагин

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

идея

видел когда-то@vue/dev-serverПосле этого инструмента меня внезапно осенило, и я придумал реальное решение. Этот инструмент может быстро запустить.vueОднофайловая среда разработки, давайте посмотрим, что она делает.

Файлы, созданные в соответствии с документацией, не имеют конфигурации, такой как webpack.config, и не имеют предварительно обработанных выходных файлов.

Файл index.html использует модуль es, поддерживаемый последним браузером Chrome, для загрузки main.js.

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Vue dev</title>
</head>
<body>
  <div id="app"></div>
  <script type="module">
    import './main.js'
  </script>
</body>
</html>

Файл main.js представляет собой файл test.vue, который совпадает с файлом ввода обычного проекта. Код в файле test.vue — это формат обычного одиночного файла vue, который не отображается.

import Vue from 'vue'
import App from './test.vue'

new Vue({
  render: h => h(App)
}).$mount('#app')

Далее посмотрим на загружаемые браузером ресурсы, путь тот же, что и при импорте, а тип — скрипт (Content-Type: application/javascript).

основной.js,import Vue from 'vue'обработано вimport Vue from '/__modules/vue'. Поскольку модуль браузера es еще не реализован, он все еще предлагаетсяimport-mapsфункция, поэтому зависимости без путей не поддерживаются. Vue — это vue.js, который может выполнять браузер.

test.vue — это код после компиляции исходного файла, потому что исходный.vueОднофайловые браузеры не поддерживаются и должны быть предварительно скомпилированы.

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

  • Преобразуйте ссылочный адрес зависимостей без путей (пока это только vue, другие пакеты npm не обрабатываются), чтобы браузеры могли поддерживать
  • предварительно скомпилировано.vueфайл, преобразованный в поддерживаемый браузером js, аналогичный vue-loader в webpack

Тщательно обдумав это, текущие инструменты сборки обрабатывают все файлы ресурсов, от которых зависит проект, но во многих случаях мы разрабатываем только определенный модуль на определенной странице. С идеальной точки зрения, по сути, нам нужно обрабатывать только файлы ресурсов, от которых зависит страница. Всякий раз, когда загружается ресурс, который не может быть выполнен браузером: vue, sass, less и т. д., выполняется процесс перевода/компиляции, и, наконец, файл ресурса выводится в браузер.

Фактически, некоторые люди в сообществе предпринимают аналогичные попытки, например:systemjs, описание на гитхабе:Dynamic ES module loader. Конечно, это делается не только для совместимости с модулем es на стороне браузера, основное внимание уделяется его реализации.Transform loaderФункция. Эта функция предоставляет функцию, аналогичную загрузчику webpack, и выполняет соответствующую обработку загрузчика для сопоставления зависимостей. Конкретная обработка загрузчика может быть размещена в веб-воркере или обработана через сервер узла.Если он совместим с большинством загрузчиков веб-пакетов, это хорошее решение.

В настоящее время идея еще не проверена и не реализована.Если вам интересно, вы можете узнать о соответствующем содержании.Если будут дальнейшие исследования, я надеюсь на общение и обсуждение вместе.