博客
关于我
详解webpack打包
阅读量:540 次
发布时间:2019-03-08

本文共 3124 字,大约阅读时间需要 10 分钟。

Webpack入门与实践指南

模块化打包工具的由来

随着前端开发的日益复杂,传统的静态资源打包方式逐渐暴露出一系列问题:

  • 环境兼容性问题:ES Modules在不同浏览器中的兼容性存在差异,难以统一管理。
  • 资源管理痛点:随着项目复杂度增加,模块文件数量急剧上升,资源加载频率增高。
  • 资源整合需求:所有前端资源都需要模块化处理,从代码组织到资源管理都需要规范化。

解决问题

为了应对上述挑战,Webpack等模块化打包工具应运而生,通过以下方式实现资源管理:

  • 代码转换:将现代 JavaScript(如 ES6+)转化为浏览器支持的 ES5 模式。
  • 资源合并:在开发模式下按需加载模块,在生产模式下将所有资源打包为单一文件(如 bundle.js)。

模块化打包工具概述

Webpack 是最常用的模块化打包工具,主要功能包括:

  • 模块加载器(Loader):处理不同资源类型的加载,如 CSS、图片等。
  • 代码拆分(Code Splitting):按需加载必要模块,减少初始加载时间。
  • 资源模块(Asset Module):管理并打包不同资源类型。

Webpack快速上手

  • 安装依赖
  • yarn init -y
    yarn add webpack webpack-cli --dev
    1. 配置 webpack.config.js
    2. const path = require('path');
      module.exports = {
      entry: './src/main.js',
      output: {
      filename: 'bundle.js',
      path: path.join(__dirname, 'output')
      }
      };
      1. 运行打包命令
      2. webpack

        Webpack模式

        • none:最基础模式,按需加载资源。
        • production:生产环境优化打包。
        • development:开发环境支持模块化加载和实时更新。

        Webpack资源模块加载

        • CSS 模块加载
        yarn add style-loader css-loader --dev
        • 文件资源加载
        yarn add file-loader --dev
        • DataUrl 加载
        yarn add url-loader --dev
        • 图片资源处理
        yarn add image-webpack-loader --dev

        Webpack插件功能

        常用插件包括:

        • CleanWebpackPlugin:清理打包目录。
        • HtmlWebpackPlugin:自动生成 HTML 文件。
        • CopyWebpackPlugin:复制静态资源。

        Webpack插件开发

        插件通常以函数形式或对象形式实现,并通过 compiler 接口触发特定事件:

        class MyPlugin {
        apply(compiler) {
        compiler.hooks.emit.tap('MyPlugin', (compilation) => {
        // 遍历所有资源文件
        Object.keys(compilation.assets).forEach((name) => {
        if (name.endsWith('.js')) {
        // 修改文件内容
        const content = compilation.assets[name].source();
        // 去除注释
        const cleanContent = content.replace(/\/\*.*\*\//g, '');
        compilation.assets[name] = {
        source: () => cleanContent,
        size: () => cleanContent.length,
        };
        }
        });
        });
        }
        }

        Webpack开发体验优化

        • Webpack Dev Server
        yarn add webpack-dev-server --dev
        • 代理服务
        const devServerConfig = {
        contentBase: './public',
        proxy: {
        '/api': {
        target: 'https://api.github.com',
        pathRewrite: { '^/api': '' },
        changeOrigin: true,
        },
        },
        };

        Source Map

        为开发者提供源代码定位信息,常用模式包括:

        • eval:快速打包,但不支持行列信息。
        • cheap-eval-source-map:兼顾速度与部分定位功能。
        • nosources-source-map:在生产环境下隐藏源代码,防止泄露。

        核心优化配置

      3. Tree Shaking
      4. module.exports = {
        optimization: {
        usedExports: true,
        minimize: true,
        },
        };
        1. 模块合并
        2. module.exports = {
          optimization: {
          concatenateModules: true,
          },
          };
          1. DefinePlugin
          2. const webpack = require('webpack');
            module.exports = {
            plugins: [
            new webpack.DefinePlugin({
            'process.env': {
            NODE_ENV: '"production"',
            },
            }),
            ],
            };

            代码分割与多页面打包

            • 动态加载模块
            import dynamic from 'next/dynamic';
            const Header = dynamic(() => import('Header'), {
            ssr: false,
            });
            • 多入口打包
            module.exports = {
            entry: {
            index: './src/index.js',
            album: './src/album.js',
            },
            };

            公共模块提取与 CSS 压缩

            • 提取公共模块
            module.exports = {
            optimization: {
            splitChunks: {
            chunks: 'all',
            },
            },
            };
            • 安装 CSS 压缩插件
            yarn add optimize-css-assets-webpack-plugin --dev

            输出文件名优化

            • 内容哈希
            output: {
            filename: '[name]-[contenthash].bundle.js',
            },

            注意事项

            • 输出路径:必须是绝对路径。
            • 资源加载方式:支持 ES Modules、CommonJS 和 AMD 格式。
            • Tree Shaking:在生产模式下默认启用,需谨慎使用。
            • 副作用管理:通过 sideEffects 控制模块副作用。

            通过合理配置和优化,Webpack 能够帮助开发者高效管理前端资源,提升打包效率和代码质量。

    转载地址:http://chwiz.baihongyu.com/

    你可能感兴趣的文章
    Nginx的Rewrite正则表达式,匹配非某单词
    查看>>
    Nginx的使用总结(一)
    查看>>
    Nginx的使用总结(三)
    查看>>
    Nginx的使用总结(二)
    查看>>
    Nginx的可视化神器nginx-gui的下载配置和使用
    查看>>
    Nginx的是什么?干什么用的?
    查看>>
    Nginx访问控制_登陆权限的控制(http_auth_basic_module)
    查看>>
    nginx负载均衡和反相代理的配置
    查看>>
    nginx负载均衡器处理session共享的几种方法(转)
    查看>>
    nginx负载均衡的5种策略(转载)
    查看>>
    nginx负载均衡的五种算法
    查看>>
    nginx转发端口时与导致websocket不生效
    查看>>
    Nginx运维与实战(二)-Https配置
    查看>>
    Nginx配置Https证书
    查看>>
    Nginx配置ssl实现https
    查看>>
    Nginx配置TCP代理指南
    查看>>
    Nginx配置——不记录指定文件类型日志
    查看>>
    nginx配置一、二级域名、多域名对应(api接口、前端网站、后台管理网站)
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    nginx配置全解
    查看>>