web
web copied to clipboard
Update dependency webpack to v4 (master)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| webpack | dependencies | major | ^3.12.0 -> ^4.0.0 |
By merging this PR, the issue #465 will be automatically resolved and closed:
| Severity | CVE | |
|---|---|---|
High |
8.8 | CVE-2022-46175 |
High |
7.5 | CVE-2020-28469 |
High |
7.5 | CVE-2021-3807 |
Medium |
5.3 | CVE-2020-7608 |
Medium |
5.1 | WS-2019-0307 |
Release Notes
webpack/webpack
v4.0.0
Big changes
- Environment
- Node.js 4 is no longer supported. Source Code was upgraded to a higher ecmascript version.
- Usage
- You have to choose (
modeor--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
- 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_ENVare set to production or development (only in built code, not in config) - There is a hidden
nonemode 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)
-
-
CommonsChunkPluginwas removed ->optimization.splitChunks,optimization.runtimeChunk
- 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/esmhandles 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
defaultimport, everything else (including namespace import) emit errors
- In
.mjsmodules arejavascript/esmby 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
- This is an experimental feature and subject of change
- webpack now supports these module types:
- Optimization
-
sideEffects: falseis now supported in package.json-
sideEffectsin package.json also supports glob expressions and arrays of glob expressions
-
- Instead of a JSONP function a JSONP array is used -> async script tag support, order no longer matter
- New
optimization.splitChunksoption 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
-
webpackIncludeandwebpackExcludeare 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.importwithRule.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.minimizehas been added to switch minimizing on/off- By default: on in production mode, off in development mode
-
optimization.minimizerhas been added to configurate minimizers and options
- Resolving can now be configured with
- Usage
- Some Plugin options are now validated
- CLI has been move to webpack-cli, you need to install
webpack-clito use the CLI - The ProgressPlugin (
--progress) now displays plugin names- At least for plugins migrated to the new plugin system
- 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.dependenciesconfigurations now throw error -
sideEffectscan be overriden via module.rules -
output.hashFunctioncan now be a Constructor to a custom hash function- You can provide a non-cryto hash function for performance reasons
- add
output.globalObjectconfig 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
typeandrequest.
- Error for chunk loading now includes more information and two new properties
- Devtool
- remove comment footer from SourceMaps and eval
- add support for
includetestandexcludeto the eval source map devtool plugin
- 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 ofinstead offorEach - Migrate to using
MapandSetinstead of Objects - Migrate to using
includesinstead ofindexOf - Replaced some RegExp with string methods
- Queue don't enqueues the same job twice
- Use faster md4 hash for hashing by default
- Optimization
- When using more than 25 exports mangled export names are shorter.
- script tags are no longer
text/javascriptandasyncas 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,.jsand.jsonextensions in this order -
output.pathinfois now on by default in develoment mode - in-memory caching is now off by default in production
-
entrydefaults to./src -
output.pathdefaults to./dist - Use
productiondefaults when omiting themodeoption
- webpack now looks for the
- Usage
- Add detailed progress reporting to SourceMapDevToolPlugin
- removed plugins now give a useful error message
- Stats
- Sizes are now shown in kiB instead of kB in Stats
- entrypoints are now shows by default in Stats
- chunks now display
<{parents}>>{children}<and={siblings}=in Stats - add
buildAttime to stats - stats json now includes the output path
- Syntax
- A resource query is supported in context
- Referencing entry point name in
import()now emits a error instead of a warning - Upgraded to acorn 5 and support ES 2018
- Plugins
-
doneis now an async hook
-
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
output.chunkCallbackNameto the schema to allow configurating WebWorker template - Using
module.id/loadednow 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 - fix incorrect
-!behavior with post loaders - add
runandwatchRunhooks forMultiCompiler -
thisis now undefined in ESM - VariableDeclaration are correctly identified as
var,constorlet - Parser now parse the source code with the correct source type (module/script) when the module type
javascript/dynamicorjavascript/moduleis used. - don't crash on missing modules with
buildMetaof null - add
original-fsmodule for electron targets - HMRPlugin can be added to the Compiler outside of
plugins
Internal changes
- Replaced
plugincalls withtapcalls (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
- Use
neo-asyncinstead ofasync - Update tapable and enhanced-resolve dependencies to new major versions
- Use prettier
Removed features
- removed
module.loaders - removed
loaderContext.options - removed
Compilation.notCacheableflag - removed
NoErrorsPlugin - removed
Dependency.isEqualResource - removed
NewWatchingPlugin - removed
CommonsChunkPlugin
Breaking changes for plugins/loaders
- new plugin system
-
pluginmethod 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/blocksare no longer Arrays. A Set is used internally and there are methods to access it. -
Parser.scope.renamesandParser.scope.definitionsare no longer Objects/Arrays, but Map/Sets. - Parser uses
StackedSetMap(LevelDB-like datastructure) instead of Arrays -
Compiler.optionsis no longer set while applying plugins - Harmony Dependencies has changed because of refactoring
-
Dependency.getReference()may now return aweakproperty.Dependency.weakis now used by theDependencybase class and returned in the base impl ofgetReference() - Constructor arguments changed for all
Modules - Merged options into options object for
ContextModuleandresolveDependencies - Changed and renamed dependencies for `import()
- Moved
Compiler.resolversintoCompiler.resolverFactoryaccessible with plugins -
Dependency.isEqualResourcehas been replaced withDependency.getResourceIdentifier - Methods on
Templateare now static - A new RuntimeTemplate class has been added and
outputOptionsandrequestShortenerhas 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.metahas been replaced withModule.buildMeta -
Module.buildInfoandModule.factoryMetahave been added - Some properties of
Modulehave been moved into the new objects - added
loaderContext.rootContextwhich points to thecontextoptions. Loaders may use it to make stuff relative to the application root. - add
this.hotflag to loader context when HMR is enabled -
buildMeta.harmonyhas 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/foreachChunks/Modules/Parentsmethods are now deprecated/removed - NormalModule accept options object in Constructor
- Added required generator argument for NormalModule
- Added
createGeneratorandgeneratorhooks for NormalModuleFactory to customize code generation - Allow to customize render manifest for Chunks via hooks
- [ ] If you want to rebase/retry this PR, check this box
High
Medium