В Parcel система таргетов определяет, под какую среду выполняется сборка приложения. Один из ключевых режимов — Node.js-таргет, который ориентирован на выполнение кода в среде Node.js без браузерного окружения, DOM и Web API. В этом режиме сборщик перестраивает граф модулей, учитывает встроенные возможности Node.js и исключает типичные браузерные преобразования.
Node.js таргет задаёт семантику сборки, при которой выходной код предполагается запускать в серверной среде. Это влияет на:
В отличие от браузерного таргета, где основной целью является оптимизация загрузки в сети и совместимость с браузерами, Node.js таргет ориентирован на выполнение в файловой системе и серверном рантайме.
В Parcel v2 таргеты определяются через поле targets в
package.json. Это позволяет описывать несколько выходных
сборок для одного проекта.
{
"name": "server-app",
"source": "src/index.js",
"targets": {
"node": {
"context": "node",
"outputFormat": "commonjs",
"distDir": "dist/node",
"engines": {
"node": ">=18"
}
}
}
}
Ключевые параметры:
node)Parcel использует эту информацию для выбора трансформаций и стратегии упаковки.
Node.js таргет принципиально отличается по нескольким направлениям.
В Node.js нет:
windowdocumentlocalStoragefetch (в старых версиях Node)Поэтому Parcel:
Node.js предоставляет встроенные модули:
fspathhttpcryptoParcel при сборке:
require("fs") или import "fs"
без изменений,В Node.js таргете Parcel по умолчанию:
node_modules нетронутой,Это важно для серверных приложений, где бандлинг всего графа может быть избыточным.
Parcel поддерживает оба основных формата:
require, module.exports)import, export)В Node.js таргете выбор формата влияет на результат:
{
"targets": {
"node": {
"outputFormat": "commonjs"
}
}
}
Результат:
const express = require("express");
module.exports = function app() {
return express();
};
{
"targets": {
"node": {
"outputFormat": "esmodule"
}
}
}
Результат:
import express from "express";
export function app() {
return express();
}
Node.js таргет учитывает также "type": "module" в
package.json, что влияет на интерпретацию файлов.
В серверной среде часто требуется сохранить структуру зависимостей. Parcel в Node.js таргете применяет особую стратегию:
node_modules часто помечаются как
external,require.Пример:
import lodash from "lodash";
import { readFile } from "fs";
После сборки:
lodash остаётся внешним пакетом,fs остаётся встроенным модулем Node.js,В браузерных сборках Parcel может добавлять полифилы для:
processBufferpathcryptoВ Node.js таргете это поведение отключается, так как среда уже предоставляет эти API.
Это уменьшает:
Node.js таргет активно использует process.env без
дополнительных преобразований.
const port = process.env.PORT || 3000;
Parcel не заменяет такие выражения автоматически, если не включена отдельная оптимизация через переменные окружения сборщика.
Хотя Node.js традиционно менее агрессивен к оптимизациям, Parcel всё равно применяет tree-shaking там, где это возможно:
Однако уровень агрессии ниже, чем в браузерных сборках, поскольку:
require сложнее анализировать,Node.js таргет активно поддерживает source maps:
Пример запуска:
node --enable-source-maps dist/node/index.js
Parcel генерирует .map файлы автоматически при
включённой конфигурации режима разработки или production.
Parcel позволяет комбинировать таргеты:
{
"targets": {
"browser": {
"context": "browser"
},
"node": {
"context": "node"
}
}
}
Это используется в архитектурах:
Общий код может компилироваться с учётом обеих сред, но с разными условиями выполнения:
if (typeof window !== "undefined") {
console.log("browser");
} else {
console.log("node");
}
В Node.js таргете доступ к файловой системе остаётся нативным:
import fs from "fs";
const data = fs.readFileSync("./config.json", "utf-8");
Parcel не вмешивается в такие вызовы и не пытается их абстрагировать, так как они являются частью runtime-среды.
Несмотря на гибкость, существуют ограничения:
node_modules,Эти особенности требуют точной настройки engines и
понимания целевой среды выполнения.