As mentioned inGetting Started, there are multiple ways to define theentry property in your webpack configuration. We will show you the ways youcan configure theentry property, in addition to explaining why it may be useful to you.
Usage:entry: string | [string]
webpack.config.js
module.exports={ entry:'./path/to/my/entry/file.js',};The single entry syntax for theentry property is a shorthand for:
webpack.config.js
module.exports={ entry:{ main:'./path/to/my/entry/file.js',},};We can also pass an array of file paths to theentry property which creates what is known as a"multi-main entry". This is useful when you would like to inject multiple dependent files together and graph their dependencies into one "chunk".
webpack.config.js
module.exports={ entry:['./src/file_1.js','./src/file_2.js'], output:{ filename:'bundle.js',},};Single Entry Syntax is a great choice when you are looking to quickly set up a webpack configuration for an application or tool with one entry point (i.e. a library). However, there is not much flexibility in extending or scaling your configuration with this syntax.
Usage:entry: { <entryChunkName> string | [string] } | {}
webpack.config.js
module.exports={ entry:{ app:'./src/app.js', adminApp:'./src/adminApp.js',},};The object syntax is more verbose. However, this is the most scalable way of defining entry/entries in your application.
"Scalable webpack configurations" are ones that can be reused and combined with other partial configurations. This is a popular technique used to separate concerns by environment, build target, and runtime. They are then merged using specialized tools likewebpack-merge.
You can pass empty object{} toentry when you have only entry points generated by plugins.
An object of entry point description. You can specify the following properties.
dependOn: The entry points that the current entry point depends on. They must be loaded before this entry point is loaded.
filename: Specifies the name of each output file on disk.
import: Module(s) that are loaded upon startup.
library: Specifylibrary options to bundle a library from current entry.
runtime: The name of the runtime chunk. When set, a new runtime chunk will be created. It can be set tofalse to avoid a new runtime chunk since webpack 5.43.0.
publicPath: Specify a public URL address for the output files of this entry when they are referenced in a browser. Also, seeoutput.publicPath.
webpack.config.js
module.exports={ entry:{ a2:'dependingfile.js', b2:{ dependOn:'a2',import:'./src/app.js',},},};runtime anddependOn should not be used together on a single entry, so the following config is invalid and would throw an error:
webpack.config.js
module.exports={ entry:{ a2:'./a', b2:{ runtime:'x2', dependOn:'a2',import:'./b',},},};Make sureruntime must not point to an existing entry point name, for example the below config would throw an error:
module.exports={ entry:{ a1:'./a', b1:{ runtime:'a1',import:'./b',},},};AlsodependOn must not be circular, the following example again would throw an error:
module.exports={ entry:{ a3:{import:'./a', dependOn:'b3',}, b3:{import:'./b', dependOn:'a3',},},};Below is a list of entry configurations and their real-world use cases:
webpack.config.js
module.exports={ entry:{ main:'./src/app.js', vendor:'./src/vendor.js',},};webpack.prod.js
module.exports={ output:{ filename:'[name].[contenthash].bundle.js',},};webpack.dev.js
module.exports={ output:{ filename:'[name].bundle.js',},};What does this do? We are telling webpack that we would like 2 separate entry points (like the above example).
Why? With this, you can import required libraries or files that aren't modified (e.g. Bootstrap, jQuery, images, etc) insidevendor.js and they will be bundled together into their own chunk. Content hash remains the same, which allows the browser to cache them separately thereby reducing load time.
In webpack version < 4 it was common to add vendors as a separate entry point to compile it as a separate file (in combination with theCommonsChunkPlugin).
This is discouraged in webpack 4. Instead, theoptimization.splitChunks option takes care of separating vendors and app modules and creating a separate file.Do not create an entry for vendors or other stuff that is not the starting point of execution.
webpack.config.js
module.exports={ entry:{ pageOne:'./src/pageOne/index.js', pageTwo:'./src/pageTwo/index.js', pageThree:'./src/pageThree/index.js',},};What does this do? We are telling webpack that we would like 3 separate dependency graphs (like the above example).
Why? In a multi-page application, the server is going to fetch a new HTML document for you. The page reloads this new document and assets are redownloaded. However, this gives us the unique opportunity to do things like usingoptimization.splitChunks to create bundles of shared application code between each page. Multi-page applications that reuse a lot of code/modules between entry points can greatly benefit from these techniques, as the number of entry points increases.
As a rule of thumb: Use exactly one entry point for each HTML document. See the issuedescribed here for more details.