一、入口 (entry)
#.单个入口(简写/数组)语法
-
用法:entry: string | [string]
-
优缺点:通过一个入口(例如一个库)为应用程序设置 webpack 配置时,单一入口是不错的选择。然而,这种语法扩展配置的灵活性不大。
webpack.config.js
module.exports = {
entry: {
main: './path/to/my/entry/file.js'
}
}
// 或者,注入多个依赖文件,并将依赖关系绘制在一个“chunk”中
module.exports = {
entry: ['./src/file_1.js','./src/file_2.js'],
output: {
filename: 'bundle.js'
}
}
#.对象语法 ✔
-
用法:entry: { string | [string] } | { }
-
优缺点:对象语法会比较繁琐。然而,这是应用程序中定义入口的最可扩展的方式。
-
对象属性:
dependOn
: 当前入口所依赖的入口。必须在该入口被加载前被加载。filename
: 指定要输出的文件名称。import
: 启动时需加载的模块。library
: library 的相关选项。runtime
: 运行时 chunk 的名字。如果设置了,就会创建一个以这个名字命名的运行时 chunk,否则将使用现有的入口作为运行时。
- 注意事项:
runtime
和dependOn
不能在同一个入口上同时使用- 确保 runtime 不能指向已存在的入口名称
- dependOn 不能循环引用
// ✔
module.exports = {
entry: {
app: './src/app.js',
adminApp: './src/adminApp.js',
},
};
// ✔
module.exports = {
entry: {
a2: 'dependingfile.js',
b2: {
dependOn: 'a2',
import: './src/app.js',
},
},
};
// × `runtime` 和 `dependOn` 不能在同一个入口上同时使用
module.exports = {
entry: {
a2: './a',
b2: {
runtime: 'x2',
dependOn: 'a2',
import: './b',
},
},
};
// × `runtime` 不能指向已存在的入口名称
module.exports = {
entry: {
a1: './a',
b1: {
runtime: 'a1',
import: './b',
},
},
};
// × `dependOn` 不能循环引用
module.exports = {
entry: {
a3: {
import: './a',
dependOn: 'b3',
},
b3: {
import: './b',
dependOn: 'a3',
},
},
};
二、常见场景
#.分离 app(应用程序) 和 vendor(第三方库) 入口
// 使用 optimization.splitChunks 默认配置
// webpack.config.js
module.exports = {
entry: {
main: './src/app.js'
},
//...
optimization: {
splitChunks: {
chunks: 'async',
minSize: 20000,
minRemainingSize: 0,
maxSize: 0,
minChunks: 1,
maxAsyncRequests: 30,
maxInitialRequests: 30,
enforceSizeThreshold: 50000,
cacheGroups: {
defaultVendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10,
reuseExistingChunk: true,
},
default: {
minChunks: 2,
priority: -20,
reuseExistingChunk: true,
},
},
},
},
};
#.多页面应用程序
// webpack.config.js
module.exports = {
entry: {
pageOne: './src/pageOne/index.js',
pageTwo: './src/pageTwo/index.js',
pageThree: './src/pageThree/index.js',
},
};