前端工程启动工具

news2024/10/22 21:14:00

一些思考

在公司项目中,需要启一个新的前端工程(一个基于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:用于清理输出目录。每次构建之前,它会自动清除输出目录,确保每次构建都是干净的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

​​Spring6梳理19——基于注解管理Bean之@Autowired注入

以上笔记来源: 尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解)https://www.bilibili.com/video/BV1kR4y1b7Qc 目录 19.1 Autowired注入 ①场景一:属性注入 19.1.1创建UserDao接口 19.1.2…

如何将数据从 AWS S3 导入到 Elastic Cloud - 第 2 部分:Elastic Agent

作者:来自 Elastic Hemendra Singh Lodhi 了解将数据从 AWS S3 提取到 Elastic Cloud 的不同选项。 这是多部分博客系列的第二部分,探讨了将数据从 AWS S3 提取到 Elastic Cloud 的不同选项。 在本博客中,我们将了解如何使用 Elastic Agent…

OQE-OPTICAL AND QUANTUM ELECTRONICS

文章目录 一、征稿简介二、重要信息三、服务简述四、投稿须知五、联系咨询 一、征稿简介 二、重要信息 期刊官网:https://ais.cn/u/3eEJNv 三、服务简述 四、投稿须知 1.在线投稿:由艾思科蓝支持在线投稿,请将文章全文投稿至艾思科蓝投稿系…

【Linux】————动静态库

作者主页: 作者主页 本篇博客专栏:Linux 创作时间 :2024年10月22日 一.库的定义 什么是库,在windows平台和linux平台下都大量存在着库。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载…

虚拟机网络设置为桥接模式

1、打开VMware Workstation Pro,点击“虚拟机—设置”,进入虚拟机设置页面 2、点击“网络适配器”,网络连接选择桥接模式 3、点击“编辑—虚拟网络编辑器”,进入虚拟网络编辑器页面 4、选择桥接模式,并选择要桥接到的…

Flux.using 使用说明书

using public static <T,D> Flux<T> using(Callable<? extends D> resourceSupplier,Function<? super D,? extends Publisher<? extends T>> sourceSupplier,Consumer<? super D> resourceCleanup)Uses a resource, generated by a…

创建人物状态栏

接下来&#xff0c;我们来尝试制作一下我们的UI&#xff0c;我们会学习unity基本的UI系统 ************************************************************************************************************** 我们要先安装一个好用的插件到我们的unity当中&#xff0c;帮助…

Mac电脑:资源库Library里找不到WebServer问题的解决

今天看到一本书里写到Windows电脑自带IIS Web服务器&#xff0c;好奇了一下下&#xff0c;mac电脑自带的又是什么服务器呢&#xff1f;经查询&#xff0c;原来是Apache服务器&#xff0c;这个名字我很熟悉。只是如何设置呢&#xff1f;我从来没用过&#xff0c;于是试验了一番。…

[Linux进程概念]命令行参数|环境变量

目录 一、命令行参数 1.什么是命令行参数 2.为什么要有命令行参数 &#xff08;1&#xff09;书写的代码段 &#xff08;2&#xff09;实际的代码段 3.Linux中的命令行参数 二、环境变量 1.什么是环境变量&#xff1f; 2.获取环境变量 &#xff08;1&#xff09;指令…

OceanBase 的写盘与传统数据库有什么不同?

背景 在数据库开发过程中&#xff0c;“写盘”是一项核心操作&#xff0c;即将内存中暂存的数据安全地转储到磁盘上。在诸如MySQL这样的传统数据库管理系统中&#xff0c;写盘主要有以下几步&#xff1a;首先将数据写入缓存池&#xff1b;其次&#xff0c;为了确保数据的完整性…

【Qt】控件——Qt输入类控件、常见的输入类控件、输入类控件的使用、Line Edit、Text Edit、Combo Box、Spin Box

文章目录 Qt5. Qt显示类控件Line EditText EditCombo BoxSpin BoxQDateTimeEditDialSlider Qt 5. Qt显示类控件 Line Edit QLineEdit 用于表示单行输入框。可以输入一段文本&#xff0c;但是不能换行。 属性说明text输入框中的文本inputMask输入内容格式约束maxLength最大长度…

【HAD】Half-Truth: A Partially Fake Audio Detection Dataset

文章目录 Half-Truth: A Partially Fake Audio Detection Dataset背景key points研究数据集设计评价指标实验基线:utterance-level分类(话语级)基线:segment-level分类(片段级)Half-Truth: A Partially Fake Audio Detection Dataset 会议/期刊:Interspeech 2021 CCF-C…

哈佛医学生一个月吃720个鸡蛋,结果发现......

你们听说过吃鸡蛋还能降低胆固醇的操作吗&#xff1f; 前段时间&#xff0c;哈佛医学院的学生尼克诺尔维茨&#xff08;Nick Norwitz&#xff09;就做了这样一个实验&#xff0c;得出的结果让大家震惊&#xff01; 许多人认为狂吃鸡蛋不会有好处&#xff0c;因为这会摄入大量胆…

FFT过程中自动补零,补零部分FFT结果不为零

在 FFT&#xff08;快速傅里叶变换&#xff09; 中&#xff0c;补零&#xff08;Zero Padding&#xff09;是为了使信号的点数符合 2 的幂次方&#xff0c;以提高 FFT 的计算效率。然而&#xff0c;即使你对信号进行了补零&#xff0c;FFT 计算后在补零部分可能会得到复数结果不…

<项目代码>YOLOv8工具识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

数字化营销助企业在生态平台实现内卷突围

在当今数字化时代&#xff0c;企业竞争激烈&#xff0c;内卷化严重。而数字化生态平台建设与数字化营销为企业带来了新机遇。 数字化生态平台意义重大。它能整合企业内外资源&#xff0c;提高运营效率。打破地域限制&#xff0c;拓展市场&#xff0c;吸引更多客户。还能为企业创…

TCP——Socket

应用进程只借助Socket API发和收但是不关心他是怎么进行传和收的 数据结构 图示Socket连接 捆绑属于隐式捆绑

如何快速解决谷歌网站页面收录难题?

在外贸网站的运营中&#xff0c;页面无法被谷歌收录是一个常见的困扰。即便你的内容再优秀&#xff0c;如果搜索引擎的爬虫无法抓取到你的页面&#xff0c;那一切努力都将白费。而GPC爬虫池服务可以帮助你快速解决网站页面的收录问题。它通过千万级的爬虫池资源&#xff0c;强力…

【信创】银河麒麟安装程序记录

银河麒麟安装程序记录 Step1 添加外网yum源Step2 安装软件安装MySQL&#xff08;8.0.32&#xff09;安装JDK安装jdk17安装Nginx&#xff08;1.21.5&#xff09;安装Redis&#xff08;4.0.14&#xff09;安装Emqx&#xff08;4.4.19&#xff09;安装RocketMQ&#xff08;5.1.4&a…

基于STM32的多功能MP3播放器

基于STM32的多功能MP3播放器 基于STM32的多功能MP3播放器一、项目背景与意义二、系统设计与实现2.1 硬件设计2.2 软件设计2.3 系统调试 三、功能实现与展望四、结论五、附录 基于STM32的多功能MP3播放器 在数字化时代&#xff0c;多功能播放器已成为我们生活中不可或缺的一部分…