resolve.root
, resolve.fallback
, resolve.modulesDirectories
resolve.modules. resolve resolving.
resolve: {
- root: path.join(__dirname, "src")
+ modules: [
+ path.join(__dirname, "src"),
+ "node_modules"
+ ]
}
resolve.extensions
resolve.enforceExtension resolve resolving.
resolve.*
module.loaders
module.rules
loadersrulesmodule.loaders
loaders
loadermodule.rules
module: {
- loaders: [
+ rules: [
{
test: /\.css$/,
- loaders: [
+ use: [
{
loader: "style-loader"
},
{
loader: "css-loader",
- query: {
+ options: {
modules: true
}
}
]
},
{
test: /\.jsx$/,
loader: "babel-loader", // Do not use "use" here
options: {
// ...
}
}
]
}
webpack1.Xloadersloader rule.use
wepback2use
loadersweback1loaders !``module.loaders
module: {
- loaders: {
+ rules: {
test: /\.less$/,
- loader: "style-loader!css-loader!less-loader"
+ use: [
+ "style-loader",
+ "css-loader",
+ "less-loader"
+ ]
}
}
##module
-loader
loader-loader
loader
module: {
rules: [
{
use: [
- "style",
+ "style-loader",
- "css",
+ "css-loader",
- "less",
+ "less-loader",
]
}
]
}
resolveLoader.moduleExtensions
+ resolveLoader: {
+ moduleExtensions: ["-loader"]
+ }
json-loader
jsonloaderwebpack2 json-loaderjson
module: {
rules: [
- {
- test: /\.json/,
- loader: "json-loader"
- }
]
}
jsonwebpack, node.js and browserify
loader``context
webpack 1loaderrequire.resolve
webpack 2loadercontext
npmcontext
module: {
rules: [
{
// ...
- loader: require.resolve("my-loader")
+ loader: "my-loader"
}
]
},
resolveLoader: {
- root: path.resolve(__dirname, "node_modules")
}
module.preLoaders
module.postLoaders
module: {
- preLoaders: [
+ rules: [
{
test: /\.js$/,
+ enforce: "pre",
loader: "eslint-loader"
}
]
}
preLoaderrulesenfore
UglifyJsPlugin
sourceMap
UglifyJsPlugin``sourceMap
true
false
jsUglifyJsPlugin
sourceMap: true
devtool: "source-map",
plugins: [
new UglifyJsPlugin({
+ sourceMap: true
})
]
UglifyJsPlugin
UglifyJsPlugin
compress.warnings
true
false
jscompress.warnings
true
devtool: "source-map",
plugins: [
new UglifyJsPlugin({
+ compress: {
+ warnings: true
+ }
})
]
UglifyJsPlugin
Loaders
UglifyJsPlugin
Loaders debug
Loaders webpack
loadewebpack 3.
loader LoaderOptionsPlugin
plugins: [
+ new webpack.LoaderOptionsPlugin({
+ minimize: true
+ })
]
DedupePlugin
webpack.optimize.DedupePlugin
. .
BannerPlugin
BannerPlugin
.
plugins: [
- new webpack.BannerPlugin('Banner', {raw: true, entryOnly: true});
+ new webpack.BannerPlugin({banner: 'Banner', raw: true, entryOnly: true});
]
OccurrenceOrderPlugin
OccurrenceOrderPlugin
plugins: [
- new webpack.optimize.OccurrenceOrderPlugin()
]
ExtractTextWebpackPlugin
ExtractTextPlugin ] 1.0.0 webpack v2ExtractTextPlugin
webpack2.
npm install --save-dev extract-text-webpack-plugin@beta
ExtractTextPlugin
wepback2
ExtractTextPlugin.extract
module: {
rules: [
test: /.css$/,
- loader: ExtractTextPlugin.extract("style-loader", "css-loader", { publicPath: "/dist" })
+ loader: ExtractTextPlugin.extract({
+ fallbackLoader: "style-loader",
+ loader: "css-loader",
+ publicPath: "/dist"
+ })
]
}
new ExtractTextPlugin({options})
plugins: [
- new ExtractTextPlugin("bundle.css", { allChunks: true, disable: false })
+ new ExtractTextPlugin({
+ filename: "bundle.css",
+ disable: false,
+ allChunks: true
+ })
]
(i. e. require(expr)
)contextcontext
es2015ContextReplacementPlugin
###Cli
cli
webpack --custom-stuff
// webpack.config.js
var customStuff = process.argv.indexOf("--custom-stuff") >= 0;
/* ... */
module.exports = config;
cli
webpack --env.customStuff
module.exports = function(env) {
var customStuff = env.customStuff;
/* ... */
return config;
};
CLI.
##require.ensure
AMD require
require.ensure``amd require
require.ensure
Promise
require.ensure
Promisepolyfill.
options
webpack.config.js
loderts
webpack2
module.exports = {
...
module: {
rules: [{
test: /\.tsx?$/,
loader: 'ts-loader'
}]
},
// does not work with webpack 2
ts: { transpileOnly: false }
}
options
?custom property``options
webpack loaderoptions``query
loaderurl:
module.exports = {
...
module: {
rules: [{
test: /\.tsx?$/,
loader: 'ts-loader?' + JSON.stringify({ transpileOnly: false })
}]
}
}
optionsloader
module.exports = {
...
module: {
rules: [{
test: /\.tsx?$/,
loader: 'ts-loader',
options: { transpileOnly: false }
}]
}
}
LoaderOptionsPlugin
contextloadercontext
loaderloader
loader
plugins: [
+ new webpack.LoaderOptionsPlugin({
+ options: {
+ context: __dirname
+ }
+ })
]
debug
debug
loaderwebpack1webpack2loader
loader
loderdebug
webpack3.0
loader
- debug: true,
plugins: [
+ new webpack.LoaderOptionsPlugin({
+ debug: true
+ })
]
webpack1require.ensure``chunks
require.ensure([], function(require) {
var foo = require("./module");
});
es2015 loaderimport()
ES2015
webpackimport()
chunkwebpack2 ES6 webpack 2 import``export
import()``Promise
function onClick() {
import("./module").then(module => {
return module.default;
}).catch(err => {
console.log("Chunk loading failed");
});
}
Promise
require.ensure
chunkimport
APIrequire.ensure
require.ensure([], function(require) {
var foo = require("./module");
}, "custom-chunk-name");
System.import
webpack System.import``import
v2.1.0-beta.28)
Babelimport
dynamic-import babelStage 3
import()
CommonJSrequire()
, CommonJS webpack
import()
moduleseparte chunk
function route(path, query) {
return import(`./routes/${path}/route`)
.then(route => new route.Route(query));
}
// This creates a separate chunk for each possible route
AMD CommonJS
// CommonJS consuming ES2015 Module
var book = require("./book");
book.currentPage;
book.readPage();
book.default === "This is a book";
// ES2015 Module consuming CommonJS
import fs from "fs"; // module.exports map to default
import { readFileSync } from "fs"; // named exports are read from returned object+
typeof fs.readFileSync === "function";
typeof readFileSync === "function";
es2015 balel
ES6 CommonJS webpack ES6 es2015-webpack
babelbabelmodule symbolswebpackbabel
.babelrc
{
"presets": [
["es2015", { "modules": false }]
]
}
No need to change something, but opportunities
webpack
- require("./templates/" + name);
+ require(`./templates/${name}`);
###Promise
webpackPromise
webpack.config.js
module.exports = function() {
return fetchLangs().then(lang => ({
entry: "...",
// ...
plugins: [
new DefinePlugin({ LANGUAGE: lang })
]
}));
};
webpackloader
module: {
rules: [
{
resource: /filename/, // matches "/path/filename.js"
resourceQuery: /querystring/, // matches "/filename.js?querystring"
issuer: /filename/, // matches "/path/something.js" if requested from "/path/filename.js"
}
]
}
CLI :
--define process.env.NODE_ENV="production"
DefinePlugin
.
--display-depth
entrymodule
--display-used-exports
module.
--display-max-modules
output (15).
-p process.env.NODE_ENV
"production"
Loadersloader
// Cacheable loader
module.exports = function(source) {
- this.cacheable();
return source;
}
// Not cacheable loader
module.exports = function(source) {
+ this.cacheable(false);
return source;
}
webpack1loaderJSON.stringify-able
json
webpack2loaderJS
ident
loader
require("some-loader??by-ident!resource")
{
test: /.../,
loader: "...",
options: {
ident: "by-ident",
magic: () => return Math.random()
}
}
loaderstyle-loader
loader
// style-loader generated code (simplified)
var addStyle = require("./add-style");
var css = require("-!css-loader?{"modules":true}!postcss-loader??postcss-ident");
addStyle(css);
ident
webpack2es6 modulePromiseAPIV1webapck