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)
    })
Другие вопросы по тегам