Как можно использовать Babel без упаковщика, но с опытом разработки, похожим на webpack? - PullRequest
0 голосов
/ 14 октября 2018

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

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

update (10/ 2018): Для того, чтобы сделать то, что я описал, в данный момент не существует "стандартного пути".Он предлагает возможность разработать новый инструмент для сборки или настроить / разработать существующий.Он должен работать аналогично webpack и webpack-dev-server (включая simple-setup для горячей перезагрузки), но больше не должен связывать файлы.Возможно, веб-пакет можно настроить так, чтобы он выполнял именно то, что нужно, и в этом случае настройка рабочего примера была бы полезна для иллюстрации циклов разработки и сборки.В настоящее время у меня нет времени на это, но если кто-то создал или хочет построить первую попытку, он может добавить свой прогресс в качестве комментария или ответа.

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Вы можете использовать плагин Webpack, например Emit All .

0 голосов
/ 24 октября 2018

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

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

Вы можете использовать автономную версию 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.См. Два других подхода.

Способ веб-пакета

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

Taskrunnerway

Один из способов получить еще больший контроль над обработкой каждого файла, вы можете использовать TaskRunner, чтобы выполнить для вас шаг компиляции.Ниже приведен упрощенный пример конфигурации для taskrunner 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 способом .Тем не менее, при обработке каждого файла как отдельного комплекта было бы недостатком вставлять все свои шаблоны в начало каждого обработанного файла.В конечном итоге, возможно, что-то можно сделать с помощью модуля общих чанков .

0 голосов
/ 22 октября 2018

С веб-пакетом и исходными картами не должно иметь значения, что он изменяет ваш код.Хотя это может быть сложной задачей при первоначальной настройке, но после того, как вы все заработаете, вы можете посмотреть на свой исходный код в инструментах отладки браузера в точности так, как они отображаются на диске.Редактор кода 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который запускается в браузере и ожидает в сообщении этого сообщения.

...