Wie kann ich mit Webpack die Eingabe und Ausgabe mehrerer Dateien im Projekt festlegen?


76

Wie kann ich mit einem Webpack die Eingabe / Ausgabe mehrerer Dateien im Projekt festlegen?

Ich folge http://webpack.github.io/docs/tutorials/getting-started/ Erfolgskompilierung, wenn nur eine Datei in einem Eintrag / einer Ausgabe ...

Verzeichnis

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
...

wie so ausgeben?

././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
Ich bin auch auf dieses Problem gestoßen und kann keine Lösung finden. Wäre toll, wenn jemand eine Lösung teilen könnte
Kania

Antworten:


72

Verwenden Sie für viele Einstiegspunkte Arrays als Wert für die entryEigenschaft:

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

appund vendorssind Arrays, sodass Sie dort so viele Dateipfade platzieren können, wie Sie benötigen.

Für Ausgabefall:

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

Das [name]wird von entryEigenschaften übernommen. Wenn wir also appund vendorsals Eigenschaften haben, haben wir 2 Ausgabedateien - app.jsund vendors.js.

Dokumentationslink


5
Was möchten Sie verschiedene Dateierweiterungen haben, zB Ausgabe app.jsund styles.css?
Borek Bernard

1
Ist es möglich, einen anderen Ausgabeordner zu haben?
Tyler Long

2
Wie kann ich so etwas machen entry: ./app/js/*.js? Dateinamen nacheinander eingeben ist zu schmerzhaft.
William Kennedy

Was bedeutet das zur Kompilierungszeit? 'main.js' kann bei index.js nach einem Modul fragen?
pery mimon

funktioniert nicht! Eintrag: {app: settings.themeLocation + "js / vote-scripts.js"}, Ausgabe: {path: path.resolve (__ dirname, settings.themeLocation + "js"), Dateiname: "[name] .js"}
Tintinabulator Zea

57

Wenn Sie in mehrere Verzeichnisse ausgeben möchten, können Sie den Pfad als Eintragsnamen verwenden. Zum Beispiel, wenn Sie diese Verzeichnisstruktur möchten:

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

Versuchen Sie dies dann in Ihrem module.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
brillant - setzen Sie die
Pfadelemente

2
Vielen Dank, dass Sie tatsächlich ein visuelles Diagramm zur Funktionsweise bereitgestellt haben.
Martin Dawson

2
nützlich mit Ausnahme der doppelten Verzeichnisnamen
JacopKane

Etwas hackig und (wahrscheinlich) inoffiziell, aber gut. Ein wirklich guter.
ecc521

28

Was es für mich wirklich gelöst hat, war Folgendes:

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

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

3
Das einzige, was ich bemerken würde, ist, dass dies den Schlüssel verwendet, um "[Name]" zu ersetzen, so dass Sie keine ungültigen Zeichen im Schlüssel haben können (z. B. würde der lokale Administrator nicht gültig sein), aber dies ist eher geringfügig.
Sirius_B

7

Sie können mehrere Einträge erkennen und separate Ausgabedateien mithilfe von Glob-Synchronisierungsmustern generieren .

Setzen Sie dies in Ihre webpack.config.js(ohne die ...)

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, "")
  },
  ...
});

Dieses "sollte" gibt Ihnen die gewünschte Ausgabe.


6

Was passiert , wenn Sie die Ausgabedateien bekommen foo.cssund bar.jszur gleichen Zeit? Die obigen Antworten scheinen nicht in der Lage zu sein, damit umzugehen.

Der vernünftige Weg ist die Verwendung eines Multi-Compilers . Eine Eingabedatei, ein Konfigurationsobjekt, eine Ausgabedatei. Davon Antwort .


3

Dieses Webpack-Plugin Web-Webpack-Plugin kann es auf beispielhafte Weise beheben.

AutoWebPlugin kann alle Seiteneinträge in einem Verzeichnis finden und dann automatisch konfigurieren WebPlugin für jede Seite eine HTML-Datei ausgeben. Sie können sie wie folgt verwenden:

Webpack-Konfiguration

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 Verzeichnis

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

Ausgabe Verzeichnis

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

AutoWebPluginFinden Sie alle Seitenverzeichnisse home login signupin ./src/, für diese drei Seiten home login signupwird verwendetindex.js als Hauptdatei verwendet und geben drei HTML-Dateien home.html login.html signup.html` aus

siehe doc: HTML-Eintrag automatisch erkennen



1

Für meinen Anwendungsfall musste ich je nach Umgebung unterschiedliche Vorlagen verwenden. Um dies zu erreichen, habe ich die Variable NODE_ENV übergeben

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

Dann:

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

In der Ausgabe:

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

Plugins:

new HtmlWebpackPlugin({
        inject: true,
        template: `app/${INDEX_HTML}`,
      }),
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.