前端工程化概述

news/2024/5/2 10:05:59/文章来源:https://blog.csdn.net/codeteenager/article/details/132463183

软件工程定义:将工程方法系统化地应用到软件开发中

前端发展历史

前端工程化的发展历史可以追溯到互联网的早期阶段,随着前端技术的不断演进和互联网应用的复杂化,前端工程化也逐渐成为了前端开发的重要领域。以下是前端工程化的主要发展里程碑:

  1. 1995年,Brendan Eich发明Javascript
  2. 2005年,Ajax(Asynchronous Javascript And XML)广泛应用
  3. 2008年,V8引擎发布,意味着js可以脱离浏览器使用
  4. 2009年,Node.js发布,标志了前端工程化进入飞跃的时代
  5. 2010年,Npm 0.1版本发布标志的模块化的时代到来
  6. 2013年,Webpack 1.0版本发布,标志着现在前端开发模式正式形成。
  7. 2013年,React 1.0版本发布
  8. 2014年,Vue1.0版本发布,标志着前端MVVM时代到来

前端开发模式进化过程

前端开发模式经历了多个阶段的演进,以下是前端开发模式的主要进化过程:

  1. 前后端混合(1995~2005):服务端渲染,javascript仅实现交互
  2. 前后端分离(2005~2013):借助ajax实现前后端分离、SPA等新模式
  3. 模块化开发(2013~2014):npm管理模块、Webpack编译打包资源
  4. 模块化+MVVM(2014~至今):基于React或Vue开发,不再开发html,开发html成为历史

开发过程中的问题

早先,我们在开发过程中难免会遇到一些问题:

  • 想要使用ES6+特性,但是兼容性有问题
  • 想要使用Less/Sass/PostCSS增强CSS的编程性,但是运行环境不能直接支持
  • 想要使用模块化的方式提高项目的维护性,但运行环境不能支持
  • 除了上面支持的工作以外,我们在开发过程中也有重复性的工作,例如部署上线前需要手动压缩代码及资源文件,部署过程需要手动上传代码到服务器。手动会出现各种各样的工作。
  • 多人协作开发,无法硬性统一大家的代码风格,从仓库中pull回来的代码质量无法保证,拉回来的代码运行崩溃。
  • 除了编码问题,在开发部分功能时,需要等待后端服务接口提前完成

以上问题可以看出工程化主要解决的问题主要分为:传统语言或语法的弊端,无法使用模块化、组件化,重复性的机械式工作,代码风格统一、质量保证,依赖后端服务接口支持,整体依赖后端项目。

工程化介绍

前端工程化是使用软件工程的技术和方法来进行前端的开发流程、技术、工具、经验等规范化、标准化,其主要目的为了提高效率和降低成本,即提高开发过程中的开发效率,减少不必要的重复工作时间,而前端工程本质上是软件工程的一种,前端工程是指将工程方法系统化地应用到前端开发中,以系统、严谨、可量化的方法开发、运营、维护前端应用程序,目的是降本提效。

在实际开发的过程中,一个完整的迭代周期需要依次经过开发、测试、部署、发布这几个环节,并且在产品上线之后,我们还需要对产品进行稳定性保障也就是实时的监控和报警系统,避免产品宕机。那么,工程化需要解决的问题就是如何在整个的迭代周期中降本提效。

47.png

工程化的表现是一切以提高效率、降低成本、质量保证为目的的手段都属于工程化,一切重复的工作都应自动化。我们从项目的创建、编码、预览、提交、部署这几个环节中,每一个环节都可以用工程化的方式去提高效率。

  • 创建项目:使用脚手架工具自动完成基础结构的搭建
  • 编码:借助工程化的工具自动的完成代码的格式化以及风格的校验,从而确保所有开发人员代码风格一致,借助编译工具去使用新的特性提高编码效率
  • 预览:可以借助Web服务能运行应用,同时提供热更新、SourceMap定位问题、Mock接口的功能
  • 提交:在提交代码之前使用Git Hooks和Lint-staged完成项目代码的检查,确保不会把有问题的代码提交到仓库中。
  • 部署:可以使用脚手架命令完成项目的上传,从而替代传统的ftp上传方式。还可以实现在代码提交过后自动化的通过持续集成和持续部署的方式,自动将代码部署到服务器中。

工程化不是某个工具,例如webpack功能很强大,但是它并不是工程化。工程化的核心是对项目整体的规划、架构,而工具只是帮助我们落实工程化的工具和手段。

那么我们应该去选用那些工具来搭配完成工程化的规划呢?我们可以参考create-react-app、vue-cli、angular-cli、gatsby-cli等官方脚手架,它不是一个工具,而是一个成熟的工程化集成方案。以vue-cli为例,创建Vue项目的同时,vue-cli提供了模板选择、编译以及本地开发服务器等功能模块。对于使用vue-cli创建的Vue项目,业务开发人员无须操心复杂的webpack配置,只需关注业务逻辑开发本身,这很大程度上降低了开发的时间成本。

工程化特性

前端工程化可以分成四大特性来说,分别为:

  1. 模块化:将一个文件拆分成多个相互依赖的文件,最后进行统一的打包和加载,这样能够很好的保证高效的多人协作。其中包含

    • JS 模块化:CommonJS、AMD、CMD 以及 ES6 Module。
    • CSS 模块化:Sass、Less、Stylus、BEM、CSS Modules 等。其中预处理器和 BEM 都会有的一个问题就是样式覆盖。而 CSS Modules 则是通过 JS 来管理依赖,最大化的结合了 JS 模块化和 CSS 生态,比如 Vue 中的 style scoped。
    • 资源模块化:任何资源都能以模块的形式进行加载,目前大部分项目中的文件、CSS、图片等都能直接通过 JS 做统一的依赖关系处理。
  2. 组件化:不同于模块化,模块化是对文件、对代码和资源拆分,而组件化则是对 UI 层面的拆分。

    • 通常,我们会需要对页面进行拆分,将其拆分成一个一个的零件,然后分别去实现这一个个零件,最后再进行组装。
    • 在我们的实际业务开发中,对于组件的拆分我们需要做不同程度的考量,其中主要包括细粒度和通用性这两块的考虑。
    • 对于业务组件,你更多需要考量的是针对你负责业务线的一个适用度,即你设计的业务组件是否成为你当前业务的 “通用” 组件。
  3. 规范化:正所谓无规矩不成方圆,一些好的规范则能很好的帮助我们对项目进行良好的开发管理。规范化指的是我们在工程开发初期以及开发期间制定的系列规范,其中又包含了:

    • 项目目录结构
    • 文档规范化
    • 接口规范化
    • 编码规范:对于编码这块的约束,一般我们都会采用一些强制措施,比如 ESLint、StyleLint 等。
    • 联调规范
    • 文件命名规范
    • 样式管理规范:目前流行的样式管理有 BEM、Sass、Less、Stylus、CSS Modules 等方式。
    • git flow 工作流:其中包含分支命名规范、代码合并规范等。
    • 定期 code review
    • … 等等
  4. 自动化:从最早先的 grunt、gulp 等,再到目前的 webpack、parcel。这些自动化工具在自动化合并、构建、打包都能为我们节省很多工作。而这些前端自动化其中的一部分,前端自动化还包含了持续集成、自动化测试等方方面面。

前端工程化的3个阶段

  1. 本地工具链

前端工程化的初级阶段便是将各类工具的功能进行整合,为业务开发人员提供统一规范的工具栈。我们不妨将此阶段的前端工程化称为本地工具链形态。此形态下的所有工程化功能模块,包括构建、本地服务器、部署等,均在本地环境下工作。

本地工具链形态的工程化方案解决的问题,降低了业务开发人员学习、使用工具的成本。这个方案将复杂的功能需求全部交给工具链内部解决,工具链的统一,另一个好处是巩固了流程的规范性,开发者使用统一的工具链、遵循统一的规范进行业务代码的编写,利于多人协作与程序的维护。

  1. 管理平台

本地工具链形态的工程化虽然解决了前端开发以及前后端协作开发中的部分痛点问题,但由于所有的功能模块均在本地环境工作,因此必然会受到环境差异性的影响,比如操作系统类型、版本、内核等。这些因素会在一定程度上影响构建产出代码的一致性。为此前端工程化进化到下一进化形态:集中管理的云平台。

管理平台形态的工程化做到了以下几点。

  • 淡化环境差异性,保证构建产出的一致性。
  • 权限集中管理,提高安全性。
  • 项目版本集中管理,便于危机处理,比如版本回滚等。

管理平台形态将各个功能模块的执行环境集中化,从各模块实现角度来讲与本地工具链基本一致。

  1. 持续集成

即使进化到管理平台形态,前端工程化方案所解决问题的本质仍然只是将前端工程师与服务器端工程师的工作解耦。这虽然提高了两方的工作效率,但其各自的工作流却是孤立的。前端有了构建和部署,后端也有了相应的阶段,两方的工作流是分离的,最终的融合工作仍然难以避免烦琐的人工操作。所以前端工程化最终的完美形态,必然与整体工作流结合,作为持续集成方案中的一环。

企业的应用场景

  • 前端工程化贯穿整个研发流程,解决研发流程中的问题
  • 工程化的核心目标是三点:效率规范性能
  • 只有了解前端研发流程的痛点,才能进行诊断优化
  • 需要站在研发场景的角度去思考研发流程痛点

企业前端项目面临的真实问题

  • 项目量级增加:由几千行代码升级到几万行代码
  • 项目数量扩大:由几个项目扩大到几千个项目
  • 项目复杂度高:由Web项目扩展到H5/PC/小程序/Node服务端/脚手架
  • 团队人数增加:由几个前端扩展到几百个前端

企业前端工程问题解法

  • 项目量级增加:通过采用模块化(CommonJS和ESM)的方式来将js拆分成一个一个的功能,达到多个项目复用,通过npm和webpack辅助实现。
  • 项目数量扩大:在大厂中有几千个项目,需要通过研发平台和前端研发脚手架来创建、管理项目。
  • 项目复杂度高:在大厂中不同的团队会用到vue、react、小程序等技术栈来开发,团队可能针对不同的技术栈开发不同的脚手架,导致重复造轮子,这样我们要通过工程脚手架(统一解决不同技术栈的工程差异)来解决,不管是vue或是react项目,在工程构建流程方面是统一的。
  • 团队人数增长:通过研发平台和研发脚手架来帮助团队开发人员进行协同工作。

企业前端工程化的应用场景

  • 工程脚手架:使用工程脚手架达到vue、react等工程的统一构建
  • 研发脚手架:解决对项目的创建、发布以及管理项目
  • 项目性能优化:对于项目的构建速度进行优化

相关文章

  • 如何推动前端团队的基础设施建设

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

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

相关文章

Shiro学习总结

第一章 入门概述 1.概念 shiro是一个Java安全框架,可以完成:认证、授权、加密、会话管理、与web集成、缓存… 2.优势 ● 易于使用,构建简单 ● 功能全面 ● 灵活,可以在任何应用程序环境中工作,并且不需要依赖它们…

TCP半连接队列和全连接队列

目录 什么是 TCP 半连接队列和全连接队列? TCP 全连接队列溢出 如何知道应用程序的 TCP 全连接队列大小? 如何模拟 TCP 全连接队列溢出的场景? 全连接队列溢出会发生什么 ? 如何增大全连接队列呢 ? TCP 半连接队列溢出 如何查看 TC…

数据结构入门 — 顺序表详解

前言 数据结构入门 — 顺序表详解 博客主页链接:https://blog.csdn.net/m0_74014525 关注博主,后期持续更新系列文章 文章末尾有源码 *****感谢观看,希望对你有所帮助***** 文章目录 前言一、顺序表1. 顺序表是什么2. 优缺点 二、概念及结构…

【Midjourney电商与平面设计实战】创作效率提升300%

不得不说,最近智能AI的话题火爆圈内外啦。这不,战火已经从IT行业燃烧到设计行业里了。 刚研究完ChatGPT,现在又出来一个AI作图Midjourney。 其视觉效果令不少网友感叹:“AI已经不逊于人类画师了!” 现如今,在AIGC 热…

ubuntu18.04复现yolo v8之CUDA与pytorch版本问题以及多CUDA版本安装及切换

最近在复现yolo v8的程序,特记录一下过程 环境:ubuntu18.04ros melodic 小知识:GPU并行计算能力高于CPU—B站UP主说的 Ubuntu可以安装多个版本的CUDA。如果某个程序的Pyorch需要不同版本的CUDA,不必删除之前的CUDA,…

【AndroidStudio】java.nio.charset.MalformedInputException: Input length = 1

java.nio.charset.MalformedInputException: Input length 1 可以参考这个文章处理下编码格式:https://blog.csdn.net/twotwo22222/article/details/124605029java.nio.charset.MalformedInputException: Input length 1是因为你的配置文件里面有中文或者是你的编…

Ansible 自动化安装软件

例子如下: 创建一个名为/ansible/package.yml 的 playbook : 将 php 和 mariadb 软件包安装到 dev、test 和 prod 主机组中的主机上 将 RPM Development Tools 软件包组安装到 dev 主机组中的主机上 将 dev 主机组中主机上的所有软件包更新为最新版本 --- - name:…

自定义滑动到底部触发指令,elementUI实现分页下拉框

在 main.js 中添加 // 自定义滑动到底部指令 Vue.directive(selectLoadMore, {bind(el, binding) {// 获取element-ui定义好的scroll盒子const SELECTWRAP_DOM el.querySelector(.el-select-dropdown .el-select-dropdown__wrap)SELECTWRAP_DOM.addEventListener(scroll, fun…

MyBatis动态语句且如何实现模糊查询及resultType与resultMap的区别---详细介绍

前言 前面我们学习了如何使用Mybatis实现简单的增删改查。今天我们来学习如何使用动态语句来根据不同的条件生成不同的SQL语句。这在实际开发中非常有用,因为通常查询条件是多样化的,需要根据实际情况来拼接SQL语句,那什么是MyBatis动态语句呢…

JW0818近电报警芯片

JW0818 市电感应报警电路适用于电业人员和电信行业施工人员的安全保护用品–近电预警器 报警电路。 特别注意芯片引脚6,输出信号是方波,而不是高低电平;在产品开发过程遇到这个坑。

Vue+Axios搭建二次元动态登录页面(mp4视频格式)

最近想做一个前端登录页面,背景好看的,格式中规中矩的,这么难?我自己创一个吧! 效果图如下: 源码可以参考我的github,复制源码即可用:gym02/loginPage_Vue: 使用VueAxios搭建的动态…

DataLoader

机器学习的五个步骤: 数据模块——模型——损失函数——优化器——训练 在实际项目中,如果数据量很大,考虑到内存有限、I/O 速度等问题,在训练过程中不可能一次性的将所有数据全部加载到内存中,也不能只用一个进程去加…

PDF校对工具正式上线,为用户提供卓越的文档校对解决方案

为满足当下对数字化文档校对的精准需求,我们今日正式发布全新的PDF校对工具。经过深入的技术研发与细致的测试,该工具旨在为企业和个人用户带来一个高效且准确的PDF文档校对平台。 PDF校对工具的主要特性: 1.全面性校对:工具支持…

Unity血条制作

一、使用UGUI制作血条 我一般使用image制作血条,当然,也可以使用滑动组件Slider。image的具体操作步骤如下 普通血条 1、在Hierarchy面板中,创建两个image组件,将其中一个设置为另外一个的子节点 2、在Inspector面板中&#…

操作教程|通过1Panel开源Linux面板快速安装DataEase

DataEase开源数据可视化分析工具(dataease.io)的在线安装是通过在服务器命令行执行Linux命令来进行的。但是在实际的安装部署过程中,很多数据分析师或者业务人员经常会因为不熟悉Linux操作系统及命令行操作方式,在安装DataEase的过…

【学会动态规划】最长递增子序列的个数(28)

目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…

axios 介绍

axios 介绍 axios 是一款基于 javascript xhr 进行封装的插件,自己通过 xhr 进行编写 ajax 请求,实现起来逻辑比较复杂,axios 封装后将复杂的逻辑写在插件的内部,我们用户只需要关心如何调用即可。对我们的开发带来了很大的便捷。…

[JavaWeb]【十一】web后端开发-SpringBootWeb案例(登录)

目录 一、登录功能 1.1 思路 1.2 LoginController 1.3 EmpService 1.4 EmpServiceImpl 1.5 EmpMapper 1.6 启动服务-测试 1.7 前后端联调 二、登录校验(重点) 2.1 问题 2.2 问题分析 2.3 登录校验​编辑 2.4 会话技术 2.4.1 会话技术 2.4.2 …

vue 简单实验 v-on html事件绑定

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"event-handling"><p>{{ message }}</p><button v-on:click"reverseMessage">反转 Message</but…

【Unity】Text文本组件的一些操作

Unity的Text组件的几种常见的操作方法 Text组件是Unity中用于在UI界面上显示文本的组件。它包含了一些常见的属性和方法&#xff0c;可以用来控制文本的内容、外观和交互。以下是一些常见的Text组件的操作&#xff1a; 设置文本内容&#xff1a;通过直接在Unity编辑器中的Text…