esbuild не объединяет файлы
Я пытаюсь использовать esbuild для объединения и минимизации файлов в проекте npm. Он сводит к минимуму каждый файл, который я передаю, но не объединяет. Это дает мне ошибку, когда я должен использовать outdir, когда есть несколько файлов. Однако это возвращает мне все эти файлы в свернутом виде в папке. Это не то поведение, которое я хочу и не связанное. Я просто хочу, чтобы он взял все эти файлы и слил их в один.
let {build} = require("esbuild");
let files = ["file1.js", "file2.js"];
build({
entryPoints: files,
outdir: "./views/dashboardPage/bundle",
minify: true,
bundle: true
}).catch(() => process.exit(1));
У меня для пакета установлено значение true, но он по-прежнему требует, чтобы я использовал outdir, и он просто возвращает мне эти файлы в свернутом виде. У них в основном 0 документации по этому поводу, и каждое сообщение в сети об этом просто скопировало / вставило README с GitHub. Как я могу связать его?
4 ответа
Каждый файл точки входа станет отдельным пакетом. Каждый пакет включает файл точки входа и все файлы, которые он импортирует. Прохождение двух точек входа создаст два отдельных пакета. Процесс объединения - это не то же самое, что объединение файлов.
Если вы хотите, чтобы все файлы были в одном пакете, вы можете ссылаться на них все из одного файла и использовать этот файл в качестве точки входа:
import "./file1.js"
import "./file2.js"
Выполнение этого с помощью esbuild может выглядеть примерно так:
let {build} = require("esbuild");
let files = ["./file1.js", "./file2.js"];
build({
stdin: { contents: files.map(f => `import "${f}"`).join('\n') },
outfile: "./views/dashboardPage/bundle.js",
minify: true,
bundle: true
}).catch(() => process.exit(1));
Основываясь на ответе Александра, я наконец пришел к этому решению, чтобы упаковать всю папку в один файл:
const esbuild = require('esbuild');
const glob = require('glob');
esbuild
.build({
stdin: { contents: '' },
inject: glob.sync('src/js/**/*.js'),
bundle: true,
sourcemap: true,
minify: true,
outfile: 'web/js/bundle.js',
})
.then(() => console.log("⚡ Javascript build complete! ⚡"))
.catch(() => process.exit(1))
Ты можешь использовать
inject
вариант ( https://esbuild.github.io/api/#inject ), например,
const options = {
entryPoints: ['index.js'],
inject: ['file1.js', ..., 'fileN.js'],
bundle: true,
minify: true,
sourcemap: true,
outdir: path,
};
esbuild.buildSync(options);
Проблема в том, что файлы не найдены.
Установите этот пакет, чтобы получить все файлы из папки:
npm i files-folder
Ваш файл esbuild.config.js будет выглядеть так:
import { filesFromFolder } from 'files-folder'
import esbuild from 'esbuild'
esbuild
.build({
entryPoints: filesFromFolder('src'),
bundle: true,
minify: true,
sourcemap: true,
target: 'node16',
define: { 'require.resolve': undefined },
platform: 'node',
allowOverwrite: true,
outdir: 'views/dashboardPage/bundle'
})
.catch((error) => {
process.exit(1)
})