webpack(react)基本构建

文章目录

    • 概要
    • 整体架构流程
    • 技术名词解释
    • 技术细节
    • 小结

概要

Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。它的主要功能是将各种资源(如 JavaScript、CSS、图片等)视为模块,并将它们打包成一个或多个输出文件,以便在浏览器中使用。以下是对 Webpack 的一些关键理解:

1. 模块化

Webpack 采用模块化的概念,允许开发者将应用程序拆分成多个独立的模块。每个模块可以是一个 JavaScript 文件、CSS 文件,甚至是图片或字体。Webpack 会分析这些模块之间的依赖关系,并生成一个依赖图。

2. 入口和输出

  • 入口(Entry):Webpack 的构建过程从入口文件开始。开发者可以指定一个或多个入口文件,Webpack 会从这些文件开始构建依赖图。
  • 输出(Output):Webpack 允许开发者配置输出的文件名和文件路径。默认情况下,Webpack 会将打包后的文件输出到 dist 目录。

3. 加载器(Loaders)

加载器是 Webpack 的核心概念之一。它们允许开发者处理非 JavaScript 文件(如 CSS、Sass、TypeScript、图片等)。通过使用加载器,Webpack 可以将这些文件转换为有效的模块。例如,使用 babel-loader 可以将 ES6+ 的 JavaScript 转换为兼容的 ES5 代码。

4. 插件(Plugins)

插件是 Webpack 的另一重要特性。它们提供了更强大的功能,能够扩展 Webpack 的功能。通过插件,开发者可以执行各种任务,比如压缩代码、提取 CSS、生成 HTML 文件、热模块替换等。常用的插件包括 HtmlWebpackPluginMiniCssExtractPluginTerserWebpackPlugin

5. 开发服务器(Dev Server)

Webpack 提供了一个开发服务器(webpack-dev-server),可以在本地开发时提供即时的热重载功能。当代码发生变化时,开发服务器会自动刷新浏览器,帮助开发者更高效地进行开发。

6. 优化

Webpack 提供了一系列优化选项,如代码分割(Code Splitting)、懒加载(Lazy Loading)、树摇(Tree Shaking)等。这些功能可以帮助减小输出文件的大小,提高加载速度和性能。

7. 配置

Webpack 的配置文件通常是一个 JavaScript 文件(webpack.config.js),开发者可以在其中定义入口、输出、加载器、插件等配置项。尽管 Webpack 的配置文件可以非常复杂,但它也提供了灵活性,允许开发者根据项目需求进行定制。

8. 社区和生态系统

Webpack 拥有一个活跃的社区和丰富的生态系统,提供了大量的插件和加载器,可以满足各种需求。这个生态系统使得 Webpack 成为前端开发中非常流行的工具之一。

总结

Webpack 是一个强大且灵活的工具,可以帮助开发者构建现代化的 JavaScript 应用程序。通过模块化、加载器、插件和优化等特性,Webpack 有效地管理和打包应用程序的资源,提升开发效率和应用性能。虽然学习曲线可能较陡峭,但掌握 Webpack 后,开发者能够更好地管理复杂的前端项目。

整体架构流程

1. 初始化

  • 配置文件:Webpack 从配置文件(通常是 webpack.config.js)开始读取配置。这个文件定义了 Webpack 的入口、输出、模块、插件等各种设置。
  • 环境变量:Webpack 会根据环境变量(如 NODE_ENV)来决定是以开发模式还是生产模式运行。

2. 入口(Entry)

  • 解析入口文件:Webpack 根据配置中的入口(entry)选项,确定从哪个文件开始构建依赖图。入口可以是一个文件,也可以是一个数组或对象(用于多入口)。
  • 构建依赖图:Webpack 会分析入口文件中的 import 和 require 语句,递归解析所有依赖的模块,形成一个完整的依赖图。

3. 模块解析(Module Resolution)

  • 加载器(Loaders):在解析模块时,Webpack 会使用加载器来处理不同类型的文件。加载器可以将非 JavaScript 文件(如 CSS、图片、TypeScript 等)转换为有效的模块。
  • 执行模块:Webpack 会执行每个模块,生成一个模块对象并将其缓存,以便在后续引用时能够快速访问。

4. 插件(Plugins)

  • 应用插件:在构建过程中,Webpack 会调用配置中的插件。插件可以在不同的生命周期钩子中执行特定的任务,如优化代码、生成 HTML 文件、提取 CSS 等。
  • 增强功能:插件的作用非常广泛,可以用来增强 Webpack 的功能,处理各种复杂的构建需求。

5. 输出(Output)

  • 生成输出文件:Webpack 根据输出配置,将打包后的文件生成到指定的输出目录。输出文件的名称可以使用占位符(如 [name][hash] 等)进行动态命名。
  • 生成清单文件:Webpack 还可以生成清单文件(如 manifest.json),记录模块之间的依赖关系和版本信息。

6. 优化

  • 代码分割(Code Splitting):Webpack 支持将代码拆分成多个文件,以便按需加载,减少初始加载时间。
  • 树摇(Tree Shaking):Webpack 会通过静态分析删除未使用的代码,减小输出文件的大小。
  • 压缩和混淆:在生产模式下,Webpack 通常会使用插件(如 TerserWebpackPlugin)来压缩和混淆代码,提高性能。

7. 开发服务器(Dev Server)

  • 热模块替换(Hot Module Replacement, HMR):Webpack 提供了开发服务器,可以在开发过程中实现热模块替换,允许开发者在不刷新页面的情况下更新模块。
  • 实时重载:开发服务器会监控文件变化,并自动刷新浏览器,提升开发效率。

8. 完成

  • 构建完成:Webpack 在完成所有模块的解析、处理和输出后,构建过程结束。开发者可以在浏览器中查看打包后的应用程序。

技术名词解释

1. 模块(Module)

在 Webpack 中,模块是构成应用程序的基本单元。每个模块可以是一个 JavaScript 文件、CSS 文件、图像或其他资源。Webpack 将这些模块视为独立的单元,并在构建过程中处理它们的依赖关系。

2. 入口(Entry)

入口是 Webpack 开始构建的地方。它指向应用程序的主文件或多个文件,Webpack 从这些文件开始解析依赖关系。可以通过配置文件中的 entry 属性来指定。

3. 输出(Output)

输出是 Webpack 打包后生成的文件的配置。它定义了打包文件的名称、路径和其他输出选项。通过配置文件中的 output 属性来设置。

4. 加载器(Loader)

加载器是 Webpack 的一个核心概念,用于处理非 JavaScript 文件。它们允许开发者将不同类型的文件(如 CSS、Sass、TypeScript、图片等)转换为有效的模块。加载器在 Webpack 构建过程中执行,可以在配置中通过 module.rules 来定义。

5. 插件(Plugin)

插件是 Webpack 的另一重要特性,用于扩展 Webpack 的功能。插件可以在构建的不同阶段执行特定的任务,如优化代码、生成 HTML 文件、提取 CSS 等。通过配置文件中的 plugins 数组来使用插件。

6. 依赖图(Dependency Graph)

依赖图是 Webpack 在构建过程中生成的一个结构,表示模块之间的依赖关系。Webpack 根据入口文件分析所有模块及其依赖,形成一个完整的依赖图,以便在打包时正确处理模块的顺序。

7. 热模块替换(Hot Module Replacement, HMR)
 热模块更换(Hot Module Replacement,HMR)

热模块替换是 Webpack 提供的一项功能,允许在开发过程中替换、添加或删除模块,而无需完全刷新页面。这有助于提高开发效率,保持应用程序的状态。

8. 代码分割(Code Splitting)

代码分割是 Webpack 的一项优化技术,允许将代码拆分成多个小块,以便按需加载。这可以减少初始加载时间,提高应用程序的性能。

9. 树摇(Tree Shaking)

树摇是 Webpack 的一项优化技术,旨在通过静态分析删除未使用的代码,从而减小输出文件的大小。这通常在生产模式下进行,以提高应用程序的性能。

10. 开发服务器(Dev Server)

Webpack 提供的开发服务器(webpack-dev-server)用于在本地开发时提供即时的热重载功能。它监控文件的变化,并在发生变化时自动刷新浏览器。

11. 清单文件(Manifest)

清单文件是 Webpack 生成的一个 JSON 文件,记录了模块之间的依赖关系和版本信息。它用于帮助管理和加载模块,尤其是在使用代码分割时。

12. 配置文件(Configuration File)

Webpack 的配置文件通常是一个 JavaScript 文件(webpack.config.js),用于定义 Webpack 的入口、输出、加载器、插件等各种设置。配置文件可以根据项目的需求进行定制。

13. 环境变量(Environment Variables)

环境变量用于配置 Webpack 在不同环境下的行为,如开发模式和生产模式。通常使用 NODE_ENV 来指示当前的环境,以便在构建时应用不同的优化和设置。

14. 输出文件名占位符(Output Filename Placeholders)

Webpack 允许在输出文件名中使用占位符(如 [name][hash][chunkhash] 等)进行动态命名。这有助于实现缓存策略和版本控制。

15. 异步加载(Lazy Loading)

异步加载是一种技术,允许在需要时加载模块,而不是在应用程序启动时加载所有模块。这可以通过代码分割和动态 import() 实现,帮助提高应用程序的性能。

技术细节

1、我们可以先通过命令npx i create-react-app my-app创建一个react项目。

2、在根目录创建两个文件:

        webpack.config.dev.js写开发环境配置
const path = require('path')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')

const config = {
    entry: './src/index.js',
    output: {
        filename: '[name].js',
        path: path.resolve(__dirname, './dist')
    },
    mode: 'development',
    plugins: [
        new HtmlWebpackPlugin({
            template: './public/index.html'
        }),
        // new MiniCssExtractPlugin()
    ],
    devServer: {
        static: {
            directory: path.join(__dirname, 'public'),
        },
        compress: true,
        port: 9000,
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: [
                    'style-loader',
                    'css-loader',
                ]
            },
            {
                test:/\.js$/,
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader',
                }
            },
            {
                test:[/\.bmp$/, /\.png$/, /\.jpe?g$/, /\.gif$/],
                type:'asset'
            },
            {
                test: /\.svg$/,
                use: 'url-loader'
            }
        ]
    }
}

module.exports = config
在运行之前还要配置babel.config.json文件,这里是babel的预设。
{
    "presets":[
       ["@babel/preset-react",
            {
                "runtime": "automatic"
            }
        ]
    ]
}
webpack.congif.prod.js写生产环境代码,生产环境中没有devServer的配置
const path = require('path')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')

const config = {
    entry: './src/index.js',
    output: {
        filename: '[name].js',
        path: path.resolve(__dirname, './dist')
    },
    mode: 'production',
    plugins: [
        new HtmlWebpackPlugin({
            template: './public/index.html'
        }),
        new MiniCssExtractPlugin()
    ],

    module: {
        rules: [
            {
                test: /\.css$/,
                use: [
                    // 'style-loader',
                    MiniCssExtractPlugin.loader,
                    'css-loader',
                ]
            },
            {
                test:/\.js$/,
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader',
                }
            },
            {
                test:[/\.bmp$/, /\.png$/, /\.jpe?g$/, /\.gif$/],
                type:'asset'
            },
            {
                test: /\.svg$/,
                use: 'url-loader'
            }
        ]
    }
}

module.exports = config

3、修改pageage.json文件中的启动命令

"scripts": {
    "my_dev": "webpack serve --config webpack.config.dev.js",
    "my_prod": "webpack build --config webpack.config.prod.js"
  },

4、手动发布

通过npm run my_prod构建打包,生成dist文件夹。

对于前端来说

拿到一个项目首先需要通过npm i 回复依赖

其次我们可以在腾讯云搜索cos  对象存储,共有读私有写。

我们要将除了index.html文件之外的所有静态资源文件(图片/js文件/css文件)放到cdn上

根据生成的cdn远程链接,替换在打包完成之后的index.html的两个标签中我下面勾出来的就是要替换的位置。

对于后端来说

将前端打包之后生成的index.html代码复制替换到后端node的html模版位置。

小结

学会webpack的基础搭建,你就已经超越了70%拥有三年前端开发经验的程序员,所以这部分还是需要用心去掌握的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++STL(四)-->vector 的模拟实现

1.vector的各函数接口&#xff1a; namespace cl {//模拟实现vectortemplate<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;//默认成员函数vector(); //构造函数vector(size_t n, cons…

机器学习实战:泰坦尼克号乘客生存率预测(数据处理+特征工程+建模预测)

项目描述 任务&#xff1a;根据训练集数据中的数据预测泰坦尼克号上哪些乘客能生存下来 数据源&#xff1a;csv文件&#xff08;train.csv&#xff09; 目标变量&#xff1a;Survived&#xff08;0-1变量&#xff09; 数据集预览&#xff1a; 1、英文描述&#xff1a; 2、…

MATLAB不动点迭代法求单变量非线性方程的根程序加实例

不动点迭代法用于单变量线性方程近似根&#xff0c;首先确定一个方程根附近的近似初始值&#xff0c;采用逐次逼近的方法&#xff0c;使用迭代公式不断地更新这个初始值&#xff0c;使这个初始值不断趋近于准确值。 1.不动点迭代法自定义函数 fixed_point.m是一个MATLAB函数&a…

BurpSuite使用篇--抓包方法与解码器

BurpSuite是一个web渗透利器&#xff0c;可以抓包改包也可以扫描漏洞&#xff0c;将漏洞扫描和利用集成化一体&#xff0c;更可以支持外部插件拓展&#xff0c;非常牛的工具。 那我们怎么使用呢&#xff1f; 使用BurpSuite 老版本中BurpSuite需要在浏览器中配置本地代理&…

【查询目录】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

ESP32-S3模组上跑通ES8388(8)

接前一篇文章&#xff1a;ESP32-S3模组上跑通ES8388&#xff08;7&#xff09; 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回继续解析到了ESP-ADF的audio_hal层的第1个也是最为关键的函数 —— audio_hal_init()中的第5段代码&#xff0c;也就是mutex_lock函数与mutex_unlo…

bind实验

服务端 查看域名 [rootclient yum.repos.d]# hostname client 设置域名 [rootclient yum.repos.d]# hostnamectl set-hostname dns1.openlab.edu [rootclient yum.repos.d]# cd [rootclient ~]# hostname dns1.openlab.edu 安装bind包 [rootclient ~]# yum install bind -y…

【LeetCode每日一题】——717.1比特与2比特字符

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时空频度】九【代码实现】十【提交结果】 一【题目类别】 数组 二【题目难度】 简单 三【题目编号】 717.1比特与2比特字符 四【题目描述】 有两种特…

Linux学习笔记11 系统启动初始化,服务和进程管理(下)

前文 前文介绍了系统启动初始化程序&#xff0c;介绍了systemd的基础知识。这里主要看一下我们systemd的单元管理和常用的命令以及示例。 Linux学习笔记10 系统启动初始化&#xff0c;服务和进程管理&#xff08;上&#xff09;-CSDN博客 systemd单元管理 启动服务 这很常…

pnpm安装electron出现postinstall$ node install.js报错

pnpm install --registryhttp://registry.npm.taobao.org安装依赖包的时候出现了postinstall$ node install.js报错 找到install.js 找到downloadArtifact方法&#xff0c;添加如下代码 mirrorOptions:{mirror:"http://npmmirror.com/mirrors/electron/"}http://n…

程序执行堆栈执行模拟

所有的文件都是在硬盘&#xff08;磁盘&#xff09;上&#xff0c;调用时先调用javac指令的jdk编译成.class然后被java指令的jre送到内存中&#xff0c;java在内存中有自己的一片区域叫JVM&#xff0c;编译进来的文件首先进入方法区。 staitc的属性就是在进入内存的时候开辟了一…

windows平台使用C#创建系统服务

使用 C# 在 Windows 平台创建和管理系统服务 在 Windows 平台上&#xff0c;系统服务&#xff08;Windows Service&#xff09;是一种运行在后台、无需用户交互的应用程序。系统服务广泛应用于长期任务处理、网络监听、后台调度等场景。本文将详细介绍如何使用 C# 创建一个 Win…

JVM_总结详解

1、CPU和内存的交互 了解jvm内存模型前&#xff0c;了解下cpu和计算机内存的交互情况。【因为Java虚拟机内存模型定义的访问操作与计算机十分相似】 有篇很棒的文章&#xff0c;从cpu讲到内存模型:[什么是java内存模型&#xff1f;] 在计算机中&#xff0c;cpu和内存的交互最…

TLinux 3.1 (Centos 8)修改网卡设备名

原网卡设备名&#xff1a;ifcfg-enp17s 新网卡设备名&#xff1a;ifcfg-eth0 1. 修改接口配置文件名 rename /etc/sysconfig/network-scripts/ifcfg-enp17s /etc/sysconfig/network-scripts/ifcfg-eth0 2. 修改接口配置文件 vi /etc/sysconfig/network-scripts/ifcfg-eth…

ElasticSearch7.x入门教程之全文搜索(七)

文章目录 前言一、多条件查询&#xff1a;bool query二、更加精准查询&#xff1a;dis_max query总结 前言 这里再接着上一篇文章继续记录。非常感谢江南一点雨松哥的文章。 欢迎大家去查看&#xff0c;地址&#xff1a;http://www.javaboy.org 一、多条件查询&#xff1a;boo…

基于springboot 的体质测试数据分析及可视化设计LWPPT

技术可行性&#xff1a;技术背景 本企业网站在Windows操作系统中进行开发&#xff0c;并且目前PC机的性能已经可以胜任普通网站的web服务器。系统开发所使用的技术也都是自身所具有的&#xff0c;也是当下广泛应用的技术之一。 系统的开发环境和配置都是可以自行安装的&#x…

oracle小技巧-解决特殊密码字符而导致的exp错误

在使用oracle数据库的时候&#xff0c;我们经常会利用exp工具对某些表进行导出。但有些时候&#xff0c;因我们用户密码为安全性设有特殊字符&#xff0c;导致exp导出时候报&#xff1a;“EXP-00056和ORA-12154”&#xff0c;今天我们就分享下如何通过设置符号隔离的小技巧解决…

【ArcGIS Pro实操第11期】经纬度数据转化成平面坐标数据

经纬度数据转化成平面坐标数据 数据准备ArcGIS操作步骤-投影转换为 Sinusoidal1 投影2 计算几何Python 示例 另&#xff1a;Sinusoidal (World) 和 Sinusoidal (Sphere) 的主要区别参考 数据准备 数据投影&#xff1a; 目标投影&#xff1a;与MODIS数据相同&#xff08;Sinu…

病理组学分析系列教程1:使用Python-histolab进行病理图像预处理,tiles切片自动生成

首先&#xff0c;先上参考资料链接&#xff1a; 了解数字病理影像图片WSI如何切割-使用histolab 视频详细讲解使用histolab进行病理图像切分 详细介绍数字病理图像的存储格式及格式转换工具介绍 一、病理图像预处理 相信很多朋友对于WSI这种巨大的病理图像的预处理都觉得束…

kubernetes——part3-2 集群声明式文件YAML

一、YAML介绍 YAML 的意思是&#xff1a;仍是一种标记语言&#xff0c;但为了强调这种语言以数据做为中心&#xff0c;而不是以标记语言为重点。是一个可读性高&#xff0c;用来表达数据序列的格式。 二、基本语法 1.低版本缩进时不允许使用Tab键&#xff0c;只允许使用空格…