Как можно использовать Babel без сборщика, но с опытом разработки, похожим на webpack?

Я пытаюсь создать новый проект с модулями ES6 без комплектации. Я все еще хочу использовать babel-7 для перевода TypeScript и JSX в JS. Мне трудно понять, как настроить для него сервер разработки. Я не смог найти какой-либо «babel-dev-сервер», который работает аналогично webpack-dev -server (горячая перезагрузка модуля, синхронизация браузера, просмотрщик файлов).

Одной из возможностей может быть использование синхронизации браузера в качестве статического сервера, например. dist и запустить что-то вроде babel src --out-dir dist --watch параллельно. Но это без учета горячей перезагрузки и мне кажется несколько корявым. Кроме того, было бы полезно для шагов сборки и разработки, если бы вы могли дать JS-файлам хэш для лучшего управления кэшированием. Или я могу настроить инструмент сборки, такой как webpack, чтобы он не выполнял связывание, но все же выполнял некоторые преобразования (например, помещая хэши в имена файлов при импорте)?


person Putzi San    schedule 14.10.2018    source источник
comment
Какова ваша конечная цель? Почему вы хотите избежать использования webpack-dev-server? Если вам нужна перезагрузка горячего модуля и т. д., то это будет хороший инструмент для использования.   -  person Todd Chaffee    schedule 21.10.2018
comment
Исходная карта решит вашу проблему? это позволяет вам видеть отдельные файлы в браузере.   -  person kkkkkkk    schedule 22.10.2018
comment
@ToddChaffee Я считаю, что из-за HTTP/2 и встроенной поддержки браузером import/export объединение не является ни оптимальным, ни необходимым. Это настолько сильно изменяет код, что вы не знаете точно, как он работает, и усложняет процесс разработки (например, я считаю, что веб-пакет и принцип объединения действительно трудно понять или объяснить новичку). Вот почему я хотел попробовать, как жить без веб-пакета или, по крайней мере, без волшебного процесса сборки.   -  person Putzi San    schedule 22.10.2018


Ответы (4)


Способ создания прототипа

Очень простой способ сделать это — рассматривать сервер и транспилирование как отдельные шаги.

Вы можете использовать автономную версию babel в качестве первого скрипта, который вы загружаете, чтобы вы могли писать jsx внутри своего html-документа из файлов javascript без их компиляции.

Просто добавьте ссылки cdn из https://cdnjs.com/libraries/babel-standalone/ в виде скрипта:

<html>
  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.0.0-beta.3/babel.min.js"></script>
    <script src="/your/jsx/here.js"></script>
    <script>
      // or here
    </script>
  </head>
  <body>
    <div id="application" />
    <noscript>This app needs javascript enabled in order to run.</noscript>
  </body>
</html>

Это позволит вам очень быстро создавать прототипы, используя любой веб-сервер, который просматривает файлы. Вы можете сделать это с помощью любого плагина для запуска задач (например, для grunt или gulp) или, если вы используете Visual Studio, посмотрите LiveServer.

Когда вы переходите на производственную версию, возможно, вы не захотите включать всю библиотеку babel. См. два других подхода.

Веб-пакет

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

Способ выполнения задач

Один из способов получить еще больший контроль над тем, как обрабатывается каждый файл, — использовать средство запуска задач, которое выполняет этап компиляции за вас. Ниже приведен упрощенный пример конфигурации для таскраннера https://gulpjs.com/.

gulpfile.js

const gulp = require('gulp');
const watch = require('gulp-watch');
const webpackStream = require('webpack-stream');
const webpack = require('webpack');
const eslint = require('gulp-eslint');

gulp.task('watch', function() {
  return watch('src/**.js', ['compile']);
});

gulp.task('lint', function() {
  return gulp.src(['src/*.js', 'src/*/*.js'])
    .pipe(eslint({
      parser: 'babel-eslint',
      parserOptions: {
        ecmaFeatures: {
          jsx: true
        },
        sourceType: 'module'
      }
    }))
    .pipe(eslint.format())
    .pipe(eslint.failAfterError());
});

gulp.task('compile', ['lint'], function() {
  return gulp.src('src/main.js')
    .pipe(webpackStream({
      output: {
        filename: 'main.js',
        libraryTarget: 'commonjs2',
        sourceMapFilename: 'main.js.map',
      },
      plugins: [],
      module: {
        loaders: [
          {
            test: /\.js$/,
            loader: 'babel-loader',
            query: {
              presets: [
                require.resolve('babel-preset-es2015'),
                require.resolve('babel-preset-stage-0'),
              ],
            },
          },
        ],
      },
    }), webpack)
    .pipe(gulp.dest('dist/'));
});

Этот файл примера можно запустить, используя gulp watch. Он будет просматривать файлы на случай, если это вызовет другие задачи.

У меня был только пример с webpack, но вы можете заменить его любым другим компонентом компилятора или даже написать свой собственный шаг компиляции, если хотите (вероятно, нет).

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

person Webber    schedule 24.10.2018
comment
Большое спасибо за ваши пояснения! Особенно в цикле разработки я нахожу подход с @babel/standalone захватывающим (я бы используйте babel7 ;-)). Я считаю, что другие подходы очень полезны для подготовки приложения к производству. Я пока не приму ваш ответ, потому что хочу сначала протестировать его (если найду время), как его собрать и работает ли он так, как я надеюсь. - person Putzi San; 24.10.2018
comment
Отлично, дайте мне знать, если вам не хватает чего-то конкретного в вашей реализации. Возможно, мы сможем помочь и другим людям. - person Webber; 24.10.2018

С последним выпуском Snowpack (ранее @pika/web) это стало возможным!

С их сайта:

TL;DR — С Snowpack вы можете создавать современные веб-приложения (используя React, Vue и т. д.) без сборщика (например, Webpack, Parcel, Rollup). Больше не нужно ждать, пока ваш упаковщик перестроит ваш сайт каждый раз, когда вы нажимаете «Сохранить». Вместо этого каждое изменение мгновенно отражается в браузере.

И их «Как это работает»:

  1. Вместо того, чтобы объединять каждое изменение, просто запустите Snowpack один раз сразу после установки npm.
  2. Snowpack переустанавливает ваши зависимости в виде отдельных JS-файлов в новый каталог web_modules/. Он никогда не касается вашего исходного кода.
  3. Напишите код, импортируйте эти зависимости через импорт ESM, а затем запустите все это в браузере.
  4. Пропустите этап сборки и увидите, как ваши изменения отразятся в браузере сразу после нажатия кнопки «Сохранить».
  5. Продолжайте использовать свои любимые веб-фреймворки и инструменты для создания! Поддерживается Babel и TypeScript.

проверьте https://www.snowpack.dev/ для получения дополнительной информации, они проделали большую работу со своими документации, это выглядит действительно многообещающе!

person Putzi San    schedule 14.01.2020

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

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

Для оперативной перезагрузки вы можете проверить пакет npm livereload.

Или вы можете создать свой собственный и выяснить, как это делает webpack-dev-server. Они используют пакет chokidar npm для отслеживания изменений в файловой системе, а затем уведомляют браузер через веб-сокеты. Вероятно, вы могли бы собрать что-то похожее, приложив немного усилий.

Вот как его инициирует webpack-dev-server :

const watcher = chokidar.watch(watchPath, options);

watcher.on('change', () => {
  this.sockWrite(this.sockets, 'content-changed');
});

Очевидно, что в браузере запускается какой-то JavaScript, ожидающий этого сообщения в веб-сокете.

person Todd Chaffee    schedule 22.10.2018

Вы можете использовать подключаемый модуль Webpack, например Emit All.

person tiagodws    schedule 23.10.2018
comment
Это кажется милым. Есть ли у вас опыт интеграции с webpack-dev-server? - person Putzi San; 24.10.2018
comment
@PutziSan, это не должно быть проблемой. - person tiagodws; 24.10.2018