当前位置: 首页 > news >正文

前端工程启动工具

一些思考

在公司项目中,需要启一个新的前端工程(一个基于Webpack的React工程)。因为同一个项目中有其他的前端工程,我们最开始想的是参考另外一个工程的配置重启一个新的工程,但是又因为原来的工程用的库版本都比较老,而我们这个新的工程又需要安装最新的依赖,所以就只能从头开始启一个工程了。

但是这个过程也是比较曲折的,经历了几次推翻重启。

首先,第一版我们为了避免各种依赖之间的版本冲突,就将原来工程中的packages.json文件中内容复制到新工程里,然后再将我们需要的Webpack配置以及其他的基础配置配好后,启动测试。测试通过后,我们尝试将我们想要升级的依赖升级到我们想要的版本,比如React18和Webpack5。在这个期间,也会出现一些需要修改的配置文件,比如旧版本的写法不适用于新版本,这时我们就需要用新版本的写法覆盖旧版本的内容。解决完这部分问题后,我们已确定我们的工程可以正确启动了,并且可以达到我们想要的启动后的结果,所以我们就认为这部分工作我们已经做完了。但是为了确保我们的思路是否正确,我们将产出的结果拿去给公司更senior的同事看了后,他提出了一些建设性的意见,比如:

  1. 由于我们的做法是将旧工程的配置文件都复制到新的工程里面来,所以里面会有很多我们暂时用不到的依赖、配置,那这时候就会有很多冗余代码,并且会降低构建速度,还会造成配置混乱,增加项目的复杂度和维护成本,也会存在一些潜在的错误或者问题;
  2. 对于我们启工程且后续需要在这个工程上编码的同学来说,一些没有用的配置也会给我们带来压力,比如会增加阅读和理解代码的成本,也会让我们的思路变得不清晰,不利于学习。

所以,基于此意见,我们选择重新启一个工程。

然后,第二版我们根据上一次的经验,选择用到什么再加什么配置,而不是一股脑的把所有需要用到的配置都加上去,最后再解决冲突。这样的好处就是能让我们的思路变得清晰,并且让我们能更好地理解这个工程,在其他人需要了解的时候我们也可以能清晰地给讲出某一个配置的由来及作用是什么。这个时候我们的步骤是:

  1. 先使用create-react-app脚手架搭建一个基础的React工程,测试运行通过后进行下一步。
  2. 在其中增加Webpack的相关配置,比如增加Webpack.config.common.js文件,编写如下文提到的Webpack四个核心概念的内容(entry、output、loader、plugins),然后再补充dev环境的Webpack配置Webpack.config.dev.js文件,修改script运行脚本为webpack serve --config config/webpack.config.dev.js --progress。然后进行测试运行。

(参考本片文章:从零开始创建react+webpack项目)

在这个过程期间,我们有遇到一些问题,也去求助了senior同事,他们告诉我们说,我们的方法也可以用,但是在一般正式的项目上如果需要重写使用create-react-app脚手架搭建的工程中的Webpack相关配置时,会采用raect-app-rewired的方式创建,react-scripts 提供的 config-overrides.js 文件可以修改 Webpack 配置。config-overrides.js 文件通过导出一个函数来修改 CRA 的默认配置。这个函数接受一个 config 参数,可以在其中修改 Webpack 配置。例如,可以添加、修改或删除 Loaders、Plugins、Optimizations 等等。下面是一个简单的例子:

上述示例在 Webpack 配置中添加了一个处理 .txt 文件的 Loader,并将输出目录更改为 custom-build。

除此之外,也可以使用执行eject脚本的方式暴露出Webpack配置文件,然后进行自定义设置。

  1. 执行以下命令来暴露Webpack配置文件:npm run eject
  2. 执行上述命令后,Create React App将会生成一个 config 文件夹和相应的配置文件,包括 webpack.config.js。可以在这些配置文件中进行修改和定制。
  3. 然后可以根据需要修改Webpack配置,例如添加额外的loader、plugins、自定义路径等。
  4. 修改配置后,运行 npm start启动开发服务器。

以上的工作就算告一段落了。我们在总结的过程中,从另外一位同事那里了解到,一般比较大的项目并且需要的配置比较多的项目,比如测试,Webpack,antDesign、routes等,也会采用umi脚手架启动工程。umi是阿里推出的一个企业级的React应用开发框架,它提供了一系列工具和约定,帮助开发者快速构建可扩展、高效和易维护的React应用。

umi脚手架具有以下主要特点和功能:

  1. 路由管理:UMI内置了强大的路由系统,支持配置式路由和约定式路由。通过配置文件或目录结构自动生成路由,支持嵌套路由、动态路由、权限控制等功能。
  2. 插件机制:UMI提供了丰富的插件机制,可以通过引入插件来扩展和定制项目功能。UMI插件可以处理路由、构建、数据模拟、国际化等方面的需求,且插件具有良好的生态和社区支持。
  3. 开发模式支持:UMI支持多种开发模式,包括单页应用(SPA)、服务器渲染(SSR)、静态网站生成(SSG)等。可以根据项目需求选择合适的开发模式,并进行相应的配置。
  4. 状态管理:UMI天然支持多种状态管理方案,包括React Context、Redux、Mobx等。可以根据项目需求选择合适的状态管理方案。
  5. 构建工具:UMI集成了Webpack和Babel等构建工具,使得项目的构建和打包过程更加简化。可以通过配置文件对构建过程进行定制,并享受热更新、代码分割、按需加载等优秀的构建特性。
  6. 测试和部署:UMI提供了一系列测试工具和部署方案,可以帮助编写和运行单元测试、集成测试,并方便地将应用程序部署到各种环境中。

但与此同时,umi也存在一定的缺点:

  1. 配置复杂性:虽然umi提供了丰富的配置选项,但也会导致配置复杂性增加。对于初学者或简单项目来说,会过于复杂且“重”,需要手动删除不需要的依赖及配置;
  2. 依赖关系:umi依赖于一些其他的工具或库,例如Webpack、babel、React等。这些依赖关系可能会导致一些版本兼容性或依赖冲突的问题,需要手动管理和解决。

所以,在工作中,可以根据项目的需要选择脚手架去创建工程。这个部分还需要再了解,跟着有经验的同事深入学习。

上述工作完成后,我也整理了一些关于Webapck的相关内容,整理一下思路,以便在以后的工作中用到。

为什么需要打包工具
开发时,我们会使用框架(React、Vue),ES6模块化语法,Less/Sass等css预处理器等语法 进行开发。
这样的代码要想在浏览器运行必须经过编译成浏览器能识别的JS、css等语法才能运行。所以打包工具就是帮我们完成这一步骤。除此之外,打包工具还能压缩代码、做兼容性处理、提升代码性能等。
Webpack的核心概念
在弄清楚Webpack之前需要了解清楚以下四个核心概念。
entry
在Webpack中,entry指定应用程序的入口点(entry point)。它是Webpack构建过程的起点,表示Webpack应该从哪个文件开始构建应用程序的依赖图。
在Webpack配置文件中,可以通过entry属性来指定一个或多个入口点。每个入口点对应一个文件路径,可以是单个JavaScript文件、CSS文件、HTML文件或其它类型的文件。Webpack会根据这些入口点开始分析和解析依赖关系,构建整个应用程序的依赖图。
例如:

module.exports = {entry: './src/main.js',
};

在上面的例子中,entry属性指定了.src/main/js作为应用程序的入口点。Webpack将从这份文件开始构建应用程序,并根据它的依赖关系进一步解析其他模块和资源。

output

在Webpack中,output指的是构建输出的配置选项。定义了Webpack打包后的文件输出位置和文件名等相关信息。如下是常用的配置选项:

  • path:指定输出文件的目标路径。例如path: path.resolve(__dirname, 'dist),将输出文件保存在项目根目录下的dist文件夹中。
  • filename:指定输出文件的名称。默认为bundle.js,也可以使用占位符和变量来生成动态的文件名。例如,filename:'bundle.js'将生成一个名为bundle.js的输出文件。
  • publicPath:指定输出文件在被引用时的公共路径。用于配置在浏览器中加载静态资源的路径。例如,publicPath: '/assets/'会将输出文件的路径前缀设置为/assets/
  • chunkFilename: 配置非入口点的代码块(chunk)的文件名。这些代码块通常是按需加载时生成的。例如,chunkFilename: '[name].js'将生成基于代码块名称的文件名。
module.exports = {output: {path: path.resolve(__dirname, 'dist'),filename: 'bundle.js',publicPath: '/assets/',},
};
loader

在Webpack中,loader指的是用于处理特定类型的文件的加载器。Webpack在打包过程中会遇到不同类型的文件,例如JavaScript文件、CSS文件、图片、字体文件等,而加载器会告诉Webpack如何处理这些文件。

Webpack的加载器通过转换文件内容或执行一些额外的任务来对文件进行处理。加载器可以将文件转换为JavaScript模块,将Sass文件转换为CSS,对图片进行压缩和优化等等。加载器可以链式调用,允许按顺序应用一系列转化和处理操作。

加载器通常在Webpack配置文件的module.rules属性中定义。每个加载器规则由两部分组成:

  1. test:用于匹配文件路径的正则表达式,指定了应该由该加载器进行处理的文件类型。
  2. use:指定使用的加载器,可以是单个加载器或多个加载器组成的数组。加载器可以是内置的Webpack加载器,也可以是通过npm安装的第三方加载器。

例如:

module.exports = {// 其他配置项...module: {rules: [{test: /\.css$/,use: ['style-loader', 'css-loader'],},{test: /\.(png|jpg|gif)$/,use: ['file-loader'],},],},
};

上述示例中,定义了两个加载器规则:

  1. 对于以.css结尾的文件,使用style-loader和css-loader加载器进行处理。css-loader用于解析CSS文件,而style-loader用于将解析后的CSS添加到页面中。
  2. 对于以.png.jpg.gif结尾的文件,使用file-loader加载器进行处理。file-loader用于处理图片文件,将它们复制到输出目录并返回最终的URL。
plugins

在Webpack中,plugins指的是用于执行更广泛范围任务饿自定义构建流程的插件。插件可以用于从打包过程中的各个阶段添加额外的功能和扩展Webpack的功能。

Webpack的插件可以处理各种任务,包括但不限于:

  • 优化输出文件,例如压缩、混淆和代码分割;
  • 处理非JavaScript文件,例如将CSS提取为单独的文件、压缩图像等;
  • 注入全局变量或环境变量;
  • 生成HTML文件,自动引入打包后的资源;
  • 清理输出目录,确保每次构建都是干净的;
  • 收集统计信息,例如构建报告、Bundle分析等;
  • 在构建过程中执行自定义逻辑和任务。

要使用插件,需要在Webpack配置文件中的plugins属性中实例化和配置它们。插件可以是内置的Webpack插件,也可以是通过npm安装的第三方插件。

例如:

const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');module.exports = {// 其他配置项...plugins: [new HtmlWebpackPlugin({template: './src/index.html',}),new CleanWebpackPlugin(),],
};

在上述示例中,使用到了两个插件:

  1. HtmlWebpackPlugin:用于生成HTML文件并自动将打包后的资源引入。通过指定template选项,可以指定基于哪个模版文件生成的HTML文件;
  2. CleanWebackPlugin:用于清理输出目录。每次构建之前,它会自动清除输出目录,确保每次构建都是干净的。

相关文章:

前端工程启动工具

一些思考 在公司项目中,需要启一个新的前端工程(一个基于Webpack的React工程)。因为同一个项目中有其他的前端工程,我们最开始想的是参考另外一个工程的配置重启一个新的工程,但是又因为原来的工程用的库版本都比较老…...

游戏逆向基础-跳出游戏线程发包

附加游戏后下断点 bp ws2_32.send send函数断下后,可以看到数据地址每次都一样 可以说明这个游戏是线程发包,所以直接在数据窗口中转到这个地址,然后对这个地址下硬件写入断点。 下了硬件写入断点后可以一层一层往上面跟,确定写…...

做海外网站需要准备什么

一,购买域名 在租用国外服务器之前,您需要购买域名。域名是访问网站的标志,也是网站品牌的一部分。因此,在购买域名时,需要考虑域名的可记忆性、简短性和搜索性,使网站更容易被用户记住。 二,租…...

通过OpenCV实现 Lucas-Kanade 算法

目录 简介 Lucas-Kanade 光流算法 实现步骤 1. 导入所需库 2. 视频捕捉与初始化 3. 设置特征点参数 4. 创建掩模 5. 光流估计循环 6. 释放资源 结论 简介 在计算机视觉领域,光流估计是一种追踪物体运动的技术。它通过比较连续帧之间的像素强度变化来估计图…...

7、Vue2(二) vueRouter3+axios+Vuex3

14.vue-router 3.x 路由安装的时候不是必须的,可以等到使用的时候再装,如果之前没有安装的话,可以再单独安装。之前的终端命令行不要关闭,再重新开一个,还需要再package.json文件的依赖中添加。 如果忘记之前是否有安…...

最新PHP礼品卡回收商城 点卡回收系统源码_附教程

最新PHP礼品卡回收商城 点卡回收系统源码_附教程 各大电商平台优惠券秒杀拼团限时折扣回收商城带余额宝 1、余额宝理财 2、回收、提现、充值、新订单语音消息提醒功能 3、带在线客服 4、优惠券回收功能 源码下载:https://download.csdn.net/download/m0_66047…...

MySQL数据库和表的基本操作

文章目录 一、数据库的基础知识 背景知识数据库的基本操作二、数据类型 字符串类型数值类型日期类型三、表的基本操作 创建表查看表结构查看所有表删除表 一、数据库的基础知识 背景知识 MySQL是一个客户端服务器结构的程序 主动发送数据的这一方,客户端(client…...

SAM应用:医学图像和视频中的任何内容分割中的基准测试与部署

医学图像和视频中的任何内容分割:基准测试与部署 目录 摘要:一、引言1.1 SAM2 在医学图像和视频中的应用 二.结果2.1 数据集和评估协议2.2 二维图像分割的评估结果 三 讨论四 局限性和未来的工作五、方法5.1数据来源和预处理5.2 微调协议5.3 评估指标 总…...

Qt消息对话框

问题对话框 对应API [static] QMessageBox::StandardButton QMessageBox::question( QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons StandardButtons(Yes | No), QMessageBox::StandardButton defaultButt…...

FreeRTOS的队列管理

“队列”提供了一种任务到任务、任务到中断和中断到任务的通信机制。 队列特性 数据存储 队列可以容纳有限数量的固定大小的数据项。队列可以容纳的最大项目数称为其“长度”。每个数据项的长度和大小都是在创建队列时设置的。 队列通常用作先进先出(FIFO&#xf…...

买卖股票的最佳时机(动态规划方法总结)

总结一下,买卖股票系列的动态规划思想,贪心解法或者其他解法不做描述。 总结 121. 买卖股票的最佳时机 只有一次交易机会,每天有两种状态:持有股票和不持有股票; 122. 买卖股票的最佳时机 II 有多次交易机会&#x…...

KubeSphere安装mysql8.4.0

背景 KubeSphere 是在 Kubernetes 之上构建的以应用为中心的多租户容器平台,完全开源,提供全栈的 IT 自动化运维的能力,简化企业的 DevOps 工作流。KubeSphere 提供了运维友好的向导式操作界面,帮助企业快速构建一个强大和功能丰富的容器云平台。 安装组件前提&am…...

SpringBoot项目热部署-devtools

DevTools 会使用两个类加载器&#xff08;一个用于加载不变的类&#xff0c;一个用于加载可能会变化的类&#xff09;&#xff0c;每次重启只重新加载管理变化的类的加载器&#xff0c;因此会快很多 1.导入依赖 <dependency> <groupId>org.springframework.boot&l…...

从MySQL到OceanBase离线数据迁移的实践

本文作者&#xff1a;玉璁&#xff0c;OceanBase 生态产品技术专家。工作十余年&#xff0c;一直在基础架构与中间件领域从事研发工作。现负责OceanBase离线导数产品工具的研发工作&#xff0c;致力于为 OceanBase 建设一套完善的生态工具体系。 背景介绍 在互联网与云数据库技…...

ifconfig 和 ip addr

1. 工具所属套件 ifconfig&#xff1a;属于较老的 net-tools 套件。曾是 Unix 和 Linux 系统上广泛使用的工具。ip addr&#xff1a;属于较新的 iproute2 套件。它取代了 ifconfig&#xff0c;并逐渐成为现代 Linux 系统上更常用的工具。 2. 功能覆盖范围 ifconfig&#xff…...

NCCL报错

1、报错信息&#xff1a; raise RuntimeError("Distributed package doesnt have NCCL " "built in") RuntimeError: Distributed package doesnt have NCCL built in 2、报错原因&#xff1a; windows系统不支持nccl&#xff0c;采用gloo&#xff1b; …...

域7:安全运营 第16章 安全运营管理

第七域包括 16、17、18、19 章。 第七域所涵盖的广泛知识点&#xff0c;与我们的安全运营工作之间存在着高度的契合性。这些知识点不仅为我们的安全运营提供了有力的理论支撑&#xff0c;还使得SOC&#xff08;安全运营中心&#xff09;在日常运作中能够更加高效地发挥作用。通…...

研发线上事故风险解读之数据库存储

专业在线打字练习平台-巧手打字通&#xff0c;只输出有价值的知识。 一 前言 本文继续基于《线上事故案例集》&#xff0c;进一步深入梳理线上事故数据存储方面的问题点&#xff0c;重点关注数据库存储在使用和优化过程中可能出现的问题&#xff0c;旨在为读者提供具有实践指导…...

react hooks中在setState后输出state为啥没有变化,如何解决

在 React Hooks 中&#xff0c;setState 的概念被 useState 或 useReducer 钩子所替代。与类组件中的 setState 一样&#xff0c;这些钩子也是异步更新状态的。因此&#xff0c;如果你尝试在调用 setState&#xff08;即 setXXX 函数&#xff09;后立即读取状态值&#xff0c;你…...

C++设计模式——代理模式

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 引言代理模式的定义代理模式的具体实现 引言 我们经常听到代理服务器「代理服务器是一个中间服务器&#xff0c;能够接收客户端的请求&#xff0c;并代表客户端向服务器发起请求&#xff0c;然后将服…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...