讲透前端工程开发工具发展与使用

news2024/9/24 1:26:14

前端⼯程化的发展及⼯具详解

什么是⼯程化?什么是前端⼯程化?

随着发展的逐步发展,作为⼯程师除了需要关注需要写的⻚⾯,样式和逻辑之外,还需要⾯对⽇益复杂的系统性问题,⽐如模块化⽂件的组织、ES6 JS ⽂件的编译、打包压缩所有的 JS 代码、优化和合并图⽚静态资源等等事情。
这也就是在说,我们的项⽬需要以⼀种合理的⽅式进⾏组合,以应对在团队协作、需求迭代中保持项⽬的稳定发展。这种⽅式就是⼯程化系统去运⾏我们的项⽬
例如如下图所示就是前端⼯程化中⼀次打包的过程,左侧就是我们项⽬中出现的源⽂件,例如我们会通过 sass 这种预处理样式来更好的组织我们的样式代码,使⽤各类其他语⾔⽐如 typescript、coffescript等来书写我们的逻辑脚本。在最终上线时,我们需要把我们的这类⽂件,转化为能够在线上直接被浏览器识别的 css 和 js 。
这种使⽤⼯程化思维,以⼯具的形式来进⾏上述过程的,就是前端⽅⾯的⼯程化。在这里插入图片描述
⼀句话总结就是,前端⼯程化,就是在使⽤⼯具处理那些与实际业务⽆关的内容,⽐如处理 JS 编译、打包、压缩、图⽚合并优化等等各个⽅⾯的⼯程性代码。

前端⼯程化具体类⽬

包管理⼯具

对于⼀⻔成熟的语⾔来说,在有语⾔规范的同时,社区或者制定语⾔规范的组织也会有模块化的规范和模块存储到平台,每个⼈都能将⾃⼰写好的模块化代码发布到平台上,同时任何⼈也可以下载公共平台上其他⼈的模块化代码。这种模块化的代码我们⼀般称之为 包(package),平台我们称之为包管理平台,这种⾏为我们称之为 包管理(package manager)。对于 JS 来说,现阶段⼤家⽐较熟悉的就是 node.js 环境⾃带的 npm ⼯具,npm 全称是 node package manager,就是 node.js 的包管理⼯具,对于⼀个符合规范的包来说,我们可以通过 npm publish 发布包,同样的,也可以通过 npm install 来下载别⼈发布的包,实现⼤家的模块复⽤。社区中常⻅的包管理⼯具有,bower,npm 和 yarn。⽬前还在经常使⽤的是 npm 和 yarn。

bower

bower 最早出现是使⽤在浏览器项⽬中。安装 bower 命令后,通过 bower install jquery ,就可以将 jquery 下载到 bower_components ⽬录中,我们就可以在 html ⽂件加上 <script src=“bower_components/jquery/dist/jquery.min.js”></script> 。免去了我们直接从官⽹下载然后挪动到项⽬中的烦恼。

bower 也⽀持⼀些配置,我们只需要在项⽬根⽬录下增加 .bowerrc 配置即可:

{
	"directory": "app/components/",
	"timeout": 120000,
	"registry": {
		"search": [
			"http://localhost:8000",
			"https://registry.bower.io"
		]
	}
}

上⾯的配置主要配置了我们下载后的模块存储⽬录,下载超时时间和下载的地址等等。如果想要发布⼀个 bower 模块的话,需要我们这个项⽬下配置 bower.json ,然后通过 bowerregister 命令发布。
bower 内容的介绍⽐较简单,现在新项⽬中使⽤已经不多,包管理⼯具这⼀⼩节的重点是 npm。

npm

npm 是伴随着 node.js 下载会⼀同安装的⼀个命令,它的作⽤与 bower ⼀样,都是下载或发布⼀些 JS模块。
我们可以使⽤ npm --version 查看安装的 npm 版本,不同版本带有不同功能。
同时,我们可以通过 npm install 来安装⼀个模块,例如上⾯的例⼦中,我们就可以通过 npm install jquery 来安装 jquery,npm 会将模块安装到 node_modules ⽬录中。
⼀个合格的 npm 包,必须拥有 package.json 这个⽂件,⾥⾯有以下⼏个常⻅字段:
name: 包或者模块的名称
version: 版本
main(重要): 默认加载的⼊⼝⽂件
scripts: 定义⼀些脚本
dependencies: 运⾏时需要的模块
devDependencies:本地开发需要运⾏的模块
optionalDependencies: 可选的模块,即使安装失败安装进程也会正常退出
peerDependencies :必要依赖的版本版本


其中 dependencies 和 devDependencies ⾥⾯的版本号通过 “⼤版本.次要版本.⼩版本” 的格式规定。
我们通过 npm install 安装的模块,最终都会在⾥⾯进⾏记录。同时,我们通过 npm install 时,还会安装这⾥记录但是 node_modules 中没有的模块。
如果前⾯带有波浪号(~),则以⼤版本号和次要版本号为主,例如 “~1.3.2” 的版本,最终安装时就会安装 1.3.x 的最新版本。如果前⾯带有插⼊号(^),则以⼤版本号为主,例如 “^1.3.2” 的版本,最终安装就会安装 1.x.x 的最新版本。⾼版本的 npm 会将所有依赖进⾏「打平」操作,这样能保证尽可能少的安装相同的模块。所有下载的模块,最终都会记录在 package-lock.json 完全锁定版本,下次我们再 npm install 时,就会先下载 package-lock ⾥⾯的版本。

yarn

https://yarnpkg.com/ yarn 是⼀个新兴的包管理⼯具,他与 npm 有着相似的功能,最⼤的优势就是并发和快。我们可以通过 yarn add 来安装⼀个模块,通过 yarn xxx 来运⾏ scripts 中的脚本。

包管理⼯具中常⻅⾯试问题

devDependencies、dependencies、optionalDependencies和 peerDependencies 区别devDependencies 是指使⽤本地开发时需要使⽤的模块,⽽真正的业务运⾏时不⽤的内容。
dependencies 是指业务运⾏时需要的模块
optionalDependencies 是可选模块,安不安装均可,即使安装失败,包的安装过程也不会报错
peerDependencies ⼀般⽤在⼤型框架和库的插件上,例如我们写 webpack–xx-plugin 的时候,对于使⽤者⽽⾔,他⼀定会先有 webpack 再安装我们的这个模块,这⾥的 peerDependencies 就是约束了这个例⼦中 webpack 的版本。


npm 中 --save-dev 和 --save 之间的区别
对于⼤型项⽬来说,他们的界限实际上并不清晰。真正会有差异的地⽅是究竟我们使⽤哪种⽅式来进⾏
安装所有的依赖。
save-dev 和 save 都会把模块安装到 node_modules ⽬录下,但 save-dev 会将依赖名称和版本写到devDependencies 下,⽽ save 会将依赖名称和版本写到 dependencies 下。如果我们使⽤ npm --production install 这样的命令安装模块的话,就只会安装 save 安装的包。

源代码静态检查和格式化⼯具

静态检查指的是我们在本地写源代码时,我们使⽤的编辑器对我们所写代码的 提示,检查 和 格式化。
在⼤型项⽬中,提示 这⼀步因⼈⽽异⼤部分不做共同要求,检查和格式化⼀般会对团队使⽤的内容进⾏约束,以保证⼤家能写出「正确」的代码和统⼀的代码⻛格。
对于代码的检查和格式化,在前端发展中⽐较经典的是 jslint,jshint,eslint 和 prettier。
他们基本上都是⼀类的⼯具,再细分的话,jslint,jshint 和 eslint 是⼀类,他们专⻔处理 JS 格式化和静态语法检查,prettier 是另⼀类,他能处理多语⾔的格式化。

eslint

eslint 的官⽹:https://eslint.org/ 我们以 eslint 为例,只需要在项⽬中通过 npm install --save-dev eslint 安装他,通过配置 .eslintrc (runtime config)我们就可以使⽤了。配合 eslint 的编辑器插件,我们就可以在编辑代码时 eslint 对我们的代码进⾏提示和修复。
通过配置 eslint index.js 这样的脚本,就可以对脚本⽂件进⾏静态校验。
注意这⾥是 --save-dev 因为我们只需要在项⽬开发过程中使⽤它⽽不是运⾏过程使⽤这个模块。

prettier

prettier 官⽹:https://prettier.io/ ,同样的我们可以配置 prettier 的配置, .prettierrc ⾥⾯也可以进⾏配置,最终搭配 prettier 的 编辑器插件,我们同样能够实现代码编辑状态下的提示和修复。
ES6 及其他泛 JS 语⾔的编译⼤部分时候,我们不能直接在线上使⽤ ES6 语法规范的 JS 代码,我们就需要通过⼯具对 JS 进⾏编译。
同时,有些项⽬我们可能会使⽤ coffeescript,typescript,flow,elm,ocaml 等可以编译为 JS 语⾔的泛 JS 语⾔书写代码,这就需要在调试或发布时,使⽤编译⼯具将对应代码编译为 JS 代码才能直接运⾏。
在编译过程中,JS ⽐较常⻅的⼯具是 babel,⽽其他的语⾔则对应有⾃⼰的编译器,例如 coffeescript使⽤ coffeescript 编译器进⾏编译为 js,typescript 使⽤ typescript 编译器编译为 js。

babel

babel 官⽹为 https://babeljs.io/ ,对于⼀个项⽬来说,我们可以通过 npm install --save-dev
@babel/core @babel/cli 来安装 babel 所需要的⼯具。
@babel/core 是 babel 内部核⼼的编译和⽣成代码的⽅法
@babel/cli (command line tool) 是 babel 命令⾏⼯具内部解析相关⽅法
安装了这两个包之后,我们就能够使⽤ babel 相关⽅法对代码进⾏操作,接下来我们需要配置,告诉babel 我们需要将代码变成什么。
增加⼀个 babel 的 preset,preset 代表的是我们希望编译的结果的预设值。在最新的 babel ⼯具链中,统⼀使⽤了 @babel/preset-env 作为环境预设值。我们安装 npm install --save-dev
@babel/preset-env 之后,新建 .babelrc ⾥⾯,通过配置

{
	"presets": ["@babel/preset-env"]
}

在 scripts 内定义⼀个脚本执⾏ babel index.js -o output.js ,我们在 index.js 中写的 es6 语法就会被编译。
这⼀步只是编译语法层⾯的内容,如果我们使⽤了⼀些新的⽅法的话,还需要增加⼀个 polyfill 使⽤ npm install @babel/polyfill 安装了所有符合规范的 polyfill 之后,我们需要在⼊⼝⽂件引⼊这个模块,就能正常的使⽤规范中定义的⽅法了。

JS 打包⼯具

对于 JS 这⻔语⾔的不同环境来说,有 CommonJS,AMD 和 ESModule 这⼏种常⻅的模块化规范,这⼏种规范都有⾃身的缺点。
CommonJS 不经处理只能运⾏在 node.js,AMD 不经处理⽆法运⽤在各个平台,需要搭配符合 AMD 规范的其他库例如 require.js ⼀起使⽤。ESModule 虽然从语⾔层⾯上解决了规范问题,但是即使经过
babel 编译,也会将 import,export 之类的关键词编译为 CommonJS 的 require 和 exports ,我们还是⽆法直接在浏览器中使⽤。为了能使任何⼀个模块都能⾃由的切换所使⽤的环境,例如在浏览器使⽤ CommonJS 封装好的模块,我们就需要经过打包这个步骤。browserify 、 rollup 等等⼯具都是处理诸如此类内容。

browserify

地址:http://browserify.org/ 我们通过 npm install --save-dev browserify 安装 browserify,我们写⼀个简单的 commonJS 模块,通过 browserify index.js -o output.js 命令就可以将
CommonJS 模块化的包转化为通⽤的任何环境均可以加载的模块化规范。

rollup
.rollup 是⼀个新兴的打包⼯具,它最先提出⼀个概念叫 tree shaking,他可以移除我们代码中⽆⽤的其他代码。通过 ESModule 写的模块,在经过 rollup 处理之后,会对未使⽤的导出内容进⾏标记,在压缩过程就会将这类未使⽤的内容移除。

JS 压缩⼯具

经过编译和打包的 JS 代码,最终要在线上经过压缩处理之后,才能最终在⽹站上⾯向⽤户显示。对于JS 压缩⼯具来说,⽬前有⾮常多,但⽤的最多的还是 uglify 系列,uglify 最新是版本 3,不同 uglify 的实现原理和性能都有极⼤的不同。

uglify

uglify3 地址 https://github.com/mishoo/UglifyJS2
安装成功之后⾮常简单,只需要通过 uglifyjs index.js -o output.js 就可以输出压缩的结果。同时我们可以通过添加 --source-map 在运⾏时⽣成 sitemap ⽂件,⽅便我们进⾏ debug。

其他类⽬⼯具

任务处理⼯具(gulp/grunt)

上⾯我们说的所有⼯具都是针对某⼀个垂直领域来说的,⽐如 编译、打包、压缩等等,我们需要通过不同的命令去运⾏和操作我们的 JS ⽂件。
本⼩节说的任务处理⼯具,就是这⼀类脚本⼯具,他们能通过脚本的形式将不同的⼯具进⾏组合输出。流式处理⼯具⽐较常说的两个是 grunt 和 gulp。本⼩节我们分别介绍⼀下这两个⼯具。

grunt

grunt 官⽹ https://gruntjs.com/ 。⾸先通过 npm install --save-dev grunt 安装 grunt ⼯具,新建 gruntfile.js 通过 gruntfile.js 中的配置来让 grunt 做不同的操作。这⾥我们安装 npm --save-dev @babel/core @babel/preset-env grunt-babel grunt-contrib-uglify 来完整的进⾏⼀个项⽬的构建,通过配置 gruntfile 脚本,我们分别执⾏了编译、压缩的过程⽣成最后 js 脚本。

gulp

gulp 官⽹ https://gulpjs.com/。同样的我们使⽤ npm install --save-dev gulp 安装 gulp ⼯具,新建 gulpfile.js 配置。我们同样实现相同的功能来重新配置⼀下 gulp 任务。gulp 相⽐于 grunt 来说,配置更加清晰,是⼀个链式调⽤的写法。

通⽤处理⼯具(fis3/webpack)

通⽤处理⼯具这⾥我们的分类是从功能上来讲,具备上⾯列举类⽬的多种功能的集合。这⾥我们列举的⼏个⼯具是 fis3 和 webpack。fis 是国内百度公司在早期发布的⼀款前端通⽤处理⼯具(⽐ webpack 早),fis3 是它的第三代,使⽤node.js 重写了。
fis3 和 webpack 他们有个最⼤的特点就是,他们已经不再是⼀个普通⼯具,⽽是⼀个具有插件化的系统,有着丰富和完善的社区环境,他们属于 前端解决⽅案 这么⼀个领域。理论上他们可以做⾮常多的事情,⽽不像上⾯介绍的⼤部分⼯具,只能处理某⼀个垂直分类下的内容。
webpack 实际上和 gulp grunt 这类的任务处理⼯具有些类似,但是它本身具有打包的功能,同时也⽀持通过中间件和插件实现其他领域的功能,最终通过⼀个命令就能处理完成所有操作。
webpack 通过 webpack.config.js 配置,配置 loader 中间件来对不同⽂件进⾏操作,同时通过插件化的配置,⽀持例如压缩等等操作。
使⽤ fis3 和 webpack,他们更多的是将前⾯我们讲的所有其他⼯具融合起来,以⼀种插件的形式进⾏加载,从⽽达到了通⽤的⽬的。

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

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

相关文章

为了满足国内市场快速发展的业务需求,理想汽车选择亚马逊云科技

理想汽车是一家用户驱动的汽车科技企业&#xff0c;坚持核心技术全栈自研&#xff0c;理想ONE是其首个单车突破20万辆的智能电动车产品。借助亚马逊云科技领先技术和多项托管服务&#xff0c;理想汽车迅速构建起安全稳定、技术架构先进的车联网云计算处理平台&#xff0c;服务于…

R语言基础(二):常用函数

接前文&#xff1a; R语言基础(一)&#xff1a;注释、变量 3.常用函数 函数就是一些已经编写好的功能&#xff0c;我们拿过来直接使用就可以了。 3.1 查看变量ls() 也许你清空了控制台&#xff0c;看不到之前的变量。但是它一直存在于系统中。 我们可以使用ls()函数查看已经定…

事件响应必备:DNS攻击与防御矩阵

攻击者采用了哪些DNS攻击技术&#xff0c;哪些组织可以帮助事件响应团队检测、缓解和预防这些技术&#xff1f;FIRST近日发布的DNS攻击与防御矩阵提供了答案。 DNS作为互联网基础架构的一项核心服务&#xff0c;安全问题严峻&#xff0c;各种攻击层出不穷。F5发布的数据显示&a…

项目管理手册

1 概述 1.1 项目管理体系 1.1.1 体系基础 项目管理体系是建立在公司 ISO 9000 质量管理体系基础上&#xff0c;结合 PMI 项目管理框架与 CMMI 能力成熟度模型&#xff0c;针对项目实施状态&#xff0c;对一些重点环节进行细化&#xff0c;加强重点环节的监控&#xff0c;明确…

Python导入模块的3种方式(超级详细)

很多初学者经常遇到这样的问题&#xff0c;即自定义 Python 模板后&#xff0c;在其它文件中用 import&#xff08;或 from...import&#xff09; 语句引入该文件时&#xff0c;Python 解释器同时如下错误&#xff1a; ModuleNotFoundError: No module named 模块名 意思是 Pyt…

VS2022安装EasyX 及 EasyX图形库安装和使用(附C++各图形编程项目示例源码)

文章目录一、EasyX的安装二、C_EasyX 项目1. 樱花2. 雪花3. 小熊4. 跳动爱心5. 橘子钟表6. 红玫瑰7. 奥特曼三、更多项目资源EasyX提取链接 网盘链接&#xff1a;https://pan.baidu.com/s/1gPtRVZub_008jwcK11Bb-g?pwd9ol9 提取码&#xff1a;9ol9 什么是EasyX&#xff1f; E…

GTC08L可替代启攀微八通道CP2528、CP2682

由工采网代理提供的八通道电容式触摸传感芯片—GTC08L可完美替代启攀微CP2528、CP2682、CP2688等多款八按键触摸芯片。 芯片介绍&#xff1a; GTC08L采用SOP-16L(9.90x3.90x1.40,e1.27) 封装&#xff1b;电源电压范围&#xff1a;2.7V&#xff5e;5.5V具有各种智能传感功能&…

使用JProfiler分析java oom dump文件

1、安装JProfiler&#xff08;本文使用JProfiler11&#xff09; 链接&#xff1a;https://pan.baidu.com/s/1VBHLIo8hIVGeeLjaBVjcIg 提取码&#xff1a;q5wl 在JProfiler的堆遍历器(Heap Walker)中&#xff0c;你可以对堆的状况进行快照并且可以通过选择步骤下寻找感兴趣的对…

一阶LADRC笔记代码实现

这两天看了一下LADRC的。学习深度不够&#xff0c;从理论和原理&#xff0c;没法评论什么。从个人感受上&#xff0c;它会从另一种角度去解释一些的控制的东西。从工程使用上&#xff0c;还是很有参考价值的&#xff0c;参数意义比较明确&#xff0c;整定参数比较容易。 参考&…

Javaweb MVC模式和三层架构

MVC 模式和三层架构是一些理论的知识&#xff0c;将来我们使用了它们进行代码开发会让我们代码维护性和扩展性更好。 7.1 MVC模式 MVC 是一种分层开发的模式&#xff0c;其中&#xff1a; M&#xff1a;Model&#xff0c;业务模型&#xff0c;处理业务 V&#xff1a;View&am…

沃隆食品冲刺上市:业绩整体呈下滑态势,红杉资本提前退出投资

近日&#xff0c;“每日坚果”的缔造者——青岛沃隆食品股份有限公司&#xff08;下称“沃隆食品”&#xff09;平移提交招股书&#xff0c;准备在上海证券交易所主板上市。本次冲刺上市&#xff0c;沃隆食品计划募集7.00亿元&#xff0c;中信证券为其保荐机构。 沃隆食品在招…

面试必看:谈谈你所了解的JVM调优,JVM性能调优总结

文章目录从面试角度来谈谈你了解的JVM调优GC调优的步骤1.确定目标&#xff1a;2.优化参数3.验收优化结果GC优化案例一、Major GC和Minor GC频繁优化Minor GC频繁问题&#xff1a;1.可以适当增大新生代的内存二、请求高峰期发生GC&#xff0c;导致服务可用性降低优化标记停顿时间…

第55章 头像图片的前端渲染显示

1 WebApi.Controllers.CustomerController.GetCustomerByToken /// <param name"token">1个指定的令牌字符串。</param> /// <summary> /// 【通过令牌获取用户-无需权限】 /// </summary> /// <remarks> /// 摘要&#xff1a; /// …

【Python】装饰器

一、装饰器的作用 装饰器能够为已经存在的对象添加额外的功能。 二、什么是装饰器 装饰器本质是一个python函数&#xff0c;它可以让其他函数在不需要做任何代码变动的前提下增加额外功能&#xff0c;装饰器的返回值也是一个函数对象。 三、装饰器的应用场景 插入日志、性能…

在云服务器安装tomcat和mysql

将 linux 系统安装包解压到指定目录进入 bin 目录执行./startup.sh 命令启动服务器执行./shutdown.sh 关闭服务器在浏览器中访问虚拟机中的 tomcat ip端口具体操作入下解压tomcat压缩包解压&#xff0c;输入tom按table键自动补全tar -zxvf 启动tomcat进入bin目录在linux启动to…

debian11安装Nvidia驱动及Docker运行

文章目录前言硬件及软件环境驱动下载驱动安装禁用xserver禁用nouveau安装依赖设置可执行并运行检查安装结果Docker配置Docker安装nvidia-container-runtime安装[^4]命令脚本内容执行脚本安装 nvidia-container-runtime检测Docker gpu 验证卸载指令总结异常处理参考链接前言 博…

Spring Boot+Vue前后端分离项目练习07之网盘项目注册登陆页面实现

1.Axios安装和接口封装 Axios是一个易用、简洁且高效的http库&#xff0c; 使用Promise管理异步&#xff0c;支持请求和响应拦截器&#xff0c;自动转换JSON数据等高级配置&#xff0c;是在vue项目中十分常见前端请求库&#xff0c;使用以下指令安装。 npm install axiosnpm …

工作中git常用操作

前言 在各种版本并行&#xff0c;需求不断迭代的过程中&#xff0c;我们经常会遇到各种打断开发的场景&#xff1a; 场景一&#xff1a;当前版本功能开发到一半&#xff0c;上级临时要求去修复某个线上bug&#xff1f;你能说不吗&#xff0c; 那当然绝对服从组织安排 &#x…

代码随想录算法训练营day54 | 动态规划之子序列 392.判断子序列 115.不同的子序列

day54392.判断子序列1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组115.不同的子序列1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺…

[2.2.3]进程管理——调度算法的评价指标

文章目录第二章 进程管理调度算法的评价指标&#xff08;一&#xff09;CPU利用率&#xff08;二&#xff09;系统吞吐量&#xff08;三&#xff09;周转时间&#xff08;四&#xff09;等待时间&#xff08;五&#xff09;响应时间小结第二章 进程管理 调度算法的评价指标 CP…