v4.0.0-beta.0
Pre-release
Pre-release
Big changes
- Environment
- Node.js 4 is no longer supported. Source Code was upgraded to a higher ecmascript version.
- Usage
- You have to choose (
mode
or--mode
) between two modes now: production or development- production enables all kind of optimizations to generate optimized bundles
- development enables comments and hint for development and enables the eval devtool
- WIP: addition hints in development mode
- production doesn't support watching, development is optimized for fast incremental rebuilds
- production also enables module concatenating (Scope Hoisting)
- You can configure this in detail with the flags in
optimization.*
(build your custom mode) process.env.NODE_ENV
are set to production or development (only in built code, not in config)- There is a hidden
none
mode which disables everything
- You have to choose (
- Syntax
import()
always returns a namespace object. CommonJS modules are wrapped into the default export- This probably breaks your code, if you used to import CommonJs with
import()
- This probably breaks your code, if you used to import CommonJs with
- Configuration
- You no longer need to use these plugins:
NoEmitOnErrorsPlugin
->optimization.noEmitOnErrors
(on by default in production mode)ModuleConcatenationPlugin
->optimization.concatenateModules
(on by default in production mode)NamedModulesPlugin
->optimization.namedModules
(on by default in develoment mode)
CommonsChunkPlugin
was removed ->optimization.splitChunks
- You no longer need to use these plugins:
- JSON
- webpack now handles JSON natively
- You may need to add
type: "javascript/auto"
when transforming JSON via loader to JS - Just using JSON without loader should still work
- You may need to add
- allows to import JSON via ESM syntax
- unused exports elimination for JSON modules
- webpack now handles JSON natively
- Optimization
- Upgrade uglifyjs-webpack-plugin to v1
- ES15 support
- Upgrade uglifyjs-webpack-plugin to v1
Big features
- Modules
- webpack now supports these module types:
- javascript/auto: (The default one in webpack 3) Javascript module with all module systems enabled: CommonJS, AMD, ESM
- javascript/esm: EcmaScript modules, all other module system are not available
- javascript/dynamic: Only CommonJS and, EcmaScript modules are not available
- json: JSON data, it's available via require and import
- webassembly/experimental: WebAssembly modules (currently experimental)
javascript/esm
handles ESM more strictly compared tojavascript/auto
:- Imported names need to exist on imported module
- Dynamic modules (non-esm, i. e. CommonJs) can only imported via
default
import, everything else (including namespace import) emit errors
- In
.mjs
modules isjavascript/esm
by default - WebAssembly modules
- can import other modules (JS and WASM)
- Exports from WebAssembly modules are validated by ESM import
- You'll get a warning/error when trying to import a non-existing export from WASM
- can only be used in async chunks. They doesn't work in initial chunks (would be bad for web performance)
- Import modules using WASM via
import()
- Import modules using WASM via
- webpack now supports these module types:
- Optimization
sideEffects: false
is now supported in package.json- Instead of a JSONP function a JSONP array is used -> async support
- New
optimization.splitChunks
option was introduced
Details: https://gist.github.com/sokra/1522d586b8e5c0f5072d7565c2bee693 - Dead branches are now removed by webpack itself
- Before: Uglify removed the dead code
- Now: webpack removes the dead code (in some cases)
- This prevents crashing when
import()
occur in a dead branch
- Syntax
webpackInclude
andwebpackExclude
are supported by the magic comment forimport()
. They allow to filter files when using a dynamic expression.- Using
System.import()
now emits a warning- You can disable the warning with
Rule.parser.system: true
- You can disable
System.import
withRule.parser.system: false
- You can disable the warning with
- Configuration
- Resolving can now be configured with
module.rules[].resolve
. It's merged with the global configuration. optimization.minimize
has been added to switch minimizing on/off- By default: on in production mode, off in development mode
optimization.minimizer
has been added to configurate minimizers and options- many config options which support placeholders now also support a function
- Resolving can now be configured with
- Usage
- Some Plugin options are now validated
- WIP: Better output, no process exit, stack trace, more plugins
- CLI has been move to webpack-cli, you need to install
webpack-cli
to use the CLI - The ProgressPlugin (
--progress
) now displays plugin names- At least for plugins migrated to the new plugin system
- Some Plugin options are now validated
- Performance
- UglifyJs now caches and parallizes by default
- Multiple performance improvements, especially for faster incremental rebuilds
- performance improvement for RemoveParentModulesPlugin
- Stats
- Stats can display modules nested in concatenated modules
Features
- Configuration
- Module type is automatically choosen for mjs, json and wasm extensions. Other extensions need to be configured via
module.rules[].type
- Incorrect
options.dependencies
configurations now throw error Rule.ident
is now allowed by schemasideEffects
can be overriden via module.rulesoutput.hashFunction
can now be a Constructor to a custom hash function- You can provide a non-cryto hash function for performance reasons
- add
output.globalObject
config option to allow to choose the global object reference in runtime exitCode
- Module type is automatically choosen for mjs, json and wasm extensions. Other extensions need to be configured via
- Runtime
- Error for chunk loading now includes more information and two new properties
type
andrequest
.
- Error for chunk loading now includes more information and two new properties
- Performance
- webpacks AST can be passed directly from loader to webpack to avoid extra parsing
- Unused modules are no longer unnecessarly concatenated
- Add a ProfilingPlugin which write a (Chrome) profile file which includes timings of plugins
- Migrate to using
for of
instead offorEach
- Migrate to using
Map
andSet
instead of Objects - Migrate to using
includes
instead ofindexOf
- Replaced some RegExp with string methods
- Queue don't enqueues the same job twice
- Optimization
- When using more than 25 exports mangled export names are shorter.
- script tags are no longer
text/javascript
andasync
as this are the default values (saves a few bytes) - The concatenated module now generates a bit less code
- constant replacements now don't need
__webpack_require__
and argument is omitted
- Defaults
- webpack now looks for the
.wasm
,.mjs
,.js
and.json
extensions in this order output.pathinfo
is now on by default in develoment mode- in-memory caching is now off by default in production
entry
defaults to./src
output.path
defaults to./dist
- Use
production
defaults when omiting themode
option
- webpack now looks for the
- Usage
- Add detailed progress reporting to SourceMapDevToolPlugin
- Stats
- Sizes are now shown in kiB instead of kB in Stats
- entrypoints are now shows by default in Stats
- chunks now display
<{parent}>
>{children}<
and={siblings}=
in Stats
- Syntax
- A resource query is supported in context
- Parser now understand
new Foo()
expressions - Parser can now evaluate
**
,&
,|
,^
,>>>
,>>
,<<
and~
- Referencing entry point name in
import()
now emits a error instead of a warning - Upgraded to acorn 5
Bugfixes
- Generated comments no longer break on
*/
- webpack no longer modifies the passed options object
- Compiler "watch-run" hook now has the Compiler as first parameter
- add
chunkCallbackName
to the schema to allow configurating WebWorker template - Using
module.id/loaded
now correctly bails out of Module Concatentation (Scope Hoisting) - OccurenceOrderPlugin now sorts modules in correct order (instead of reversed)
- timestamps for files are read from watcher when calling
Watching.invalidate
- Avoid using
process.exit
and useprocess.exitCode
instead - fix bluebird warning in
webpack/hot/signal
- fix incorrect
-!
behavior with post loaders - add
run
andwatchRun
hooks forMultiCompiler
this
is now undefined in ESM- Initial chunks no longer contribute to chunkhash of runtime chunk and hashes don't occur in chunk hash map
- VariableDeclaration are correctly identified as
var
,const
orlet
- Parser now parse the source code with the correct source type (module/script) when the module type
javascript/dynamic
orjavascript/module
is used.
Internal changes
- Replaced
plugin
calls withtap
calls (new plugin system) - Migrated many deprecated plugins to new plugin system API
- added
buildMeta.exportsType: "default"
for json modules - Remove unused methods from Parser (parserStringArray, parserCalculatedStringArray)
- Remove ability to clear BasicEvaluatedExpression and to have multiple types
- Buffer.from instead of new Buffer
- Avoid using forEach and use for of instead
Removed features
- removed
module.loaders
- removed
loaderContext.options
- removed
Compilation.notCacheable
flag - removed
NoErrorsPlugin
- removed
Dependency.isEqualResource
- removed
NewWatchingPlugin
- removed
CommonsChunkPlugin
Breaking changes for plugins/loaders
- new plugin system
plugin
method is backward-compatible- Plugins should use
Compiler.hooks.xxx.tap(<plugin name>, fn)
now
- New major version of enhanced-resolve
- Templates for chunks may now generate multiple assets
Chunk.chunks/parents/blocks
are no longer Arrays. A Set is used internally and there are methods to access it.Parser.scope.renames
andParser.scope.definitions
are no longer Objects/Arrays, but Map/Sets.- Parser uses
StackedSetMap
(LevelDB-like datastructure) instead of Arrays Compiler.options
is no longer set while applying plugins- Harmony Dependencies has changed because of refactoring
Dependency.getReference()
may now return aweak
property.Dependency.weak
is now used by theDependency
base class and returned in the base impl ofgetReference()
- Constructor arguments changed for all
Module
s - Merged options into options object for
ContextModule
andresolveDependencies
- Changed and renamed dependencies for `import()
- Moved
Compiler.resolvers
intoCompiler.resolverFactory
accessible with plugins Dependency.isEqualResource
has been replaced withDependency.getResourceIdentifier
- Methods on
Template
are now static - A new RuntimeTemplate class has been added and
outputOptions
andrequestShortener
has been moved to this class- Many methods has been updated to use the RuntimeTemplate instead
- We plan to move code which accesses the runtime to this new class
Module.meta
has been replaced withModule.buildMeta
Module.buildInfo
andModule.factoryMeta
have been added- Some properties of
Module
have been moved into the new objects - added
loaderContext.rootContext
which points to thecontext
options. Loaders may use it to make stuff relative to the application root. - add
this.hot
flag to loader context when HMR is enabled buildMeta.harmony
has been replaced withbuildMeta.exportsType: "namespace
- The chunk graph has changed:
- Before: Chunks were connected with parent-child-relationships.
- Now: ChunkGroups are connected with parent-child-relationships. ChunkGroups contain Chunks in order.
- Before: AsyncDependenciesBlocks reference a list of Chunks in order.
- Now: AsyncDependenciesBlocks reference a single ChunkGroup.
- file/contextTimestamps are Maps now
map/foreach
Chunks/Modules/Parents
methods are now deprecated/removed- NormalModule accept options object in Constructor
- Added required generator argument for NormalModule
- Added
createGenerator
andgenerator
hooks for NormalModuleFactory to customize code generation - Allow to customize render manifest for Chunks via hooks