javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > 前端代码打包与压缩

前端代码打包与压缩的完整指南

作者:北辰alk

前端代码的打包和压缩是现代Web开发中优化性能的关键步骤,本文将全面介绍从基础配置到高级优化的完整方案,并通过代码是讲解的非常详细,需要的朋友可以参考下

一、打包工具选型对比

1.1 主流打包工具特性对比

工具速度Tree Shaking代码分割热更新适用场景
Webpack✔️✔️✔️复杂SPA
Rollup✔️✔️库开发
Parcel最快✔️✔️✔️快速原型
esbuild极快✔️✔️✔️大型项目
Vite超快✔️✔️✔️现代框架

1.2 工具选择决策树

二、Webpack 完整配置

2.1 基础生产配置

// webpack.config.prod.js
const path = require('path');
const TerserPlugin = require('terser-webpack-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');

module.exports = {
  mode: 'production',
  entry: './src/index.js',
  output: {
    filename: '[name].[contenthash:8].js',
    path: path.resolve(__dirname, 'dist'),
    clean: true,
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      },
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      }
    ]
  },
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        parallel: true,
        terserOptions: {
          compress: {
            drop_console: true,
          },
        },
      }),
      new CssMinimizerPlugin(),
    ],
    splitChunks: {
      chunks: 'all',
    },
  },
};

2.2 高级优化配置

代码分割策略:

optimization: {
  splitChunks: {
    cacheGroups: {
      vendors: {
        test: /[\\/]node_modules[\\/]/,
        name: 'vendors',
        chunks: 'all',
      },
      commons: {
        name: 'commons',
        minChunks: 2,
        chunks: 'initial',
        minSize: 0,
      },
    },
  },
  runtimeChunk: {
    name: 'runtime',
  },
}

持久化缓存:

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

三、代码压缩技术详解

3.1 JavaScript 压缩

Terser 配置选项

new TerserPlugin({
  parallel: 4,  // 使用4个线程
  extractComments: false,  // 不提取注释
  terserOptions: {
    compress: {
      pure_funcs: ['console.info'], // 只移除console.info
      dead_code: true,  // 删除不可达代码
      drop_debugger: true,
    },
    format: {
      comments: false,  // 移除所有注释
    },
    mangle: {
      properties: {
        regex: /^_/,  // 只混淆下划线开头的属性
      },
    },
  },
})

3.2 CSS 压缩优化

PostCSS 配置

// postcss.config.js
module.exports = {
  plugins: [
    require('cssnano')({
      preset: ['advanced', {
        discardComments: { removeAll: true },
        colormin: true,
        zindex: false,
      }]
    }),
    require('autoprefixer')
  ]
}

3.3 HTML 压缩

const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html',
      minify: {
        collapseWhitespace: true,
        removeComments: true,
        removeRedundantAttributes: true,
        removeScriptTypeAttributes: true,
        removeStyleLinkTypeAttributes: true,
        useShortDoctype: true,
        minifyCSS: true,
        minifyJS: true,
      },
    }),
  ],
};

四、高级打包技巧

4.1 按需加载

React 动态导入

const LazyComponent = React.lazy(() => import('./LazyComponent'));

function MyComponent() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <LazyComponent />
    </Suspense>
  );
}

Vue 异步组件

const AsyncComp = defineAsyncComponent(() =>
  import('./components/AsyncComponent.vue')
)

4.2 预加载策略

// webpack PreloadPlugin
module.exports = {
  plugins: [
    new PreloadWebpackPlugin({
      rel: 'preload',
      include: 'initial',
      fileBlacklist: [/\.map$/, /hot-update\.js$/],
    }),
    new PrefetchWebpackPlugin({
      rel: 'prefetch',
      include: 'asyncChunks',
    }),
  ],
};

4.3 外部化依赖

module.exports = {
  externals: {
    react: 'React',
    'react-dom': 'ReactDOM',
    lodash: {
      commonjs: 'lodash',
      amd: 'lodash',
      root: '_',
    },
  },
};

五、性能优化指标

5.1 打包分析工具

webpack-bundle-analyzer

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

module.exports = {
  plugins: [
    new BundleAnalyzerPlugin({
      analyzerMode: 'static',
      reportFilename: 'bundle-report.html',
      openAnalyzer: false,
    }),
  ],
};

5.2 关键性能指标

指标优秀值检查方法
首屏JS大小< 200KBBundle Analyzer
CSS阻塞时间< 1sLighthouse
未使用JS< 50KBCoverage Tab
缓存命中率> 90%Network Panel

六、现代工具链方案

6.1 Vite 配置示例

// vite.config.js
import { defineConfig } from 'vite';
import vitePluginImp from 'vite-plugin-imp';

export default defineConfig({
  build: {
    target: 'es2015',
    minify: 'terser',
    terserOptions: {
      compress: {
        drop_console: true,
      },
    },
    rollupOptions: {
      output: {
        manualChunks(id) {
          if (id.includes('node_modules')) {
            return 'vendor';
          }
        },
      },
    },
  },
  plugins: [
    vitePluginImp({
      optimize: true,
      libList: [
        {
          libName: 'lodash',
          libDirectory: '',
          camel2DashComponentName: false,
        },
      ],
    }),
  ],
});

6.2 esbuild 极速打包

// esbuild.config.js
require('esbuild').build({
  entryPoints: ['src/index.js'],
  bundle: true,
  minify: true,
  sourcemap: true,
  outfile: 'dist/bundle.js',
  target: ['es2020'],
  define: {
    'process.env.NODE_ENV': '"production"',
  },
  plugins: [
    // 添加插件
  ],
}).catch(() => process.exit(1));

七、多环境配置策略

7.1 环境变量管理

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

module.exports = (env) => {
  return {
    plugins: [
      new webpack.DefinePlugin({
        'process.env.API_URL': JSON.stringify(env.production 
          ? 'https://api.prod.com' 
          : 'https://api.dev.com'),
      }),
    ],
  };
};

7.2 差异化打包

// package.json
{
  "scripts": {
    "build:prod": "webpack --config webpack.prod.js --env production",
    "build:stage": "webpack --config webpack.prod.js --env staging",
    "build:analyze": "webpack --profile --json > stats.json"
  }
}

八、安全最佳实践

8.1 源码保护

代码混淆

// 使用webpack-obfuscator
const JavaScriptObfuscator = require('webpack-obfuscator');

module.exports = {
  plugins: [
    new JavaScriptObfuscator({
      rotateStringArray: true,
      stringArray: true,
      stringArrayThreshold: 0.75,
    }, ['excluded_bundle.js']),
  ],
};

8.2 完整性校验

<script src="app.js" integrity="sha384-..."></script>
<link href="app.css" rel="external nofollow"  rel="stylesheet" integrity="sha256-...">

九、持续集成方案

9.1 GitHub Actions 示例

name: Build and Deploy

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - uses: actions/setup-node@v2
      with:
        node-version: '16'
    - run: npm ci
    - run: npm run build
    - uses: actions/upload-artifact@v2
      with:
        name: production-build
        path: dist

9.2 构建缓存优化

- name: Cache node modules
  uses: actions/cache@v2
  with:
    path: |
      ~/.npm
      node_modules
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}

十、新兴打包技术

10.1 SWC 加速方案

// .swcrc
{
  "jsc": {
    "parser": {
      "syntax": "ecmascript",
      "jsx": true
    },
    "target": "es2015",
    "minify": {
      "compress": {
        "drop_console": true
      },
      "mangle": true
    }
  },
  "module": {
    "type": "es6"
  }
}

10.2 基于 Rust 的工具链

使用 Parcel 2

parcel build src/index.html \
  --no-source-maps \
  --dist-dir build \
  --public-url ./

实战总结

基础流程

优化黄金法则

工具选择建议

通过合理配置打包工具链,结合项目特点选择优化策略,可以显著提升前端应用的加载性能和运行效率。建议定期使用 Lighthouse 等工具审计性能,持续优化打包配置。

以上就是前端代码打包与压缩的完整指南的详细内容,更多关于前端代码打包与压缩的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文