首页 > 其他分享 >2024-04-18 使用webpack减少打包文件数量

2024-04-18 使用webpack减少打包文件数量

时间:2024-04-18 17:11:56浏览次数:32  
标签:... const 04 18 js 2024 webpack path css

减少Webpack打包文件的数量通常涉及多个策略和配置选项。下面是一些具体的方法和示例代码,帮助你实现这一目标:

1. 代码分割 (Code Splitting)

使用动态导入 (import()) 语法将代码分割成多个块,这样Webpack会为每个块生成一个单独的文件。

// 假设我们有一个大型的组件库
// 而不是一次性导入整个库,我们可以按需导入
button = () => import('./Button');

2. Tree Shaking

确保你的代码和依赖库支持Tree Shaking,并且在Webpack配置中启用相应的优化选项。

// webpack.config.js
module.exports = {
// ...
optimization: {
usedExports: true, // 启用Tree Shaking
sideEffects: false, // 标记你的包没有副作用,以启用更深入的Tree Shaking
},
// ...
};

3. 使用DLL Plugin

DLL Plugin可以将特定的依赖库与业务代码分离,单独打包。

// webpack.dll.config.js
const path = require('path');
const webpack = require('webpack');

module.exports = {
entry: {
vendor: ['react', 'react-dom'] // 这里列出需要单独打包的库
},
output: {
path: path.join(__dirname, 'build'),
filename: '[name].dll.js',
library: '[name]_library' // vendor.dll.js中暴露出的全局变量名
},
plugins: [
new webpack.DllPlugin({
name: '[name]_library',
path: path.join(__dirname, 'build', '[name]-manifest.json'),
}),
],
};

然后在主Webpack配置中使用DllReferencePlugin来引用DLL生成的文件。

// webpack.config.js
const webpack = require('webpack');
const path = require('path');
const vendorManifest = require('./build/vendor-manifest.json'); // 引入DLL manifest

module.exports = {
// ...
plugins: [
new webpack.DllReferencePlugin({
context: path.resolve(__dirname),
manifest: vendorManifest,
}),
// ...
],
// ...
};

4. 优化Loader

确保Loader仅应用于必要的文件类型,并减少Loader的链式调用。

module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
// Babel配置
}
}
},
// 仅为.css文件配置style-loader和css-loader
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
],
},

5. 压缩和优化输出

使用TerserPlugin压缩JavaScript,并使用其他插件压缩CSS。

// webpack.config.js
const TerserPlugin = require('terser-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');

module.exports = {
// ...
optimization: {
minimize: true,
minimizer: [new TerserPlugin(), new OptimizeCSSAssetsPlugin({})],
},
module: {
rules: [
// 为CSS配置MiniCssExtractPlugin
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css-loader'],
},
],
},
plugins: [
new MiniCssExtractPlugin({
filename: '[name].css',
chunkFilename: '[id].css',
}),
// ...
],
// ...
};

6. 利用缓存

使用Webpack的缓存功能来缓存已经构建过的模块。

// webpack.config.js
module.exports = {
// ...
cache: {
type: 'filesystem',
buildDependencies: {
config: [__filename],
},
},
// ...
};

7. 分析打包结果

使用webpack-bundle-analyzer插件来分析打包结果。

首先安装插件:

npm install

标签:...,const,04,18,js,2024,webpack,path,css
From: https://www.cnblogs.com/iuniko/p/18143951

相关文章

  • 群晖DS918+ 6.2.3完美升级迁移7.2.0
    近日黑群晖6.2.3系统的docker突然发生了故障了,导致什么镜像都无法拉取想尽办法依然无法解决,无意中在openos论坛中类似升级的版本逻辑就大胆尝试了一番(是无损升级跨版本),之所以选择传统引导方式折腾,其优势是可以无损迁移恢复旧版本的数据,有些必要的参数可以自定义设置大大提......
  • Alibaba Cloud Linux 3.2104 LTS 安装mysql5.7.39
    1上传mysql安装包到linux服务器tar-zxvfmysql-5.7.39-linux-glibc2.12-x86_64.tar.gzmvmysql-5.7.39-linux-glibc2.12-x86_64mysql5.72创建mysql用户groupaddmysqluseradd-gmysql-s/sbin/nologinmysqlchown-Rmysql:mysqlmysql5.7 ......
  • 2024-04-18 Umi配置文件简读
    Umi配置文件通常为.umirc.js或者config/config.js,这两个文件的作用是相同的,两个文件都存在时会优先加载`.umirc.js`,请只使用其中一个来作为配置项!以下是其常见配置项:plugins:配置插件列表。exportdefault{plugins:[['umi-plugin-react',{dva:true,antd:true......
  • JTCR-介绍类-04
    类基础类表示一个新的数据类型。简单类的一般形式:classClassName{typeinstanceVariable;//...typemethod(parameterList){//方法体}//...}有些Java应用不需要main方法。定义对象new操作符在运行时动态地给一个对象分配内存并返回指向该......
  • 1048 数字加密(前缀和思想)
    暴力(12分)#include<bits/stdc++.h>usingnamespacestd;constintinf=0x3f3f3f3f;#definelllonglonginta[100010];intmain(){ intn; cin>>n; for(inti=0;i<n;i++){ cin>>a[i]; } set<int>st; for(inti=0;i<n;i++){ ......
  • 1048 数字加密
    #include<bits/stdc++.h>usingnamespacestd;constintinf=0x3f3f3f3f;#definelllonglongchara[110],b[110];intcal[110],cal2[110];charcal3[110];intmain(){ cin>>a>>b; intp1=0,p2=0; for(inti=strlen(a)-1;i>=0;i--){ c......
  • 1044 火星数字
    最最严重的问题,如果字符串只有一个的时候不一定就是个位,也可能是十位,这要取决于在哪个数组中出现。还有如果是数字,比如13,那么十位是1,个位是0没问题吧,按照平时应该输出tamtret,但是这题的要求是只输出tam即可。所以也要在代码里面特判。我真的想吐槽C++字符串处理,java明明一......
  • 界面组件Telerik UI for WPF 2024 Q1新版亮点 - 全新DateRangePicker组件
    TelerikUIforWPF拥有超过100个控件来创建美观、高性能的桌面应用程序,同时还能快速构建企业级办公WPF应用程序。UIforWPF支持MVVM、触摸等,创建的应用程序可靠且结构良好,非常容易维护,其直观的API将无缝地集成VisualStudio工具箱中。本文将介绍界面组件TelerikUIforWPF在今......
  • 04-路线规划
    1.Cypher入门1.1查询数据a.基本查询//查询所有的数据,数据量大是勿用MATCH(n)RETURNn//查询所有的网点(AGENCY)MATCH(n:AGENCY)RETURNn//查询所有与“北京市转运中心”有关系的节点MATCH(n:OLT{name:"北京市转运中心"})--(m)RETURNn,m//查询所有"北京......
  • 2024蓝桥杯省赛C/C++程序设计A组题目简析
    2024蓝桥杯省赛C/C++程序设计A组题目简析A题意:计算一段区间内日期的中文表达的总笔画数>50的天数按照题意枚举即可。注意个位数字前面需要加一个“零”,也就是多13笔。B题意:\(5\times5\)的棋盘下五子棋,最终下满棋盘并和棋的情况数dfs或者遍历二进制去枚举棋子位置的情况均可......