学习webpack的基本配置和splitChunks配置

本文详细介绍了Webpack的基本配置,包括入口和出口配置、处理Vue和CSS文件、图片处理、代码压缩及公共库代码分离等内容。

entry 入口配置

entry表示入口,一般是一个字符串,表示入口文件的路径。如果是多入口就需要将entry拥有很多键值对的对象,属性名就是每个入口的名字,值是每个入口的路径。

// 单入口
entry: './src/main.js'
// 多入口
entry: {
    main: './src/main.js',
    other: './src/other.js'
}

output 出口配置

output出口的配置一般配置产出文件的名字和路径。如果入口配置是多入口,那出口文件也肯定是一一对应的。

const path = require('path')

output: {
    filename: '[name].js' // [name]表示生成文件名字与入口设置的名字相同
    path: path.resolve(__dirname, 'dist')// 表示最后输出的目录是当前项目的dist目录下,__dirname是一个在node.js下面的一个表示当前项目路径的常量
}

配置好了entry和output之后。如果你的项目只有js文件,那么,它已经可以正常运行了。通过运行webpack命令

// --progress 显示打包进度百分比
// --stats=varbose 显示打包全日志,还有其它属性值,normal默认日志显示设置,只显示部分主要日志。errors-info只在报错时显示错误日志
npx webpack --stats=varbose --progress

假设你项目入口是main.js文件。它引用了a.js和b.js两个文件。在运行上面的命令之后,在项目的dist文件生成了一个新的main.js文件。这个文件就是打包之后的产物。

我们知道了webpack的第一个作用:打包。打包各种类型的文件。

上面我们只有js文件,未免太简单了些。其实webpack可以还可以打包CSS,图片,Vue等各种类型的文件

处理vue文件

下面我们添加处理vue文件的打包方式。处理vue类型的文件,需要专门的vue-loader,配置到规则里面。

module: {
    rules: [
        {
            // 处理.vue后缀的文件
            test: /\.vue$/,
            use: 'vue-loader'
        },
    ]
}

这样就可以了吗?答案是还不够。还需要在插件里面添加一个对应的VueLoaderPlugin插件。

const { VueLoaderPlugin } = require('vue-loader')
module: {
    rules: [
        {
            // 处理.vue后缀的文件
            test: /\.vue$/,
            use: 'vue-loader'
        },
    ]
},
plugins: [
    new VueLoaderPlugin() // ???
]

这样才可以完整的处理vue类型的文件。它其它是将.vue文件变成了三个不同类型文件,其中的script和templte都会被处理成js,style标签的部分则会由vue-style-loader去处理。

处理CSS文件

其中 vue-style-loader 是对.vue文件里面css部分进行处理,对所有样式添加scoped字段,使之只在组件div下生效。不进行这层的处理,样式就全部都成了全局样式。

module: {
    rule: [
        {
            // 处理css文件
            test: /\.css$/,
            use: [
                'vue-style-loader',
                'css-loader'
            ]
        }
    ]
}

css-loader和style-loader的区别:css-loader 会把css文件打包成commonjs模块。style-loader 则是主要把js里面的样式资源插入到html的style标签里面,让样式生效。

处理图片

module: {
    rule: [
        {
            test: /\.(png|svg|jpe?g|gif)$/,
            use: {
                loader: 'file-loader',
                options: {
                    name:'assets/[name].[ext]',
                }
            }
        }
    ]
}

使用 file-loader 来处理各种后缀的图片,png,svg,jpg,gif格式的图片。这个加载器的主要作用是解决开发和打包时,图片路径不一致,导致的图片不能访问的问题。也就是解决路径问题

还有一个loader是 url-loader,这两个加载器的区别是:url-loader 主要作用是为了减少http请求。会将图片编码成dataURI(base64等)打包到文件里面,这样直接访问dataURI就可以显示图片了,也就不用再请求了。

当然也不能全部图片都进行编码,大尺寸的图片编码非常消耗性能,还是应该使用http请求。所以 url-loader 里面有一个参数limit用来限制可以进行编码的图片大小,小于这个尺寸的会将图片进行编码,而超过这个尺寸的图片还是会使用 file-loader 进行处理。也就是说 url-loader 其实是包含有 file-loader 的。

// url-loader的使用方法
module: {
    rule: [
        {
            test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
            loader: 'url-loader',
            options: {
                limit: 10000, // 单位是:B(字节)
            }
        }
    ]
}

配置文件压缩

目前我们打包好的文件,直接开始就可以看到源码,基本就是webpakc把不同文件使用胶水代码合并在了一起。

所以不能直接使用在生产环境中,需要将代码压缩,使其基本不可读。保护代码的安全

而且压缩代码,文件的体积也会变小,有利于网络传输

optimization: {
    minimize: true // 开启默认压缩配置
    minimizer: [ // 自定义压缩配置(如果需要的话)
        new TerserPlugin({
            ......
        })
    ]
}

具体配置用到的时候再说。

公共库代码分离

optimization: { // 这个配置项是对打包流程进行优化的配置
        splitChunks: { // 
            cacheGroups: { //
                // 外部也可以进行配置,当内部配置不与外部配置冲突的时候,使用内部内部配置,不冲突时,共用。
                commons: {
                    test: /[\\/]node_modules[\\/]/, // 配置是一个正则,所以引入来自node_modules文件夹里面的文件,都会打包成一个vendors.js文件
                    name: "vendors", // 打包之后,文件的名字
                    chunks: "initial" // 不同导入方式进行配置

                }
            }
        }
    }

参数chunks

参数chunks有三个值,分别是initial:对异步或者同步导入的模块分别进行打包,打包到不同的文件里面。async:不配置时的默认值,只会将异步导入的模块进行单独打包。all:无论异步还是同步加载的模块,都会单独进行打包,并且最后都会打包到同一个文件里面去。

chunks的参数提到了异步和同步导入模块。那么怎么算是同步导入,怎么又算是异步导入呢?

  • 同步写法:import 'xxx' 或者 require('xxx')
  • 异步写法:import('xxx') 或者 require('xxx', () => { yyy })

而我们常用的 import xxx from 'path' 这种写法也是同步导入的。

参考MDN上说的,只有 import('xxx') 这种像是函数一样的调用是异步导入模块的,其它都是同步的。而且 import('xxx') 会返回一个Promise对象去操作异步返回的模块对象。

import('XXX')
    .then(module => { // 像这样去操作异步返回的模块
        ......
    })
    .catch(error => {
        ......
    })

这种import异步导入模块的常见用法是在routes.js路由里面。

{
    path: '',
    component: () => import('XXX'), // 异步加载路由
    children: [
        ......
    ]
}

同步导入写法 import 'xxx' 它的作用是运行模块(而不是导入模块)。使用模块的副作用。比如使用这样方法导入CSS,运行模块会进行样式的添加,本身就是一种副作用。而不是希望得到CSS文件里面暴露的模块(这也是不可能的)。

Webpack 中,`SplitChunks` 是用于优化打包结果的重要功能之一,能够通过代码分割(Code Splitting)将模块拆分为更小的 chunks,从而提升加载性能用户体验。以下是 `SplitChunks` 的配置详解及最佳实践。 ### 配置详解 `SplitChunks` 的核心配置项位于 `webpack.config.js` 文件中的 `optimization.splitChunks` 对象中。其默认行为适用于大多数项目,但可以根据需求进行自定义。 #### 基础配置示例: ```javascript module.exports = { optimization: { splitChunks: { chunks: 'async', // 可选值:'all'、'async'、'initial' minSize: 20000, // 拆分 chunk 的最小体积(单位:字节) maxSize: 0, // 拆分 chunk 的最大体积(单位:字节) minChunks: 1, // 在分割前,模块被引用的最小次数 maxAsyncRequests: 30, // 异步加载时的最大并行请求数 maxInitialRequests: 30, // 初始加载时的最大并行请求数 automaticNameDelimiter: '~', // 拆分 chunk 名称的连接符 name: true, // 自动命名拆分后的 chunk cacheGroups: { vendors: { test: /[\\/]node_modules[\\/]/, // 匹配 node_modules 中的模块 priority: -10, // 优先级,数值越高越先匹配 filename: '[name].[contenthash].js', // 指定输出文件名 }, default: { minChunks: 2, // 默认缓存组的模块最少引用次数 priority: -20, reuseExistingChunk: true, // 是否复用已存在的 chunk }, }, }, }, }; ``` #### 关键配置项说明: - **chunks**:指定哪些类型的 chunk 需要被拆分。`async` 表示仅异步加载的 chunk,`initial` 表示初始加载的 chunk,`all` 表示所有 chunk。 - **minSize** **maxSize**:控制 chunk 的大小范围,避免生成过多小文件或过大的文件[^4]。 - **cacheGroups**:缓存组用于定义特定的拆分规则。例如,可以将第三方库单独打包到一个 chunk 中,提高缓存效率[^4]。 ### 最佳实践 1. **第三方库单独打包** 将常用的第三方库(如 React、Lodash 等)提取到独立的 chunk 中,这样即使业务代码发生变化,用户也能利用浏览器缓存减少下载量。通常可以通过 `test` 字段匹配 `node_modules` 目录下的模块来实现 [^4]。 2. **按路由/功能分包** 结合动态导入(`import()`)实现按需加载,将不同页面或功能模块拆分为独立的 chunk。这种方式特别适合大型单页应用(SPA),有助于减少初始加载时间 [^3]。 3. **合并小模块** 避免生成过多的小文件,设置合理的 `minSize` `maxAsyncRequests` 参数,确保不会因过多的 HTTP 请求影响性能 [^4]。 4. **长缓存优化** 使用 `contenthash` 作为文件名的一部分,确保只有内容变化时才会重新生成文件名,从而最大化利用浏览器缓存。例如,`filename: '[name].[contenthash].js'` 。 5. **测试监控分包效果** 使用 Webpack 提供的分析工具(如 `webpack-bundle-analyzer`)查看打包后的文件结构大小。根据分析结果调整分包策略,并在生产环境中监控页面加载性能,如首屏加载时间资源加载时间,进一步优化分包策略 [^4]。 ### 示例:使用 `webpack-bundle-analyzer` 进行分析 安装插件: ```bash npm install --save-dev webpack-bundle-analyzer ``` 配置 `webpack.config.js`: ```javascript const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer'); module.exports = { plugins: [ new BundleAnalyzerPlugin(), // 启用分析插件 ], }; ``` 运行构建命令后,会自动打开一个网页展示打包文件的详细信息,帮助优化分包策略 。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值