从零开始搭建React+TypeScript+webpack开发环境-基于lerna的webpack项目工程化改造
项目背景
在实际项目中,我们的前端项目往往是一个大型的Webpack项目,结构较为复杂。项目根目录下包含了各种配置文件、源代码、以及静态资源,整体布局相对扁平。Webpack的配置文件分散在不同的部分,包括入口文件、输出目录、加载器和插件等,这使得项目的维护和配置变得相对繁琐。
项目主要由若干个模块和组件构成,它们之间存在复杂的依赖关系。在当前状态下,我们发现随着项目规模的扩大,构建时间逐渐变长,开发环境下的热模块替换效果不尽如人意。此外,项目中存在一些共享的代码和功能,但由于项目结构的限制,代码重用性并不理想。
依赖管理方面,我们使用yarn进行包管理,包括核心库、工具和其他第三方库。同时,项目已经接入了Git作为版本控制系统,但在版本控制方面我们也面临一些挑战,如分支管理、合并冲突等。
在部署和发布方面,我们采用了一套手动的流程,部署新版本涉及多个步骤,这可能导致一些不必要的错误。总体而言,我们的Webpack项目在开发和维护方面遇到了一些困难,因此我们决定考虑引入Lerna来进行项目重构,以期能够更好地管理多包结构、优化构建流程,提高代码的可维护性和可扩展性。
lerna简介
Lerna 是一个用于管理具有多个包(package)的 JavaScript 项目的工具。它优化了拥有多个包的代码库的工作流程,使得更容易进行本地开发、版本控制和发布。
以下是 Lerna 的一些主要特点和功能:
-
包管理: Lerna 可以将大型代码库拆分成多个包,并将这些包存储在单个代码仓库中。每个包都可以独立地进行版本管理和发布。
-
版本管理: Lerna 支持统一版本和独立版本两种模式。统一版本模式会确保所有包的版本号相同,而独立版本模式允许每个包有不同的版本号。
-
本地开发: Lerna 提供了一组命令,使得在进行本地开发时能够更轻松地进行包之间的协同工作。例如,它可以通过符号链接的方式将本地包链接到相应的依赖包,以便在本地进行测试和修改。
-
原子提交: Lerna 支持原子提交,即在进行版本管理操作时,可以确保所有包都被一起提交,以保持版本的一致性。
-
依赖管理: Lerna 能够优化包之间的依赖关系,确保包在本地开发和远程构建时都能够正确引用它们的依赖项。
-
自动化发布: Lerna 支持自动发布,可以自动升级版本号、生成变更日志,并将包发布到 npm 或其他仓库。
通过这些功能,Lerna 提供了一种更加高效的方式来管理复杂的 JavaScript 项目,特别是那些包含多个独立组件或模块的大型代码库。
lerna安装配置
初始化工作区
在你的 package.json 中添加 workspaces 字段。
{"private": true,"workspaces": ["packages/*"]
}
同时,在项目根目录下创建packages文件夹:
mkdir packages
配置lerna
# 全局安装lerna
yarn global add lerna
lerna init -i
完成上述步骤之后,会在项目根目录生成lerna.json配置文件,修改如下:
{"$schema": "node_modules/lerna/schemas/lerna-schema.json","version": "independent","npmClient": "yarn"
}
创建lerna子工程
本节我们以components文件夹为例,将其改造成一个lerna子项目zhique-ui用来开发前端组件库。
创建子项目
lerna create zhique-ui
引用父项目的配置
webpack配置
-
安装依赖
yarn add -D webpack-merge -W -
子项目
webpack配置const merge = require('webpack-merge'); const parentWebpackConfig = require('../../webpack.config');// 根据实际路径调整 const mergedConfig = merge(parentWebpackConfig, {// 子项目的特定配置,如果有的话 });module.exports = mergedConfig;
tsconfig配置
{"extends": "../../tsconfig.json","include": ["src/**/*"],"compilerOptions": {"outDir": "lib"}
}
Babel配置
{"extends": ".../../.babelrc"
}
编译子项目
- 将
components文件夹下的src目录拷贝到zhique-ui下

- 编译src文件夹
// 在子工程根目录下执行
tsc

测试效果
更改组件引用方式
import React from 'react';
import { Icon } from 'zhique-ui';export default () => (<div><Icon type="compass" /></div>
);
访问页面

结语
在进行基于 Lerna 的前端工程化配置的过程中,我们深入了解了 Lerna 的基本概念和用法。从项目的初始化、子包的创建、配置文件的调整,到子包的相互依赖管理和独立开发,我们一步步探索了如何优雅地组织和管理前端项目。
通过 Lerna,我们能够更高效地进行代码共享、模块化开发,并充分利用 Yarn Workspaces 提供的依赖管理优势。同时,配置文件的合理调整和工具的灵活运用,为我们的前端工程提供了更好的可维护性和可扩展性。
希望这篇博文对你在前端工程化方面的学习和实践有所启发。当然,工程化的道路是不断演进和学习的过程,期待你在实际项目中能够灵活运用这些知识,构建出更加优秀的前端工程。
相关文章:
从零开始搭建React+TypeScript+webpack开发环境-基于lerna的webpack项目工程化改造
项目背景 在实际项目中,我们的前端项目往往是一个大型的Webpack项目,结构较为复杂。项目根目录下包含了各种配置文件、源代码、以及静态资源,整体布局相对扁平。Webpack的配置文件分散在不同的部分,包括入口文件、输出目录、加载…...
网络监控系统和防火墙的区别有哪些?
现如今,市面上保护企业网络安全的设备有很多,其中使用最多的当属网络监控系统和防火墙。 网络监控系统就是通过网页内容的自动采集处理、敏感词过滤、智能聚类分类、主题检测、专题聚焦、统计分析等多个环节,实现相关网络舆情监督管理的需要…...
刷题学习记录BUUCTF
[极客大挑战 2019]RCE ME1 进入环境直接就有代码 <?php error_reporting(0); if(isset($_GET[code])){$code$_GET[code];if(strlen($code)>40){die("This is too Long.");}if(preg_match("/[A-Za-z0-9]/",$code)){die("NO.");}eval($co…...
Linux imu6ull驱动- led
一、GPIO模块结构 开始来啃手册了,打开我们的imx6ull手册。本章我们编写的是GPIO的,打开手册的第28章,这一章就有关于IMX6ULL 的 GPIO 模块结构。 mx6ull一共有5 组 GPIO(GPIO1~GPIO5) GPIO1 有 32 个引脚&…...
【 云原生 | K8S 】Kubernetes 概述
Kubernetes 概述 1 K8S 是什么? K8S 的全称为 Kubernetes (K12345678S),PS:“嘛,写全称也太累了吧,不如整个缩写”。 作用: 用于自动部署、扩展和管理“容器化(containerized)应用…...
边缘计算多角色智能计量插座:用电监测和资产管理的未来智能化引擎
目前主流的智能插座涵盖了红外遥控(控制空调和电视等带有红外标准的电器),配备着测温、测湿等仓库应用场景,配备了人体红外或者毫米波雷达作为联动控制,但是大家有没有思考一个问题,就是随着对接的深入&…...
mysql隐式转换转换引起的bug
生产环境中遇到一个情况情况 ,过滤数据发现过滤不掉相关值情况,具体情况如下 原始数据: CREATE TABLE test (id bigint(11) NOT NULL AUTO_INCREMENT COMMENT 自增id,subject_id bigint(11) NOT NULL DEFAULT 0 COMMENT 主题id,subject_nam…...
【Python】gevent模块实现协程模拟高并发
Python中GIL的存在,导致多线程一直不是很好用,相形之下,协程的优势就更加突出了。 Python通过yield提供了对协程的基本支持,但是不完全。而第三方的gevent为Python提供了比较完善的协程支持。 gevent是第三方库,通过gr…...
leetcode:2485. 找出中枢整数(python3解法)
难度:简单 给你一个正整数 n ,找出满足下述条件的 中枢整数 x : 1 和 x 之间的所有元素之和等于 x 和 n 之间所有元素之和。 返回中枢整数 x 。如果不存在中枢整数,则返回 -1 。题目保证对于给定的输入,至多存在一个中…...
asp.net core mvc之模型绑定、特性约束模型绑定、模型验证(服务器/客户端/远程)
一、不用模型绑定 数据类型都是string 1、UserController.cs public class UserController : Controller {public IActionResult Register(){return View();}[HttpPost]public IActionResult DoRegister(){//不用模型绑定 以前的方法取表单数据或Url的参数//数据类型都是s…...
AI诈骗防范:保护数字社会的安全前线
引言: 在当今数字化的时代,人工智能技术在各个领域都展现了巨大的潜力,然而,正是这些技术的广泛应用也催生了新的安全隐患。近期,AIGC在聊天、写作、绘画、编程等领域表现出色,但也被用于“AI换脸”、“AI换…...
(待完善)python学习参考手册
这里写目录标题 观前浅谈:学习路线 :学习心得笔记:Step1:简单但一问不知怎么的组织语言去回答的小问题:什么是提示符?python解释器是什么?请正在阅读本文的朋友,安装一下PyCharm以及如何进行科学的省钱:Python中的命令行模式和交互模式的区别是什么?请正在阅读本文的朋友安装…...
STM32-HAL库09-CAN通讯(loopback模式)
一、所用材料: STM32F103C6T6最小系统板 STM32CUBEMX(HAL库软件) MDK5 串口调试助手 二、所学内容: 初步学习如何使用STM32的CAN通讯功能,在本章节主要达到板内CAN通讯的效果,即32发送CAN信息再在CAN接收…...
jsvascript使用dhtmlXTreeObject的loadJSONObject绘制目录树
文章目录 1,引入dhtmlXTreeObject的css和js文件2,创建一棵目录树2.1,let tree new dhtmlXTreeObject(id-dhtmltree-0, "100%", "100%", 0);2.2,设置图片根目录(后续使用到的图片都是相对于该目录…...
LeetCode 17. 电话号码的字母组合 中等
题目 - 点击直达 1. 17. 电话号码的字母组合 中等1. 题目详情1. 原题链接2. 题目要求3. 基础框架 2. 解题思路1. 思路分析2. 时间复杂度3. 代码实现 3. 知识与收获 1. 17. 电话号码的字母组合 中等 1. 题目详情 1. 原题链接 LeetCode 17. 电话号码的字母组合 中等 2. 题目要…...
《GPT与AI助手:技术进步与就业前景》
随着人工智能的迅速发展,像GPT(Generative Pre-trained Transformer)这样的自然语言处理技术已经广泛应用于各个领域,各个互联网公司也纷纷推出了自己的AI助手来帮助创作、交流和解决问题。这一技术的广泛应用引发了一系列关于就业…...
线性代数 | 矩阵运算 加减 数乘 矩阵的幂运算
文章目录 1 矩阵加减和数乘2 矩阵与矩阵的乘法2.1 相乘条件:看中间,取两头2.2 相乘计算方法 3 矩阵的幂3.1 观察归纳法3.2 邻项相消法3.3 化为对角 4 判断是否可逆(证明题或者要求求出逆矩阵)4.1 直接观察4.2 由定义式推得4.2.1 待…...
Linux---(五)三大工具yum、vim、gcc/g++
文章目录 一、yum工具1.Linux中安装软件的方法:2.什么是yum?3.yum源更新 二、Linux编辑器--vim1.IDE例子2.vim(1)vim的常用模式及切换模式(2)底层模式常用命令(3)插入模式常用命令(…...
网络通信TCP、UDP详解
目录 IP 和端口 网络传输中的 2 个对象:server 和 client 两种传输方式:TCP/UDP TCP 和 UDP 原理上的区别 为何存在 UDP 协议 TCP/UDP 网络通信大概交互图 IP 和端口 所有的数据传输,都有三个要素 :源、目的、长度。 怎么表…...
Flutter笔记:绘图示例 - 一个简单的(Canvas )时钟应用
Flutter笔记 绘图示例 - 一个简单的(Canvas )时钟应用 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_2855…...
AI Agent 开发的工业化道路:Harness 架构深度解析
1. 引言:从提示词工程到系统工程的范式转移在 AI Agent 迈向生产环境的过程中,开发者往往会陷入“提示词迷思”,试图通过无限堆砌 Prompt 来覆盖业务边界。然而,由于大模型本质上的概率性,纯粹的提示词工程在面对长链条…...
算法公平性中的偏见检测与缓解措施
算法公平性中的偏见检测与缓解措施 在人工智能技术快速发展的今天,算法决策已广泛应用于金融、招聘、司法等领域。算法并非完全客观,其训练数据或设计过程可能隐含社会偏见,导致对特定群体的不公平对待。例如,某些招聘算法可能因…...
西门子S7-300与Intouch通讯实战:DASSIDirect驱动配置全流程(附避坑指南)
西门子S7-300与Intouch高效通讯:DASSIDirect驱动配置实战手册 在工业自动化领域,SCADA系统与PLC的稳定通讯是确保生产数据实时监控的关键环节。作为业内广泛采用的组合,西门子S7-300系列PLC与Wonderware Intouch的集成方案,通过DA…...
Kaggle房价预测:用Pandas和Seaborn做数据分析,这10个坑新手最容易踩
Kaggle房价预测:数据分析新手避坑指南 第一次接触Kaggle的房价预测比赛时,我被数据里隐藏的陷阱绊倒了好几次。记得当时信心满满地提交了第一版预测结果,排名却惨不忍睹——问题就出在最基础的数据分析环节。这篇文章不是教你按部就班地做数据…...
DialogX主题系统深度解析:Material、iOS、MIUI多风格切换指南
DialogX主题系统深度解析:Material、iOS、MIUI多风格切换指南 【免费下载链接】DialogX 💬 DialogX dialog box component library, easy to use, more customizable, more scalable, easy to achieve a variety of dialog boxes. DialogX对话框组件库&a…...
Bruno Simon Folio 2019音效设计:终极空间音频与交互反馈指南
Bruno Simon Folio 2019音效设计:终极空间音频与交互反馈指南 【免费下载链接】folio-2019 项目地址: https://gitcode.com/gh_mirrors/fo/folio-2019 Bruno Simon Folio 2019是一个融合视觉与听觉体验的创新项目,其音效设计系统通过精准的交互反…...
从PCB板材到绿油:详解影响差分阻抗的7个关键因素(以实际工程案例复盘)
从PCB板材到绿油:详解影响差分阻抗的7个关键因素(以实际工程案例复盘) 在高速PCB设计中,差分阻抗控制是确保信号完整性的核心环节。去年我们团队遇到一个典型案例:某款千兆以太网交换机的PCB板在投板测试时,…...
Unity项目适配谷歌AAB+PAD:从强制迁移到高效部署的实战解析
1. 谷歌商店政策变迁:从APK到AAB的必然之路 记得2018年我第一次在谷歌商店发布Unity游戏时,用的还是传统的APKOBB模式。当时为了把200MB的游戏塞进100MB的限制里,不得不把核心资源都放到OBB文件中。没想到三年后,谷歌直接宣布全面…...
别再只用箱线图了!用R的Raincloud Plots(云雨图)可视化你的纵向数据,附完整代码
用R语言打造科研级纵向数据可视化:云雨图全流程解析 第一次在学术会议上看到那张融合了散点、箱线和小提琴图的幻灯片时,我正被自己单调的柱状图折磨得昏昏欲睡。那张图表像有魔力般,既展示了整体分布规律,又保留了每个受试者的个…...
Effective harnesses for long-running agents翻译
⚠️ 在开始阅读之前,如果你对 实时 Agent / 数字人 / 多模态系统 / LiveKit 架构 感兴趣, 欢迎先到 GitHub 给项目点一个 ⭐ Star,这是对开源作者最大的支持。🚀 AlphaAvatar 项目地址(强烈建议先收藏,该项…...
