Как создать несколько выходных путей в конфигурации Webpack


165

Кто-нибудь знает, как создать несколько выходных путей в файле webpack.config.js? Я использую bootstrap-sass, который поставляется с несколькими различными файлами шрифтов и т. Д. Для веб-упаковки, чтобы обработать их, я включил загрузчик файлов, который работает правильно, однако файлы, которые он выводит, сохраняются в пути вывода, который я указал для остальные мои файлы:

    output: {
      path: __dirname + "/js",
      filename: "scripts.min.js"
    }

Я хотел бы достичь чего-то, где я мог бы, возможно, взглянуть на типы расширений для того, что выводит веб-пакет, и для вещей, заканчивающихся на .woff .eot и т. Д., Чтобы они были перенаправлены на другой путь вывода. Это возможно?

Я немного погуглил и наткнулся на эту * проблему на github, где предлагается пара решений, отредактируйте:

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

var entryPointsPathPrefix = './src/javascripts/pages';
var WebpackConfig = {
  entry : {
    a: entryPointsPathPrefix + '/a.jsx',
    b: entryPointsPathPrefix + '/b.jsx',
    c: entryPointsPathPrefix + '/c.jsx',
    d: entryPointsPathPrefix + '/d.jsx'
  },

  // send to distribution
  output: {
    path: './dist/js',
    filename: '[name].js'
  }
}

* https://github.com/webpack/webpack/issues/1189

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

Ответы:


221

Я не уверен, есть ли у нас такая же проблема, поскольку webpack поддерживает только один вывод на конфигурацию по состоянию на июнь 2016 года. Я думаю, вы уже видели проблему на Github .

Но я разделяю путь вывода с помощью мультикомпилятора . (т.е. разделение объекта конфигурации webpack.config.js).

var config = {
    // TODO: Add common Configuration
    module: {},
};

var fooConfig = Object.assign({}, config, {
    name: "a",
    entry: "./a/app",
    output: {
       path: "./a",
       filename: "bundle.js"
    },
});
var barConfig = Object.assign({}, config,{
    name: "b",
    entry: "./b/app",
    output: {
       path: "./b",
       filename: "bundle.js"
    },
});

// Return Array of Configurations
module.exports = [
    fooConfig, barConfig,       
];

Если у вас есть общая конфигурация среди них, вы можете использовать библиотеку расширений или Object.assignв ES6 или {...}оператора распространения в ES7.


Я не запускал фрагмент кода, может произойти какая-то ошибка или опечатка
Yeo

Я запустил ваш фрагмент, работает как шарм ... Удивлен, что никто не заметил этого, а разработчики внешнего интерфейса, нет терпения, всегда в спешке ;-). Я экспортирую конфиги таким же образом, но мое объявление отличается / стандартное: var config = {entry: SOURCE_DIR + '/index.jsx', ....} Также не использовался мультикомпилятор: - \
Aubergine

Или вы можете просто сделать webpack && cp и т.д. в npm?
SuperUberDuper

1
Для меня очень полезно развернуть пакет npm как в исходной папке (автоматические тесты есть), так и в папке приложения, которое реализует пакет. Таким образом, я могу пропустить шаг загрузки npm и протестировать мой обновленный код пакета в реальном времени, пока новая версия не станет стабильной и не будет готова к публикации на npm.
Адриан Мойса

<pre> <code> var config = {// TODO: Добавить общий модуль конфигурации: {},}; </ code> </ pre> module{}Объект неверный. Это не обязательно. Он будет расширен / слиты на том же уровне в качестве ключевых слов name, entry, output(из вашего примера). <pre> <code> {module: {mode: "development", devtool: "source-map"}}, имя: "a", запись: "./a/app", вывод: {путь: "/ a ", имя файла:" bundle.js "}} </ code> </ pre>
Роб Ваа

249

Webpack поддерживает несколько путей вывода.

Установите выходные пути в качестве ключа ввода. И используйте nameшаблон вывода.

Конфигурация веб-пакета:

entry: {
    'module/a/index': 'module/a/index.js',
    'module/b/index': 'module/b/index.js',
},
output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].js'
}

Генерация:

└── module
    ├── a
    │   └── index.js
    └── b
        └── index.js

4
В моем случае я хочу, чтобы один вывод не содержал chunkhash, есть ли простое решение для этого? Спасибо.
raRaRa

1
@zhengkenghong Я верю, что сгенерированный выходной путь понадобится distв нем. Таким образом, вместо того, module/a/index.jsчтобы быть выходным путем, это должно быть module/a/dist/index.jsИначе, вы переопределяете свои входные файлы.
dance2die

1
distПапка @Sung уже настроена в выходном пути. Таким образом, сгенерированный файл будет на самом деле dist/module/a/index.js, о котором я не упомянул.
zhengkenghong

4
Я думаю, что это должен быть принятый ответ, так как это ответ из веб-пакета 4 документа. -> webpack.js.org/concepts/output/#multiple-entry-points
будет

1
@raRaRa Поздно на вечеринке, но вы можете сделать это, используя функцию, описаннуюoutput.filename здесь: webpack.js.org/configuration/output/#outputfilename
Thomas,

22

Если вы можете жить с несколькими путями вывода, имеющими одинаковый уровень глубины и структуру папок, есть способ сделать это в веб-пакете 2 (еще предстоит протестировать с веб-пакетом 1.x)

По сути, вы не следуете правилам документа и указываете путь к имени файла.

module.exports = {
    entry: {
      foo: 'foo.js',
      bar: 'bar.js'
    },

    output: {
      path: path.join(__dirname, 'components'),
      filename: '[name]/dist/[name].bundle.js', // Hacky way to force webpack   to have multiple output folders vs multiple files per one path
    }
};

Это займет эту структуру папок

/-
  foo.js
  bar.js

И превратить это в

/-
  foo.js
  bar.js
  components/foo/dist/foo.js
  components/bar/dist/bar.js

@ccnixon это задокументировано здесь webpack.js.org/configuration/output/#outputfilename seach для «все еще разрешено».
Джон Хенкель

3

Я написал плагин, который, можно надеяться, будет делать то, что вы хотите, вы можете указать известные или неизвестные точки входа (используя glob ) и указать точные выходные данные или динамически сгенерировать их, используя путь и имя файла входа. https://www.npmjs.com/package/webpack-entry-plus


3

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

В этом случае я бы рекомендовал использовать вместо этого плагин FileManagerWebpackPlugin:

const FileManagerPlugin = require('filemanager-webpack-plugin');
// ...
plugins: [
    // ...
    new FileManagerPlugin({
      onEnd: {
        copy: [{
          source: './dist/*.*',
          destination: './public/',
        }],
      },
    }),
],

1

Вы можете иметь только один выходной путь.

из документов https://github.com/webpack/docs/wiki/configuration#output

Параметры, влияющие на вывод компиляции. параметры вывода сообщают Webpack, как записывать скомпилированные файлы на диск. Обратите внимание, что хотя может быть несколько точек входа, указывается только одна выходная конфигурация.

Если вы используете хеширование ([hash] или [chunkhash]), убедитесь, что у вас есть последовательный порядок модулей. Используйте OccurenceOrderPlugin или recordsPath.


Спасибо. Я уйду из Q на тот случай, если кто-то сможет найти обходной путь.
Спб

Какой у вас сценарий использования 2 путей вывода? Похоже, вы хотите 2 приложения или 1 приложение и 1 модуль.
экс-зак-тли

я подумал, что мне нужен тот, который был посвящен выводу, сгенерированному файловым загрузчиком, который все входил в корень проекта, тогда как я хотел его в своей собственной папке. я просто перенаправил выходной путь в самом загрузчике в соответствии с моим ответом ниже.
Спб

1
Это не совсем верно. Технически вы можете указать только один выходной путь, но он будет применяться к каждому ключу в объекте ввода, что позволит вам иметь несколько выходов - webpack.js.org/concepts/entry-points
sanjsanj

0

На самом деле я просто зашел в index.js в модуле загрузчика файлов и изменил, куда было отправлено содержимое. Возможно, это не оптимальное решение, но пока нет другого пути, это нормально, так как я точно знаю, что обрабатывается этим загрузчиком, который является просто шрифтами.

//index.js
var loaderUtils = require("loader-utils");
module.exports = function(content) {
    this.cacheable && this.cacheable();
    if(!this.emitFile) throw new Error("emitFile is required from module system");
    var query = loaderUtils.parseQuery(this.query);
    var url = loaderUtils.interpolateName(this, query.name || "[hash].[ext]", {
        context: query.context || this.options.context,
        content: content,
        regExp: query.regExp
    });
    this.emitFile("fonts/"+ url, content);//changed path to emit contents to "fonts" folder rather than project root
    return "module.exports = __webpack_public_path__ + " + JSON.stringify( url) + ";";
}
module.exports.raw = true;

1
Не знаю, если это все еще проблема для вас, но посмотрите на npmjs.com/package/webpack-entry-plus
sanjsanj
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.