ZHANGYU.dev

October 14, 2023

webpack 4 学习笔记

WebpackJavaScript4.6 min to read

这段时间一来,一直有用 webpack,从之前不知道是干什么用的到现在略知一二,还是有所进步,再对 webpack 的学习做一些知识总结

webpack 是什么

webpack 是一个基于 Node.js 环境的静态资源打包器,能识别 es module、amd、cmd 的引入规则的 js 文件,再配合 loader 可以实现各种类型的文件打包

loader

文件

file-loader

import avatar from "./avatar.png"

url-loader

样式

css-loader

style-loader

sass-loader

postcss-loader

mini-css-extract-plugin

生产环境适用,因为不能 HMR 如果配置了Tree Shaking需要修改sideEffects 配置splitChunks将多个 css 打包在一个 css 文件中 文档

optimization: {
    minimizer: [new OptimizeCSSAssetsPlugin({})];
}

JS

{
    "corejs": 2, // npm install --save @babel/runtime-corejs2
    "helpers": true,
    "regenerator": true,
    "useESModules": false
}

plugins

html-webpack-plugin

clean-webpack-plugin

output

devtool

官方文档

webpack-dev-server

配置

Hot Module Replacement

热模块更新

Tree Shaking

module.exports = {
    //...
    optimization: {
        usedExports: true,
    },
};
{
    // ...
    "sideEffects": false
    // 如["@babel-polyfill"]、["*.css"]
}

Code Splitting

optimization: {
	splitChunks: {
		chunks: 'async', //指明是对同步还是异步代码做代码分割 all|async|initial
		minSize: 30000, // 打包的最小大小  <- 30kb
		maxSize: 0, // 打包的最大大小,如果大于会尝试二次代码分割
		minChunks: 1, // 文件在代码中引入了几次后才打包,如值为2,那么只import了一次的代码就不会打包
		maxAsyncRequests: 5, // 入口文件最多有5个异步打包的请求
		maxInitialRequests: 3, // 入口文件最多有3个同步打包的请求
		automaticNameDelimiter: '~', // 代码分割后名字的分隔符
		name: true, // cacheGroups中的命名有效
		cacheGroups: { // 缓存组,会将符合下列规则的代码缓存后合并在一个文件里
			vendors: {
				test: /[\\/]node_modules[\\/]/, // 文件符合test规则在node_modules路径中
				priority: -10,	// 打包组的权重,越大的权重越高,符合的代码就会打包在权重高的组里
				filename:"vendors.js" // 文件名
			},
			default: { // 其他的文件打包在default组中,文件默认都符合default分组
				priority: -20,
				reuseExistingChunk: true // 如果代码有循环引用,就不会重复打包了
				}
			}
		}
}

Prefetching/Preloading

在 chrome 浏览器中,可以打开 show coverage 来检测文件的代码覆盖率 如点击事件触发的代码,在点击时才会执行,那么在页面首屏加载的时候,其实不需要加载这些代码的,所以可以使用 code splitting 来做代码分割,异步加载点击后触发的代码,但是响应时间慢会对用户体验不好,可以使用Prefetching/Preloading

Shimming

plugins: [
    new webpack.ProvidePlugin({
        _: "lodash",
    }),
];

Bundle Analysis 打包分析

Bundle Analysis

开发环境和生产环境区分