Spec-Zone.ru › webpack 5

Точки входа

Как упоминалось в Начинающем руководстве, существует несколько способов определения свойства entry в вашей конфигурации webpack. Мы покажем вам способы конфигурации свойства entry, помимо объяснения, почему это может быть полезно для вас.

Синтаксис одиночного входа (сокращённый)

Использование: entry: string | [string]

webpack.config.js

module.exports = {
  entry: './path/to/my/entry/file.js',
};

Синтаксис одиночного входа для свойства entry является сокращением для:

webpack.config.js

module.exports = {
  entry: {
    main: './path/to/my/entry/file.js',
  },
};

Мы также можем передать массив путей к файлам в свойство entry, что создаёт то, что известно как «множественный основной вход». Это полезно, когда вы хотите объединить несколько зависимых файлов и отобразить их зависимости в один «фрагмент».

webpack.config.js

module.exports = {
  entry: ['./src/file_1.js', './src/file_2.js'],
  output: {
    filename: 'bundle.js',
  },
};

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

Синтаксис объекта

Использование: entry: { <entryChunkName> string | [string] } | {}

webpack.config.js

module.exports = {
  entry: {
    app: './src/app.js',
    adminApp: './src/adminApp.js',
  },
};

Синтаксис объекта более объёмный. Однако это самый масштабируемый способ определения входа/входов в вашем приложении.

подсказка

«Масштабируемые конфигурации webpack» — это конфигурации, которые можно повторно использовать и комбинировать с другими частичными конфигурациями. Это популярная техника, используемая для разделения забот по среде, целевому билду и временному состоянию. Затем они объединяются с помощью специализированных инструментов, таких как webpack-merge.

подсказка

Вы можете передать пустой объект {} в entry, когда у вас есть только точки входа, сгенерированные плагинами.

Объект EntryDescription

Объект описания точки входа. Вы можете указать следующие свойства.

  • dependOn: Точки входа, от которых зависит текущая точка входа. Они должны быть загружены перед загрузкой этой точки входа.

  • filename: Указывает имя каждого выходного файла на диске.

  • import: Модуль(и), который(ые) загружается(ются) при запуске.

  • library: Укажите параметры библиотеки для создания библиотеки из текущей точки входа.

  • runtime: Имя фрагмента выполнения. При установке создаётся новый фрагмент выполнения. Он может быть установлен на false, чтобы избежать создания нового фрагмента выполнения с версии webpack 5.43.0.

  • publicPath: Укажите публичный URL-адрес выходных файлов этой точки входа, когда они ссылаются в браузере. Также см. output.publicPath.

webpack.config.js

module.exports = {
  entry: {
    a2: 'dependingfile.js',
    b2: {
      dependOn: 'a2',
      import: './src/app.js',
    },
  },
};

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

webpack.config.js

module.exports = {
  entry: {
    a2: './a',
    b2: {
      runtime: 'x2',
      dependOn: 'a2',
      import: './b',
    },
  },
};

Убедитесь, что runtime не указывает на существующее имя точки входа, например, следующая конфигурация приведёт к ошибке:

module.exports = {
  entry: {
    a1: './a',
    b1: {
      runtime: 'a1',
      import: './b',
    },
  },
};

Также dependOn не должен быть циклическим, следующий пример также приведёт к ошибке:

module.exports = {
  entry: {
    a3: {
      import: './a',
      dependOn: 'b3',
    },
    b3: {
      import: './b',
      dependOn: 'a3',
    },
  },
};

Сценарии

Ниже приведён список конфигураций входа и их примеров использования в реальных приложениях:

Отдельные входы приложения и поставщиков

webpack.config.js

module.exports = {
  entry: {
    main: './src/app.js',
    vendor: './src/vendor.js',
  },
};

webpack.prod.js

module.exports = {
  output: {
    filename: '[name].[contenthash].bundle.js',
  },
};

webpack.dev.js

module.exports = {
  output: {
    filename: '[name].bundle.js',
  },
};

Что это делает? Мы говорим webpack, что хотим 2 отдельных точки входа (как в примере выше).

Почему? Благодаря этому вы можете импортировать необходимые библиотеки или файлы, которые не изменяются (например, Bootstrap, jQuery, изображения и т. д.) в vendor.js, и они будут объединены в свой собственный фрагмент. Хэш содержимого остаётся неизменным, что позволяет браузеру кэшировать их отдельно, тем самым уменьшая время загрузки.

подсказка

В версиях webpack < 4 было принято добавлять поставщиков как отдельную точку входа, чтобы скомпилировать их как отдельный файл (в сочетании с CommonsChunkPlugin).

В webpack 4 это не рекомендуется. Вместо этого опция optimization.splitChunks отвечает за разделение модулей поставщиков и приложения и создание отдельного файла. Не создавайте вход для поставщиков или других элементов, которые не являются начальной точкой выполнения.

Многостраничное приложение

webpack.config.js

module.exports = {
  entry: {
    pageOne: './src/pageOne/index.js',
    pageTwo: './src/pageTwo/index.js',
    pageThree: './src/pageThree/index.js',
  },
};

Что это делает? Мы говорим webpack, что хотим 3 отдельных графов зависимостей (как в примере выше).

Почему? В многостраничном приложении сервер будет загружать для вас новый документ HTML. Страница перезагружает этот новый документ, и активы перекачиваются. Однако это даёт нам уникальную возможность выполнять такие действия, как использование optimization.splitChunks для создания наборов общего кода приложения между каждой страницей. Многостраничные приложения, которые повторно используют много кода/модулей между точками входа, могут существенно выиграть от этих методов, поскольку количество точек входа увеличивается.

подсказка

Как правило: используйте ровно одну точку входа для каждого документа HTML. Подробности см. в проблеме описанной здесь.

© JS Foundation and other contributors
Licensed under the Creative Commons Attribution License 4.0.
https://webpack.js.org/concepts/entry-points

Spec-Zone.ru

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