entry:入口起点
1.string —-> ‘./src/index.js’
打包形成一个chunk。输出一个bundle文件
此时chunk的名称是main
2.array —-> [‘./src/index.js’, ‘./src/add.js’]
多入口
所有入口文件最终只形成一个chunk,输出出去只有一个bundle文件
—> 只有在HMR功能中让html热更新生效
3.object
entry:{
index: ‘./src/index.js’,
add: ‘./src/add.js’
}
多入口
特点:有几个多入口文件就形成几个chunk,输出出去就有几个bundle文件
此时chunk的名称是 key
—> 特殊用法
entry: {
index:[‘./src/index.js’,’./src/count.js’],
add: ‘./src/add.js’
}
output:{
// 文件名称(指定名称+目录)
filename: ‘js/[name].js’,
// 输出文件目录(将来所有资源输出的公共目录)
path:resolve(_dirname,’buid’),
// 所有资源引入公共路径前缀 —> ‘imgs/a.jpg’—>’/imgs/a.jpg’,
publicPath: ‘/‘
chunkFilename: ‘js[name]_chunk.js’ // 非入口chunk的名称
library:’[name]’ // 整个库向外暴露的变量名
libraryTarget:’window’ // 变量名添加到哪个上 window
libraryTarget: ‘global’ // 变量名添加到哪个上node
libraryTarget:’commonjs’
}
module:{
rules:[
// loader的配置
{
test:/.css$/,
多个loader用use
use:[‘style-loader’,’css-loader’]
},{
test:/.js$/
// 排出node_module下的js文件
exclude:/ node_modules/,
// 只检查src下的js文件
include:resolve(__dirname, ‘src’)
// 优先执行
enforce:’pre’,
// 延后执行
enforce:’post’,
// 单个loader用loader
loader:’eslint-loader’
},
{
// 以下配置只会生效一个
oneOf:[]
}
]
}
resolve // 解析模块的规则
module.exports = {
resolve: {
// 解析模块的规则
alias:{
// 配置解析路径的别名, 优点:简写路径,缺点:写路径是没有提示
$css: resolve(dirname,’src/css’)
},
// 配置省略文件路径的后缀名
extensions:[‘.js’, ‘.json’, ‘.jsx’, ‘.css’],
// 告诉 webpack 解析模块去哪个目录找
modules:[resolve(dirname,’../../node_modules’),’node_modules’]
}
}
// 开发服务器devServer:用来自动化 (自动编译,自动打开浏览器,自动刷新浏览器)
// 特点:只会在内存中编译打包,不会有任何输出
// 启动devServer指令为:npx webpack-dev-server
mode:’development,
devServer: {
// 运行代码的目录 (项目构建后路径)
contentBase: resolve(__dirname,’build’),
// 监视contentBase目录下的所有文件,一旦文件变化就会reload
watchContentBase:true,
watchOptions:{
// 忽略文件
ignored: /node_modules/
},
// 启动gzip压缩
compress:true,
// 端口号
port: 3000,
// 域名
host:’localhost’,
// 自动打开浏览器
open:true,
// 开启HMR功能
hot:true,
// 不要显示启动服务器日志
clientLogLevel:’none’,
// 除了一些基本的启动信息外,其它内容都不要显示
quiet:true,
// 如果出错了,不要全屏提示
overlay: false,
// 服务器代理 —> 解决开发环境的跨域问题
proxy:{}
}
optimization: {
splitChunks: {
chunks: ‘all’,
// 下面为默认值,可以不对其进行配置
minSize: 30*1024 // 分割的chunk最小为30kb
maxSize:0 // 没有最大限制
minChunks:1 // 要提取的chunk最少被引用一次
maxAsyncRequests: 5 // 按需加载并行加载文件的最大数量
maxinitialRequests: 3 // 入口js文件最大并行请求数量
automaticNameDelimiter:’~’ // 名称链接符
name:true // 可以使用命名规则
cacheGroups: { // 分割chunk的数组
// node_modules文件会被打包到vendors 组的chunk中 —> vendors~xxx.js
// 满足上面的公共规则,如大小超过30kb,至少被引用一次
vendors:{
test:/[\/]node_modules[\/]/,
// 打包优先级: -10
priority: -10
},
default: {
// 要提取的chunk至少被引用两次
minChunks:2
// 优先级
priority:-20,
// 如果当前要打包的模块和之前已经被提取的模块是同一个,就会复用,而不是重新打包模块
reuseExitingChunk:true
}
},
// 将当前模块的记录其它模块的hash单独打包为一个文件 runtime
// 解决:修改a文件导致b文件的contenthash变化
runtimeChunk:{
name:entrypoint => runtime-${entrypoint.name}
},
mininizer:{
// 配置生产环境的压缩方案:js和css
new terserWebpackPlugin({
// 开启缓存
cache:true,
// 开启多进程打包
parallel:true,
// 开启source-map
scource-map: true
})
}
}
}
webpack
自动删除Node.js PolyFill
早期webpack的目标是允许在浏览器中运行大多数Node.js模块,但是模块格局发生了变化,许多模块用途现在主要是为前端目的而编写的。webpack<=4 附带了许多Node.js核心模块的pollyfill,一旦模块使用任何核心模块(即crypto模块),这些模块就会自动应用。
尽管这使用为Node.js的编写变得容易,但它会将巨大的pollyfill添加到包中,在许多情况下,这些polyfill是不必要的。
webpack5 会自动停止填充这些核心模块,并专注与前端兼容的模块
迁移:
尽可能尝试使用与前端兼容的模块
可以为Node.js核心模块手动添加一个polyfill。错误消息将提示如何实现该目标。
Chunk模块和ID
添加了用于长期缓存的新算法。但在生产模式下默认启用这些功能
Chunk ID
可以不使用import(/ webpackChunkName: “name” / “module”) 在开发环境为chunk命名,生产环境还是有必要的
wbpack内部有chunk命名规则,不再是以id(0, 1, 2)命名了
Output
webpack 4 默认只能输出ES5代码
webpack5 开始新增一个属性 output.ecmaVersion,可以生成ES5/ES6的代码
如:output.ecmaVersion: 2015
SplitChunk
minSize: 30000 // webpack4
minSize: { // webpack 5
javaScript: 30000,
style: 50000,
}
Caching
// 配置缓存
cache: {
// 磁盘存储
type: “filesystem”,
buildDependencies:{
// 当配置修改时,缓存失效
config: [_filename],
}
}
缓存将存储到node_modules/.cache/webpack
监视输出文件
之前webpack 总是在第一次构建时输出全部文件,但是监视重新构建时只会更新修改的文件
此次更细在第一次构建时会找到输出文件看是否有变化,从而决定要不要输出全部文件
默认值
entry:”./src/index.js”,
output.path: path.resolve(__dirname,”dist”)
output.filename: “[name].js”