当前位置:   article > 正文

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

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

01 构建配置抽离成npm包;

  1. 意义:
  2. 通用性: 业务开发者无需关注构建配置 统一团队构建脚本
  3. 可维护性:构建配置合理的拆分
  4. 质量:冒烟测试 单元测试 持续集成
  5. 构建配置管理的可选方案:
  6. 1 通过多个配置文件管理不同环境的构建:在package.json文件中进行配置。 项目中默认配置文件,
  7. webpack.config.js, 可以设置开发环境的文件 webpack.dev.js 生产环境 webpack.pro.js
  8. webpack --config webpack.dev.js 开发环境
  9. webpack --config webpack.pro.js 生成环境
  10. 2 将构建配置设计成一个库 比如 hjs-webpack Neutrino webpack-blocks等
  11. 3 抽成一个工具进行管理 比如 create-react-app

02 构建配置包设计

  1. 通过多个配置文件管理不同环境的webpakc配置
  2. 基础配置 webpack.base.js
  3. 开发环境 webpack.dev.js
  4. 生产环境 webpack.pro.js
  5. SSR环境 webpack.ssr.js
  6. 抽离成一个npm包统一管理
  7. 规范:Git commit日志 README ESLint Semver
  8. 质量 冒烟测试 单元测试 测试覆盖率和CI

03 通过webpack-merge合并配置

  1. const merge = require('webpack-merge')
  2. module.exports = merge(baseConfig,devConfig)
  3. 合并规则如下:
  4. merge({a:[1],b:5,c:23},{a:[2],b:6,c:40,d:60})
  5. {a:[1,2],b:6,c:40,d:60}

04 目录结构的设计

05 各文件之间的功能

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

  1. package.json中使用stats
  2. "scripts":{
  3. "build:stats":"webpack --env production --json > stats.json"
  4. }

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

  1. 第一步 进行插件的安装:
  2. npm install --save-dev speed-measure-webpack-plugin
  3. 第二步 插件的导入
  4. const SpeedMeasureWebpackPlugin = require('speed-measure-webpack-plugin ')
  5. 第三步 创建插件的对象
  6. const smp = new SpeedMeasureWebpackPlugin()
  7. 第四步 将要导出的配置进行包裹
  8. module.exports = smp.wrap({entry:'',output:'',mode:'',...})

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

  1. const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
  2. module.exports = {
  3. Plugins:[
  4. new BundleAnalyzerPlugin()
  5. ]
  6. }
  7. 项目在8888端口可以使用可视化的图标查看打包后的体积

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

  1. 原理:每次webpack解析一个模块,thread-loader会将它及它的依赖分配给worker线程中
  2. module.exports = {
  3. module:{
  4. rules:[
  5. {test:/.js$/,use:[{loader:'thread-loader',options:{workers:3}},'babel-loader']}
  6. ]
  7. }
  8. }

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

  1. const TerserPlugin = require('terser-webpack-plugin')
  2. module.exports = {
  3. optimization:{
  4. minimizer:[
  5. new TerserPlugin({parallel:true})
  6. ]
  7. }
  8. }

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

  1. 思路:将react react-dom redux react-redux 基础包和业务基础包打包成一个文件
  2. 方法:使用DLLPlugin 进行分包, DllReferencePlugin对manifest.json引用
  3. 第一步 项目根目录下创建一个webpack.dll.js文件
  4. const path = require('path')
  5. const webpack = require('webpack')
  6. module.exports = {
  7. entry:{
  8. library:['react','redux','react-redux','react-dom']
  9. },
  10. output:{
  11. filename:'[name]_[chunkhash].dll.js',
  12. path:path.join(__dirname,'build/library'),
  13. library:'[name]'
  14. },
  15. plugins:[
  16. new webpack.DllPlugin({
  17. name:'[name]_[hash]',
  18. path: path.join(__dirname,'build/library/[name].json')
  19. })
  20. ]
  21. }
  22. 第二步 package.json文件中
  23. "scripts":{
  24. "dll":"webpack --config webpack.dll.js"
  25. }
  26. 第三步 执行 npm run dll :
  27. 将会在build / library目录下打包出一个library_xxxx.js的文件
  28. 第四步 在webpack.config.js文件中引入打包后的文件
  29. module.exports = {
  30. plugins:[
  31. new webpack.DllReferencePlugin({manifest:require('./build/library/library_xxx.json')})
  32. ]
  33. }

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

  1. 缓存思路:
  2. 1 babel-laoder 开启缓存
  3. 2 terser-webpack-plugin 开启缓存
  4. module.exports = {
  5. optimization:{
  6. minimizer:[
  7. new TerserPlugin({parallel:true,cache:true})
  8. ]
  9. }
  10. }
  11. 3 使用cache-loader 或者 hard-source-webpack-plugin
  12. const HardSoirceWebpackPlugin = require('hard-source-webpack-plugin')
  13. module.exports = {
  14. plugins:[
  15. new HardSoirceWebpackPlugin()
  16. ]
  17. }

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

  1. 优化 resolve.modules配置 减少模块搜索层级
  2. 优化 resolve.mainFields 配置
  3. 优化 resolve.extensions 配置
  4. 合理使用 alias
  5. module.exports = {
  6. resolve:{
  7. alias:{
  8. // 遇到react直接查找 这个目录下的就可以了
  9. react:path.resolve(__dirname,'./node_module/react/dist/react.main.js'),
  10. },
  11. modules:[path.resolve(__dirname,'node_modules')], 查找依赖的路径
  12. extensions:['.js'],
  13. mainFields:['main']
  14. }
  15. }

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

  1. 需要purgecss-webpack-plugin结合mini-css-extract-plugin使用
  2. webpack.config.js文件中
  3. const PurgecssWebpackPlugin = require('purgecss-webpack-plugin')
  4. const MiniCssExtractPlugin = require('mini-css-extract-plugin')
  5. const PATHS = {src:path.join(__dirname.'src')}
  6. module.exports = {
  7. plugins:[
  8. new PurgecssWebpackPlugin({
  9. paths:glob.sync(`${PATHS.src}/**/*`,{nodir:true})
  10. })
  11. ]
  12. }

15 webpack对图片进行压缩

  1. rules: [{test:/.(giflpngljpe?glsvg)$/i,
  2. use:[
  3. 'file-loader',
  4. loader: 'image-webpack-loader',
  5. options:{
  6. mozjpeg:{
  7. progressive: true,
  8. quality: 65
  9. }
  10. // optipng.enabled: false will disable optipng
  11. optipng:{
  12. enabled: false,
  13. }
  14. pngquant: {
  15. quality:'65-90',
  16. speed: 4
  17. }
  18. gifsicle: {
  19. interlaced: false,
  20. }
  21. // the webp option will enable WEBP
  22. webp:{
  23. quality:75
  24. }
  25. }
  26. }
  27. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/396930
推荐阅读
相关标签
  

闽ICP备14008679号