Spec-Zone.ru › webpack 5

Интерфейс узла

Webpack предоставляет API Node.js, который можно использовать непосредственно в среде выполнения Node.js.

API Node.js полезен в сценариях, в которых вам нужно настроить процесс сборки или разработки, так как все отчеты и обработка ошибок должны выполняться вручную, а webpack выполняет только часть компиляции. По этой причине параметры конфигурации stats не будут иметь никакого эффекта в вызове webpack().

Установка

Чтобы начать использовать API webpack Node.js, сначала установите webpack, если вы этого еще не сделали:

npm install --save-dev webpack

Затем подключите модуль webpack в ваш скрипт Node.js:

const webpack = require('webpack');

Или, если вы предпочитаете ES2015:

import webpack from 'webpack';

webpack()

Импортированная webpack функция получает объект конфигурации webpack Configuration Object и запускает компилятор webpack, если предоставлена функция обратного вызова:

const webpack = require('webpack');

webpack({}, (err, stats) => {
  if (err || stats.hasErrors()) {
    // ...
  }
  // Done processing
});
подсказка

Объект err не будет содержать ошибки компиляции. Их необходимо обрабатывать отдельно с помощью stats.hasErrors(), что будет подробно рассмотрено в разделе «Обработка ошибок» данного руководства. Объект err будет содержать только проблемы, связанные с webpack, такие как неправильная настройка и т. п.

подсказка

Вы можете предоставить функции webpack массив конфигураций. Дополнительную информацию см. в разделе «Многокомпилятор» ниже.

Экземпляр компилятора

Если вы не передадите webpack функции-запускающему обратный вызов, она вернёт экземпляр компилятора webpack Compiler. Этот экземпляр можно использовать для ручного запуска процесса сборки webpack или для наблюдения за изменениями, аналогично CLI CLI. Экземпляр Compiler предоставляет следующие методы:

  • .run(callback)
  • .watch(watchOptions, handler)

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

Свойство hooks экземпляра Compiler используется для регистрации плагина для любого события в жизненном цикле Compiler. Утилиты WebpackOptionsDefaulter и WebpackOptionsApply используются webpack для настройки экземпляра Compiler со всеми встроенными плагинами.

Метод run используется для запуска всей работы по компиляции. После завершения выполняется заданная функция callback. Окончательная регистрация статистики и ошибок должна быть выполнена в этой функции callback.

предупреждение

API поддерживает только одну одновременную компиляцию. При использовании run или watch, вызовите close и дождитесь его завершения, прежде чем снова вызывать run или watch. Одновременные компиляции приведут к повреждению выходных файлов.

Запуск

Вызов метода run на экземпляре Compiler аналогичен методу быстрого запуска, упомянутому выше:

const webpack = require('webpack');

const compiler = webpack({
  // ...
});

compiler.run((err, stats) => {
  // ...

  compiler.close((closeErr) => {
    // ...
  });
});
предупреждение

Не забудьте закрыть компилятор, чтобы задачи низкого приоритета (например, постоянное кэширование) имели возможность завершения.

Наблюдение

Вызов метода watch запускает процесс webpack, но затем следит за изменениями (аналогично CLI: webpack --watch), как только webpack обнаружит изменение, выполняется заново. Возвращает экземпляр Watching.

watch(watchOptions, callback);
const webpack = require('webpack');

const compiler = webpack({
  // ...
});

const watching = compiler.watch(
  {
    // Example
    aggregateTimeout: 300,
    poll: undefined,
  },
  (err, stats) => {
    // Print watch/build result here...
    console.log(stats);
  }
);

Опции Watching подробно описаны здесь.

предупреждение

Неточности файловой системы могут вызывать несколько сборок для одного изменения. В приведенном выше примере оператор console.log может вызываться несколько раз для одного изменения. Пользователи должны ожидать такого поведения и могут проверить stats.hash , чтобы увидеть, действительно ли изменился хэш файла.

Закрытие Watching

Метод watch возвращает экземпляр Watching, который предоставляет метод .close(callback). Вызов этого метода завершит наблюдение:

watching.close((closeErr) => {
  console.log('Watching Ended.');
});
предупреждение

Не разрешается следить за изменениями или запускать сборку заново, прежде чем текущий процесс наблюдения будет закрыт или отменён.

Отмена Watching

Используя watching.invalidate, можно вручную отменить текущий этап компиляции без остановки процесса наблюдения:

watching.invalidate();

Объект статистики

Объект stats, передаваемый в качестве второго аргумента обратного вызова webpack(), является хорошим источником информации о процессе компиляции кода. Он включает:

  • Ошибки и предупреждения (если есть)
  • Временные характеристики
  • Информация о модулях и блоках

webpack CLI использует эту информацию для отображения отформатированного вывода в консоли.

подсказка

При использовании MultiCompiler, возвращается экземпляр MultiStats, который соответствует тому же интерфейсу, что и stats, то есть методам, описанным ниже.

Этот объект stats предоставляет следующие методы:

stats.hasErrors()

Может быть использован для проверки наличия ошибок во время компиляции. Возвращает true или false.

stats.hasWarnings()

Может быть использован для проверки наличия предупреждений во время компиляции. Возвращает true или false.

stats.toJson(options)

Возвращает информацию о компиляции в виде объекта JSON. options может быть либо строкой (предварительно заданным значением), либо объектом для более точного управления:

stats.toJson('minimal');
stats.toJson({
  assets: false,
  hash: true,
});

Все доступные параметры и наборы значений описаны в документации к статистике документации.

Вот пример вывода этой функции пример.

stats.toString(options)

Возвращает отформатированную строку информации о компиляции (аналогично выводу CLI).

Параметры такие же, как в stats.toJson(options) с одним дополнением:

stats.toString({
  // Add console colors
  colors: true,
});

Вот пример использования stats.toString():

const webpack = require('webpack');

webpack(
  {
    // ...
  },
  (err, stats) => {
    if (err) {
      console.error(err);
      return;
    }

    console.log(
      stats.toString({
        chunks: false, // Makes the build much quieter
        colors: true, // Shows colors in the console
      })
    );
  }
);

Многокомпилятор

Модуль MultiCompiler позволяет webpack запускать несколько конфигураций в отдельных компиляторах. Если параметр options в API NodeJS webpack является массивом параметров, webpack применяет отдельные компиляторы и вызывает callback после выполнения всех компиляторов.

var webpack = require('webpack');

webpack(
  [
    { entry: './index1.js', output: { filename: 'bundle1.js' } },
    { entry: './index2.js', output: { filename: 'bundle2.js' } },
  ],
  (err, stats) => {
    process.stdout.write(stats.toString() + '\n');
  }
);
предупреждение

Несколько конфигураций не будут запускаться параллельно. Каждая конфигурация обрабатывается только после завершения предыдущей.

Обработка ошибок

Для хорошей обработки ошибок вам необходимо учесть три типа ошибок:

  • Критические ошибки webpack (неправильная конфигурация и т. д.)
  • Ошибки компиляции (отсутствующие модули, синтаксические ошибки и т. д.)
  • Предупреждения о компиляции

Вот пример, который учитывает все это:

const webpack = require('webpack');

webpack(
  {
    // ...
  },
  (err, stats) => {
    if (err) {
      console.error(err.stack || err);
      if (err.details) {
        console.error(err.details);
      }
      return;
    }

    const info = stats.toJson();

    if (stats.hasErrors()) {
      console.error(info.errors);
    }

    if (stats.hasWarnings()) {
      console.warn(info.warnings);
    }

    // Log result...
  }
);

Пользовательские файловые системы

По умолчанию webpack читает и записывает файлы на диск с помощью стандартной файловой системы. Однако можно изменить поведение ввода или вывода, используя другой тип файловой системы (память, webDAV и т. д.). Для этого можно изменить inputFileSystem или outputFileSystem. Например, можно заменить стандартную outputFileSystem на memfs для записи файлов в память вместо диска:

const { createFsFromVolume, Volume } = require('memfs');
const webpack = require('webpack');

const fs = createFsFromVolume(new Volume());
const compiler = webpack({
  /* options */
});

compiler.outputFileSystem = fs;
compiler.run((err, stats) => {
  // Read the output later:
  const content = fs.readFileSync('...');
  compiler.close((closeErr) => {
    // ...
  });
});

Обратите внимание, что именно это использует webpack-dev-middleware, который используется webpack-dev-server и многими другими пакетами, чтобы загадочным образом скрыть ваши файлы, но продолжать их предоставление браузеру!

подсказка

Предоставленная вами файловая система вывода должна быть совместима с интерфейсом Node fs, что требует вспомогательных методов mkdirp и join.

© JS Foundation and other contributors
Licensed under the Creative Commons Attribution License 4.0.
https://webpack.js.org/api/node

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API