Comment définir plusieurs entrées/sorties de fichiers dans un projet avec webpack?
Je suis http://webpack.github.io/docs/tutorials/getting-started/ compilation réussie si un seul fichier est inséré dans une entrée/sortie ...
annuaire
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
...
comment sortir comme ça?
././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"
// }
};
Pour de nombreux points d'entrée, utilisez des tableaux en tant que valeur de la propriété entry
:
entry: {
app: ['./app/main.js', '.lib/index.js'],
vendors: ['react']
}
app
et vendors
sont des tableaux, vous pouvez donc y placer autant de chemins de fichiers que nécessaire.
Pour le cas de sortie:
output: {
path: staticPath,
filename: '[name].js'
}
Le [name]
est tiré de entry
propriétés, donc si nous avons app
et vendors
comme propriétés, nous aurons 2 fichiers de sortie - app.js
et vendors.js
.
Si vous voulez sortir dans plusieurs répertoires, vous pouvez utiliser le chemin comme nom d'entrée. Par exemple, si vous voulez cette structure de répertoire:
apps
├── dir1
│ └── js
│ ├── main.js [entry 1]
│ └── bundle.js [output 1]
└── dir2
├── index.js [entry 2]
└── foo.js [output 2]
Ensuite, essayez ceci dans votre 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'
},
...
}
voici ce qui a vraiment résolu le problème:
entry: {
app : __dirname + "/app/views/app/app.js",
admin : __dirname + "/app/views/admin/admin.js"
}
output: {
path: __dirname + "/public",
filename: "[name].js"
},
Que faire si vous voulez obtenir les fichiers de sortie au format foo.css
et bar.js
à la fois? les réponses ci-dessus semblent incapables de gérer cela.
La bonne façon est d'utiliser multi-compilateur . Un fichier d'entrée un objet de configuration un fichier de sortie. De ceci réponse .
ce plugin webpack web-webpack-plugin peut le résoudre de manière exemplaire.
AutoWebPlugin
peut trouver toutes les entrées de page dans un répertoire, puis configure automatiquement un WebPlugin
pour chaque page générant un fichier html. Vous pouvez l'utiliser comme suit:
config webpack
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'],
}),
]
};
répertoire src
── src
│ ├── home
│ │ └── index.js
│ ├── ie_polyfill.js
│ ├── login
│ │ └── index.js
│ ├── polyfill.js
│ ├── signup
│ │ └── index.js
│ └── template.html
répertoire de sortie
├── dist
│ ├── common.js
│ ├── home.html
│ ├── home.js
│ ├── ie_polyfill.js
│ ├── login.html
│ ├── login.js
│ ├── polyfill.js
│ ├── signup.html
│ └── signup.js
AutoWebPlugin
trouve toute la page home login signup
répertoire dans ./src/
, pour ces trois pages home login signup
utilisera index.js
en tant que fichier principal et sortie trois fichiers html home.html login.html signup.html`
Cette question a deux ans et je pense donc que l'auteur est presque certainement passé à autre chose, mais pour ceux qui débarquent ici plus récemment, j'avais un besoin très similaire et j'étais capable d'écrire mon propre plugin pour autoriser des chemins/noms de sortie dynamiques à partir de points d'entrée connus et/ou inconnus.
Mon problème et le processus de pensée pour la solution peuvent être trouvés ici .
Vous pouvez détecter plusieurs entrées et générer des fichiers de sortie distincts en utilisant des modèles glob sync .
Mettez ceci dans votre webpack.config.js
(sans le ...
)
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, "")
},
...
});
Ce "devrait" vous donner la sortie souhaitée.
Pour mon cas d'utilisation, j'avais réellement besoin d'utiliser différents modèles basés sur l'environnement. Pour cela j'ai passé la variable NODE_ENV
module.exports = (env, argv) => {
const ENVIRONMENT = env.NODE_ENV;
let INDEX_HTML = 'index.html';
if (ENVIRONMENT === 'staging') {
INDEX_HTML = 'index-stg.html';
}
Ensuite:
if (NODE_ENV === 'staging') {
INDEX_HTML = 'index-stg.html';
}
Dans la sortie:
output: {
path: process.cwd() + '/build',
filename: `[name].js`,
chunkFilename: `[${HASH_MODE}].[name].js`
},
plugins:
new HtmlWebpackPlugin({
inject: true,
template: `app/${INDEX_HTML}`,
}),