Параметр target определяет, для какой среды выполнения
Webpack должен собирать итоговый бандл. От выбранного значения
зависит:
import();__dirname, global,
process;Наиболее распространённые значения:
module.exports = {
target: 'web'
};
module.exports = {
target: 'node'
};
web используется для браузеров, node — для
серверной среды Node.js.
target: webtarget: 'web' считается значением по умолчанию.
Webpack предполагает, что код будет выполняться:
window;<script>.Пример:
module.exports = {
target: 'web',
entry: './src/index.js'
};
В этом режиме Webpack:
target: nodeПри использовании target: 'node' Webpack начинает
генерировать код для выполнения внутри Node.js.
Пример:
module.exports = {
target: 'node',
entry: './src/server.js'
};
В этом режиме:
require;__dirname;node
от webtarget: webБраузер не поддерживает:
fspathosnettlschild_processПоэтому код:
const fs = require('fs');
в браузерной сборке вызывает проблемы.
В Webpack 4 некоторые модули автоматически полифилились. В Webpack 5 это поведение удалено.
Ошибка:
Module not found: Error: Can't resolve 'fs'
target: nodeNode.js уже содержит эти модули.
Webpack не пытается их заменять:
const fs = require('fs');
const text = fs.readFileSync('./file.txt', 'utf8');
Такой код корректно работает в серверной сборке.
__dirname и __filenameВ web Webpack эмулирует эти переменные.
Поведение отличается от настоящего Node.js.
Пример:
console.log(__dirname);
Может выводить:
/
или путь виртуальной сборки.
При target: 'node' сохраняется настоящее поведение:
console.log(__dirname);
Результат:
/home/project/dist
Это особенно важно:
webВ браузере чанки подгружаются динамически через
<script>.
Webpack генерирует JSONP runtime.
Пример:
import('./module.js');
Превращается в механизм:
<script src="chunk.js"></script>
nodeВ Node.js динамические чанки подключаются через
require.
Webpack создаёт серверный loader:
require("./chunk.js");
Это значительно быстрее и не требует сетевых запросов.
Доступны:
window
document
navigator
location
Но отсутствует:
global
Доступен:
global
process
Buffer
Но отсутствует DOM.
Код:
document.querySelector('.app');
в Node.js завершится ошибкой:
ReferenceError: document is not defined
webОбычно используются:
Пример:
output: {
libraryTarget: 'umd'
}
nodeЧаще применяется:
output: {
libraryTarget: 'commonjs2'
}
или:
output: {
module: false
}
Node.js ориентирован на:
webБраузерные сборки должны быть минимальными.
Webpack активно:
nodeДля сервера размер менее критичен.
Главные цели:
Иногда серверные сборки вообще не минифицируются:
optimization: {
minimize: false
}
В браузере:
const module = await import('./math.js');
Webpack создаёт асинхронную загрузку файла.
В Node.js используется локальная файловая система.
Webpack генерирует загрузку через:
require()
или внутренний runtime-обработчик.
Для Node.js часто используется externals.
Пример:
module.exports = {
target: 'node',
externals: {
express: 'commonjs express'
}
};
Webpack не включает express в бандл.
В runtime Node.js сам загрузит пакет:
require('express');
Это уменьшает размер серверной сборки.
target: node активно применяется в:
Пример серверной точки входа:
import express from 'express';
import render from './render';
const app = express();
app.get('*', (req, res) => {
res.send(render());
});
app.listen(3000);
Такой код предназначен только для Node.js.
web и nodeWebpack генерирует:
Фрагмент runtime:
var script = document.createElement('script');
Для node runtime проще:
require("./chunk.js");
Отсутствуют:
<script>;externalsPresetsWebpack 5 добавил специальные пресеты.
Пример:
module.exports = {
target: 'node',
externalsPresets: {
node: true
}
};
Webpack автоматически учитывает:
resolve.mainFieldsПриоритет:
resolve: {
mainFields: ['browser', 'module', 'main']
}
Webpack пытается взять браузерную версию пакета.
Приоритет меняется:
resolve: {
mainFields: ['module', 'main']
}
Используется серверная версия библиотеки.
browser в package.jsonНекоторые библиотеки содержат:
{
"browser": {
"./server.js": "./browser.js"
}
}
target: webWebpack заменяет серверный файл браузерным.
target: nodeЗамена не выполняется.
Используется настоящий серверный модуль.
target: node для CLI-приложенийWebpack может собирать:
Пример:
#!/usr/bin/env node
console.log('CLI app');
Конфигурация:
module.exports = {
target: 'node'
};
Для браузера Hot Module Replacement работает через:
<script>;В Node.js HMR сложнее.
Используются:
webpack/hot/poll;node в
ElectronElectron содержит две среды:
Используется:
target: 'web'
или:
target: 'electron-renderer'
Используется:
target: 'node'
или:
target: 'electron-main'
targetWebpack поддерживает множество платформ.
Примеры:
target: 'web'
target: 'node'
target: 'webworker'
target: 'electron-main'
target: 'electron-renderer'
target: 'async-node'
async-nodeСпециальный вариант для асинхронной загрузки чанков в Node.js.
Пример:
target: 'async-node'
Чанки загружаются асинхронно через filesystem API.
Пример серверной сборки:
module.exports = {
target: 'node',
module: {
rules: [
{
test: /\.js$/,
loader: 'babel-loader'
}
]
}
};
Babel может транспилировать код под конкретную версию Node.js:
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": "18"
}
}
]
]
}
const path = require('path');
module.exports = {
mode: 'production',
target: 'node',
entry: './src/server.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'server.js',
libraryTarget: 'commonjs2'
},
externalsPresets: {
node: true
},
optimization: {
minimize: false
}
};
const path = require('path');
module.exports = {
mode: 'production',
target: 'web',
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js'
}
};
target: webПодходит для:
target: nodeПодходит для:
web
вместо nodeОшибки:
Can't resolve 'fs'
document is not defined
process is not defined
node
вместо webОшибки:
window is not defined
navigator is not defined
или невозможность загрузки браузерных чанков.
web обычно агрессивнее оптимизирует:
В node Webpack чаще сохраняет CommonJS-поведение для
совместимости.
Webpack адаптирует runtime под платформу.
Например:
output: {
environment: {
arrowFunction: false
}
}
Для Node.js и браузеров требования могут различаться.
web и
node| Возможность | web | node |
|---|---|---|
| DOM | Есть | Нет |
| fs/path | Нет | Есть |
| window | Есть | Нет |
| process | Ограничено | Есть |
| Загрузка чанков | <script> |
require() |
| Runtime | Browser | CommonJS |
| SSR | Нет | Да |
| JSONP | Да | Нет |
| CLI | Нет | Да |
| Browser field | Используется | Игнорируется |
| Размер критичен | Да | Реже |
| Built-in Node modules | Нет | Есть |