Webpack进阶(三)

懒加载 lazy loading

  • 用到的时候才加载
  • vue 首屏不加载
  • index.js
const oBtn = document.getElementById('j-button')
oBtn.onclick = async function () {
    const div = await createElement()
    document.body.appendChild(div)
}
async function createElement() {
    const { default: _ } = await import(/* webpackChunkName: "my-loadsh" */ 'lodash')
    const res = _.join([1, 2, 3], '*')
    const div = document.createElement('div')
    div.innerText = res
    return div
}
  • 支持async await语法
  • webpack.base.js配置options
// cnpm install --save-dev @babel/plugin-transform-runtime
{
    test: /\.js$/,
    use: {
        loader: 'babel-loader',
        options: {
            plugins: ["@babel/plugin-transform-runtime"]
        }
    },
    exclude: path.resolve(__dirname, 'node_modules')
},
  • 点击按钮前
    在这里插入图片描述
  • 点击按钮
    在这里插入图片描述

module chunk bundle

  • 多个入口 → 生成多个chunk
  • 异步引入import 生成chunk
  • splitChunk也能生成chunk
  • bundle:dist中的文件
    在这里插入图片描述

如何找到webpack对应的loader版本

在这里插入图片描述

  • 安装后打包css文件保存,版本不匹配(不要去百度,网上搜的都告诉你是sass-loader版本的问题,可我都没有使用.scss文件啊)
  • 回退到一年前的版本npm
  • package.json
"devDependencies": {
    "@babel/cli": "^7.14.8",
    "@babel/core": "^7.15.0",
    "@babel/plugin-transform-runtime": "^7.15.0",
    "@babel/preset-env": "^7.15.0",
    "babel-loader": "^8.2.2",
    "clean-webpack-plugin": "^4.0.0-alpha.0",
    "core-js": "^3.8.3",
    "css-loader": "^3.5.0",
    "html-webpack-plugin": "~3.2.0",
    "lodash": "^4.17.21",
    "style-loader": "^1.1.4",
    "webpack": "~4.41.5",
    "webpack-cli": "~3.3.10",
    "webpack-dev-server": "~3.10.1",
    "webpack-merge": "^5.8.0"
  }

CSS代码分割

css in JS

  • style-loader会将css代码放入style标签
  • index.css
body {
    background: orange;
}
  • index.js
import './index.css';
...
  • 编译后没有.css文件,而是在main.js中
    在这里插入图片描述

使用MiniCssExtractPlugin分离css和JS

https://webpack.docschina.org/plugins/mini-css-extract-plugin/

  • 安装"mini-css-extract-plugin"
  • 在生产环境使用
  • webpack.prod.js
  • 使用CssMinimizerPlugin压缩css
const { merge } = require('webpack-merge')
// 公共配置
const baseConfig = require('./webpack.base')
// 生产环境 js css分离
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
// 压缩
const CssMinimizerPlugin = require("CssMinimizerPlugin")
// 生产环境特有的配置
const prodConfig = {
    mode: 'production',
    devtool: 'cheap-module-source-map',
    // CSS JS分离
    plugins: [new MiniCssExtractPlugin()],
    optimization: {
        // 压缩
        minimize: true,
        minimizer: [
            new CssMinimizerPlugin()
        ],
        // 提取所有的 CSS 到一个文件中 会产生map映射文件
        splitChunks: {
            cacheGroups: {
                styles: {
                    name: "styles",
                    test: /\.css$/,
                    chunks: "all",
                    enforce: true,
                },
            },
        },
    },
    module: {
        rules: [
            {
                test: /\.css$/i,
                // CSS JS分离
                use: [MiniCssExtractPlugin.loader, "css-loader"],
            },
        ],
    },
};

module.exports = merge(baseConfig, prodConfig)
  • package.json
// 忽略对css文件的tree shaking
"sideEffects": ["*.css"],

csdn效果

  • 提取所有的 CSS 到一个文件中
  • 基于入口提取 CSS

浏览器缓存(生产环境)

  • 浏览器开启缓存后:不会拿最新的index.js文件
  • 解决:使用hash
  • 根据文件内容生成hash值
  • webpack.prod.js
const path = require("path");
const { merge } = require('webpack-merge')
// 公共配置
const baseConfig = require('./webpack.base')
// 生产环境特有的配置
const prodConfig = {
    mode: 'production',
    devtool: 'none',
    output: {
        // 文件内容带哈希值
        filename: '[contenthash].bundle.js',
        path: path.resolve(__dirname, "../dist"),
    },
};

module.exports = merge(baseConfig, prodConfig)

在这里插入图片描述

  • 限制位数filename: '[name].[contenthash:8].js',
    在这里插入图片描述

Shimming

webpack5

  • 版本查询
  • npm info webpack version(当前版本)
  • npm info webpack versions(历史版本)
    在这里插入图片描述

webpack5

  • 对被不同文件引入的string.js,在webpack中配置
  • string.js会被分割,打包到common.js
optimization:{
	splitChunks:{
		chunks: 'all',
		minSize: 0,
		cacheGroups: {
			vendors:{
			// 对第三方库的打包 如lodash
				test: /[\\/]node_modules[\\/]/,
				priority: -10,		
				filename: 'vnedors.js',
				minChunks: 1
			}			
			default:{
				filename: 'common.js',
				priority: -20,	
				minChunks: 2
			}
		}
	}
}
  • webpack打包后会自动生成一些箭头函数,可以这样配置来关闭
output:{
	environment:{
		arrowFunction: false
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值