Як встановити кілька входів і виходів файлів у проекті за допомогою webpack?


77

Як встановити кілька входів / виходів файлів у проекті за допомогою webpack?

Я стежу за http://webpack.github.io/docs/tutorials/getting-started/ успішною компіляцією, якщо лише один файл в одному вході / виході ...

каталог

app
webpack.config.js
./assets
././javascripts/Administrator/Article/Create/Base.js
././javascripts/Administrator/Article/Edit/Base.js
././javascripts/Account/Index/Base.js
././javascripts/Contact/Index/Base.js
...

як вивести так?

././javascripts/Administrator/Article/Create/bundle.js
././javascripts/Administrator/Article/Edit/bundle.js
././javascripts/Account/Index/bundle.js
././javascripts/Contact/Index/bundle.js

webpack.config.js

module.exports = {
  entry: {
    'AdministratorArticleCreate':['./assets/javascripts/Administrator/Article/Create/Base.js']
  },
  output: {
    path: 
  }

    // if only one file
    // entry: "./assets/javascripts/Administrator/Article/Create/Base.js",
    // output: {
    //     // path: __dirname,
    //     path: "./assets/javascripts/Administrator/Article/Create/",
    //     filename: "bundle.js"
    // }
};

1
Я також зустрів цю проблему і не можу знайти рішення. Було б чудово, якби хтось міг поділитися рішенням
Kania

Відповіді:


72

Для багатьох точок входу використовують масиви як значення entryвластивості:

entry: {
  app: ['./app/main.js', '.lib/index.js'],
  vendors: ['react']
}

appі vendorsє масивами, тому ви можете розмістити там стільки шляхів до файлів, скільки вам потрібно.

Для випадку виводу:

output: {
  path: staticPath,
  filename: '[name].js'
}

[name]Береться з entryвластивостей, так що якщо у нас є appі vendorsяк властивості, ми отримали 2 вихідних файлів - app.jsі vendors.js.

Посилання на документацію


6
Що ви хочете мати різні розширення файлів, наприклад, вихід app.jsі styles.css?
Борек Бернард

1
Чи можна мати різну вихідну папку?
Тайлер Лонг

2
Як я можу зробити щось подібне entry: ./app/js/*.js? Помістити ім’я файлу по одному надто боляче.
Вільям Кеннеді,

що це означає для часу компіляції. 'main.js' може запитувати модуль у index.js?
pery mimon

не працює! запис: {app: settings.themeLocation + "js / vote-scripts.js"}, вихід: {path: path.resolve (__ dirname, settings.themeLocation + "js"), ім'я файлу: "[name] .js"}
Tintinabulator Zea

57

Якщо ви хочете вивести дані у декілька каталогів, ви можете використовувати шлях як ім'я запису. Наприклад, якщо вам потрібна така структура каталогів:

apps
├── dir1
│   └── js
│       ├── main.js [entry 1]
│       └── bundle.js [output 1]
└── dir2
    ├── index.js [entry 2]
    └── foo.js [output 2]

Потім спробуйте це у своєму модулі.exports:

{
  entry: {
    'dir1/js/bundle': path.resolve(__dirname, '/apps/dir1/js/main.js'),
    'dir2/foo' : path.resolve(__dirname, '/apps/dir2/index.js')
  },
  output: {
    path: path.resolve(__dirname, '/apps'),
    filename: '[name].js'
  },
  ...
}

10
блискуче - помістіть елементи шляху в "ім'я" точки входу ...
HDave

2
Дякуємо, що насправді надали наочну схему того, як це працює.
Мартін Доусон,

2
корисно, за винятком дублікатів назв каталогів
JacopKane

Трохи хакерський і (мабуть) неофіційний, але хороший. Дійсно хороший.
ecc521

29

що насправді вирішило це для мене:

entry:  {
    app : __dirname + "/app/views/app/app.js",
    admin : __dirname + "/app/views/admin/admin.js"
}

output: {
    path: __dirname + "/public",
    filename: "[name].js"
},

3
Єдине, що я хотів би відзначити, це те, що цей ключ використовує для заміни "[ім'я]", тому в ключі не може бути недійсних символів (наприклад, local-admin не буде дійсним), але це досить незначно.
Sirius_B

7

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

Покладіть це у свій webpack.config.js(без ...)

const glob = require("glob");
...
module.exports = (env, options) => ({
  ...
  entry: glob.sync("./javascripts/**/*.js").reduce((acc, item) => {
    const path = item.split("/");
    path.pop();
    const name = path.join('/');
    acc[name] = item;
    return acc;
  }, {}),
  output: {
    filename: "[name]/bundle.js",
    path: path.resolve(__dirname, "")
  },
  ...
});

Це "повинно" дати вам бажаний результат.


6

Що робити , якщо ви хочете , щоб отримати вихідні файли , як foo.cssі bar.jsв той же час? наведені вище відповіді здаються нездатними впоратися з цим.

Розумний спосіб - використовувати мультикомпілятор . Один вхідний файл, один об'єкт конфігурації, один вихідний файл. З цієї відповіді .


3

цей плагін webpack web-webpack-plugin може вирішити це зразком.

AutoWebPluginможна знайти всі записи сторінки в каталозі, а потім автоматично налаштувати WebPluginкожну сторінку для виведення файлу html, ви можете використовувати його, як показано нижче:

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

module.exports = {
    plugins: [
        new AutoWebPlugin(
            // the directory hold all pages
            './src/', 
            {
            // the template file path used by all pages
            template: './src/template.html',
            // javascript main file for current page,if it is null will use index.js in current page directory as main file
            entity: null,
            // extract common chunk for all pages and then put it into a file named common,if it is null then not do extract action
            // achieve by CommonsChunkPlugin
            commonsChunk: 'common',
            // pre append to all page's entry
            preEntrys:['./path/to/file1.js'],
            // post append to all page's entry
            postEntrys:['./path/to/file2.js'],
        }),
    ]
};

каталог src

── src
│   ├── home
│   │   └── index.js
│   ├── ie_polyfill.js
│   ├── login
│   │   └── index.js
│   ├── polyfill.js
│   ├── signup
│   │   └── index.js
│   └── template.html

вихідний каталог

├── dist
│   ├── common.js
│   ├── home.html
│   ├── home.js
│   ├── ie_polyfill.js
│   ├── login.html
│   ├── login.js
│   ├── polyfill.js
│   ├── signup.html
│   └── signup.js

AutoWebPluginзнайдіть home login signupкаталог усіх сторінок у ./src/, для цього home login signupбудуть використовуватися ці три сторінкиindex.js як основний файл і вивести три файли html home.html login.html signup.html`

див. документ: автоматичне виявлення входу html


2

Цьому питанню 2 роки, тому я думаю, що автор майже напевно перейшов від цього питання, але для тих, хто приземлявся тут нещодавно, я мав справді подібну потребу і зміг написати власний плагін, щоб дозволити динамічні вихідні шляхи / імена з відомі та / або невідомі точки входу.

Мою проблему та процес роздумів можна знайти тут .

І сам пакет Node тут .


1

Для мого випадку мені фактично потрібно було використовувати різні шаблони на основі середовища. Для досягнення цього я передав змінну NODE_ENV

module.exports = (env, argv) => {
  const ENVIRONMENT = env.NODE_ENV;
  let INDEX_HTML = 'index.html';
  if (ENVIRONMENT === 'staging') {
    INDEX_HTML = 'index-stg.html';
  }

Тоді:

if (NODE_ENV === 'staging') {
   INDEX_HTML = 'index-stg.html';
}

На виході:

output: {
      path: process.cwd() + '/build',
      filename: `[name].js`,
      chunkFilename: `[${HASH_MODE}].[name].js`
    },

плагіни:

new HtmlWebpackPlugin({
        inject: true,
        template: `app/${INDEX_HTML}`,
      }),
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.