04---webpack编写可维护的构建配置

news2024/12/27 14:24:44

01 构建配置抽离成npm包;

意义:

通用性: 业务开发者无需关注构建配置 统一团队构建脚本

可维护性:构建配置合理的拆分 

质量:冒烟测试  单元测试 持续集成

构建配置管理的可选方案:

1 通过多个配置文件管理不同环境的构建:在package.json文件中进行配置。 项目中默认配置文件,

webpack.config.js, 可以设置开发环境的文件 webpack.dev.js 生产环境 webpack.pro.js

webpack --config webpack.dev.js  开发环境

webpack --config webpack.pro.js  生成环境

2 将构建配置设计成一个库 比如 hjs-webpack  Neutrino webpack-blocks等

3 抽成一个工具进行管理 比如 create-react-app

02 构建配置包设计

通过多个配置文件管理不同环境的webpakc配置

基础配置 webpack.base.js

开发环境 webpack.dev.js

生产环境 webpack.pro.js

SSR环境 webpack.ssr.js


抽离成一个npm包统一管理

规范:Git commit日志 README ESLint Semver

质量 冒烟测试 单元测试 测试覆盖率和CI

03 通过webpack-merge合并配置

const merge = require('webpack-merge')

module.exports = merge(baseConfig,devConfig)

合并规则如下:

merge({a:[1],b:5,c:23},{a:[2],b:6,c:40,d:60})

{a:[1,2],b:6,c:40,d:60}

04 目录结构的设计

05 各文件之间的功能

06 构建统计信息,可以查看各个文件打包后的大小

package.json中使用stats

"scripts":{

    "build:stats":"webpack --env production --json > stats.json"

}

07 webpack打包的速度分析,分析每个loader和插件打包的速度。

第一步 进行插件的安装:

npm install --save-dev speed-measure-webpack-plugin 

第二步 插件的导入  

const SpeedMeasureWebpackPlugin = require('speed-measure-webpack-plugin ')

第三步 创建插件的对象

const smp = new SpeedMeasureWebpackPlugin()

第四步 将要导出的配置进行包裹

module.exports = smp.wrap({entry:'',output:'',mode:'',...})

08 webpack打包后分析体积:需要借助webpack-bundle-analyzer;

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin

module.exports = {

Plugins:[

   new BundleAnalyzerPlugin()
 ]

}

项目在8888端口可以使用可视化的图标查看打包后的体积

09 多进程/多实例:使用thread-loader解析资源,加快打包的速度。

原理:每次webpack解析一个模块,thread-loader会将它及它的依赖分配给worker线程中

module.exports = {

 module:{

    rules:[

      {test:/.js$/,use:[{loader:'thread-loader',options:{workers:3}},'babel-loader']}

    ]   

 }

}

10 多进程/多实例 并行压缩代码:使用terser-webpack-plugin开启parallel参数;

const TerserPlugin = require('terser-webpack-plugin')

module.exports = {

  optimization:{

        minimizer:[

            new TerserPlugin({parallel:true})
        ]
    }

}

11 webpack设置分包:预编译资源模块:

思路:将react react-dom redux  react-redux 基础包和业务基础包打包成一个文件

方法:使用DLLPlugin 进行分包, DllReferencePlugin对manifest.json引用

第一步 项目根目录下创建一个webpack.dll.js文件

const path = require('path')

const webpack = require('webpack')

module.exports = {

entry:{

    library:['react','redux','react-redux','react-dom']
},

output:{

    filename:'[name]_[chunkhash].dll.js',
    
    path:path.join(__dirname,'build/library'),

    library:'[name]'
},

plugins:[

    new webpack.DllPlugin({
    
        name:'[name]_[hash]',

        path: path.join(__dirname,'build/library/[name].json')

    })
]

}

第二步 package.json文件中

"scripts":{

   "dll":"webpack --config webpack.dll.js"
 }

第三步 执行  npm run dll :

将会在build / library目录下打包出一个library_xxxx.js的文件

第四步 在webpack.config.js文件中引入打包后的文件

 module.exports = {

  plugins:[

  new webpack.DllReferencePlugin({manifest:require('./build/library/library_xxx.json')})
  ]

}

12 利用缓存提升二次构建的速度

缓存思路:

1  babel-laoder 开启缓存

2  terser-webpack-plugin 开启缓存

module.exports = {

  optimization:{

        minimizer:[

            new TerserPlugin({parallel:true,cache:true})
        ]
    }

}

3  使用cache-loader 或者 hard-source-webpack-plugin

const HardSoirceWebpackPlugin = require('hard-source-webpack-plugin')

module.exports = {

  plugins:[

        new HardSoirceWebpackPlugin()
    ]

}

13 缩小构建目标,减少文件搜索范围

优化 resolve.modules配置 减少模块搜索层级

优化 resolve.mainFields 配置

优化 resolve.extensions 配置 

合理使用 alias

module.exports = {

 resolve:{

    alias:{

      // 遇到react直接查找 这个目录下的就可以了

      react:path.resolve(__dirname,'./node_module/react/dist/react.main.js'),
        
    },

    modules:[path.resolve(__dirname,'node_modules')], 查找依赖的路径

    extensions:['.js'],

    mainFields:['main']

}


}

14 打包排除没有使用到的css样式

需要purgecss-webpack-plugin结合mini-css-extract-plugin使用

webpack.config.js文件中

const PurgecssWebpackPlugin = require('purgecss-webpack-plugin')

const MiniCssExtractPlugin = require('mini-css-extract-plugin')

const PATHS = {src:path.join(__dirname.'src')}

module.exports = {
 
 plugins:[
   
   new PurgecssWebpackPlugin({
    
            paths:glob.sync(`${PATHS.src}/**/*`,{nodir:true})
    })

    ]

}

15 webpack对图片进行压缩

rules: [{test:/.(giflpngljpe?glsvg)$/i,

use:[

'file-loader',

loader: 'image-webpack-loader',

options:{

  mozjpeg:{

    progressive: true,

    quality: 65

    }

    // optipng.enabled: false will disable optipng

   optipng:{

    enabled: false,

    }
   
    pngquant: {

    quality:'65-90',

    speed: 4

    }
    gifsicle: {

    interlaced: false,

    }
    // the webp option will enable WEBP

   webp:{

    quality:75

    }
   }
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1571085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android模拟器Android Emulator进行快照snapshot保存时问题

在用Android Emulator进行快照保存时出现问题,不能保存快照,并提示 current state is not support snapshot。 在网上查找了一圈,发现没有针对这个问题的方案,比较接近的方案都是eclipse年代的,说要进行enable snaps…

刷题之Leetcode27题(超级详细)

27. 移除元素 力扣题目链接(opens new window)https://leetcode.cn/problems/remove-element/ 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用…

可以写网易云的了!

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 1枚程序媛,大专生,2年时间从1800到月入过万,工作5年买房。 分享成长心得。 259篇原创内容-gzh 后台回复“前端工具”可获取开发工具,持续更新中…

苍穹外卖Day04套餐管理部分总结

写给像我一样完完全全的小白的。本人代码水平一塌糊涂,前几天就是机械地跟着视频敲代码。对于Day04的作业本来感觉代码抓瞎一点不会写,尽力去理解业务逻辑后发现好像也没那么难,整体代码可以仿照Day03新增菜品来进行实现! 一、功…

scratch寻找好朋友 2024年3月中国电子学会 图形化编程 scratch编程等级考试二级真题和答案解析

目录 scratch寻找好朋友 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、…

如何在Linux中安装软件

文章目录 一、Linux应用程序基础1.Linux软件安装包分类2.应用程序和系统命令的关系3.常见的软件包的封装类型 二、安装软件的方式1.RPM包管理工具2.yum安装3.编译 一、Linux应用程序基础 1.Linux软件安装包分类 Linux源码包: 实际上,源码包就是一大堆源…

Spring/SpringBoot/SpringCloud Mybatis 执行流程

在后续分析Mybatis 流程中代码的可能会用到IDEA debug 技巧: 条件断点 代码断点,右键 勾选弹窗 Condition : 写入表达式 回到上一步: Java动态代理实现 InvocationHandler接口: package com.lvyuanj.core.test;…

MAX7219驱动数码管学习记录(有源码)

一、7219datasheet阅读 1.引脚定义: 重点介绍5个引脚 1.DIN: 串行数据总线输入引脚,每个时钟的上升沿将数据移入至芯片内部的移位寄存器中 2.DIG0-DIG7: 共阴极管的GND连接的便是DIG0-7,该引脚起作用时,便输出低电平&#xff0c…

SSM学习——Spring JDBC

Spring JDBC 概念 Spring的JDBC模块负责数据库资源管理和错误处理,简化了开发人员对数据库的操作。 Spring JDBC通过配置数据源和JDBC模板来配置。 针对数据库操作,Spring框架提供了JdbcTemplate类,它是Spring框架数据抽象层的基础&#…

【学习】渗透测试有哪些重要性

随着信息技术的迅猛发展,网络安全问题日益凸显。渗透测试作为网络安全防御的重要手段之一,旨在模拟黑客攻击,发现并修复潜在的安全漏洞,提高网络系统的安全性。本文将介绍渗透测试的概念、重要性、实施步骤及实践案例,…

echarts快速入门

文章目录 一、echarts下载1.1、下载说明1.2、使用说明 二、绘制一个简单图表 一、echarts下载 echarts是百度研发团队开发的一款报表视图JS插件,功能十分强大,可在echart官网下载源码(一个echarts.min.js文件)进行使用。 1.1、…

Star GAN论文解析

论文地址:https://arxiv.org/pdf/1912.01865v1.pdf https://openaccess.thecvf.com/content_cvpr_2018/papers/Choi_StarGAN_Unified_Generative_CVPR_2018_paper.pdf 源码:stargan项目实战及源码解读-CSDN博客 1. 概述 在传统方法中&#x…

R语言技能 | 不同数据类型的转换

原文链接:R语言技能 | 不同数据类型的转换 本期教程 写在前面 今天是4月份的第一天,再过2天后再一次迎来清明小假期。木鸡大家是否正常放假呢? 我们在使用R语言做数据分析时,会一直对数据进行不同类型的转换,有时候…

揭秘视觉Transformer之谜,TokenTM新法,全面提升模型解释性能

引言:揭示视觉Transformer的解释挑战 在计算机视觉应用中,Transformer模型的流行度迅速上升,但对其内部机制的后置解释仍然是一个未探索的领域。视觉Transformers通过将图像区域表示为转换后的tokens,并通过注意力权重将它们整合起…

一篇文章带你掌握二叉树(附带二叉树基本操作完整代码演示,和两种思路)

【本长内容】 1. 掌握树的基本概念 2. 掌握二叉树概念及特性 3. 掌握二叉树的基本操作 4. 完成二叉树相关的面试题练习 1. 树形结构 1.1 概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是…

RK3568平台 Uart驱动框架

一.TTY子系统 在Linux kernel中,tty驱动不像于spi,iic等那么架构简单,它是一个庞大的系统,它的框架大体如下图一。我们作为普通的驱动开发移植人员,不会从零写tty驱动,一般都是厂家根据现有的tty驱动和自家…

SpringBoot整合MyBatis四种常用的分页方式

目录 方式1 一、准备工作 1. 创建表结构 2. 导入表数据 3. 导入pom.xml依赖 4. 配置application.yml文件 5. 创建公用的实体类 项目结构 2. 创建controller层 3. 创建service层 4. 创建mapper层 5. 创建xml文件 6. 使用postman进行测试,测试结果如下…

基于JAVA+SpringBoot+Vue的前后端分离的大学健康档案管理系统

一、项目背景介绍: 随着社会的发展和科技的进步,人们越来越重视健康问题。大学作为培养人才的摇篮,学生的健康状况直接影响到国家的未来。然而,传统的大学健康档案管理方式存在诸多问题,如信息不透明、数据分散、更新不…

从零开始为香橙派orangepi zero 3移植主线linux——2.kernel + rootfs

从零开始为香橙派orangepi zero 3移植主线linux——2.kernel rootfs 参考文章:一、linux kernel移植二、根文件系统2.1 buildroot构建1.修改toolchain下的交叉编译链2.修改系统配置3.去除内置kernel和uboot编译4.添加rootfs.tar格式的输出 2.2 ubuntu-base移植 三、…

WebAuthn:更好地保护线上敏感信息

1. 引言 2023年知乎博客 WebAuthn: 真正的无密码身份认证 总结得很赞。 在数字时代,密码已成为人们日常生活和在线活动中不可或缺的一部分。尽管互联网已经发展了 20 多年,许多方面都有了巨大的改进,但只有密码,还是 20 年前的用…