前言:
前端工程化一直是一个老生常谈的问题,不管是面试还是我们在公司做基建都会经常提到前端工程化,那么为什么经常会说到前端工程化,并没有听过后端工程化、Java工程化或者Python工程化呢?我们理解的前端工程化是不是一直都是Webpack的性能调优,或者是一个cli工具呢?今天我们带着问题来一起寻找一下答案吧!

文章目录

  • 一、前端工程化简介
    • 1. 前端发展历史
  • 二、工程化整体流程
  • 三、相关面试题
    • 1. 一个新项目由你来做技术选型,你会从那几个方面来考虑?
    • 2. 前端项目应该如何部署上线
      • a. 集成
      • b. 发布
  • 四、大厂工程化实践及开源方案
  • 五、迷你工程化脚手架实践

一、前端工程化简介

我们整天再说前端工程化,那我我们思考一下,为什么会有前端工程化这个
概念?我们来一起回顾前端的发展历史,通过这个发展历史我们就能知道为什么会有【前端工程化】这个概念。

1. 前端发展历史

看下面流程图我们可以看出来
第一阶段:前端最早期的只是HTML、CSS、JS(此时只是前端发展的一个雏形,【JS】还没有模块化的概念),随着页面发展我们发现一个页面引入太多JS脚本,将大大增加维护成本;
第二阶段:已经出现了模块的概念,会按照模块的概念进行拆分,我们如何拆分模块,如何放置这些模块?此时已经有了一个工程化的概念;
第三个阶段:模块已经划分出来,但是我们部署的时候还是想合并在一起,就涉及到了早起的打包处理;
第四个阶段:前端进一步复杂之后,前端需要承载的功能更多了,逐步开始进行前后端分离,前端也可以独立的开发了。此时前端也出来了一些新的概念,比如说:SPA、Angular、Vue等。此时就要开始考虑路由如何规划?开发时如何调试?开发完如何构建?构建完如何发布?这一切的东西才构成了【前端工程化的概念】;

#mermaid-svg-V4nMS8KVmvwzdH4s {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-V4nMS8KVmvwzdH4s .error-icon{fill:#552222;}#mermaid-svg-V4nMS8KVmvwzdH4s .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-V4nMS8KVmvwzdH4s .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-V4nMS8KVmvwzdH4s .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-V4nMS8KVmvwzdH4s .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-V4nMS8KVmvwzdH4s .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-V4nMS8KVmvwzdH4s .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-V4nMS8KVmvwzdH4s .marker{fill:#333333;stroke:#333333;}#mermaid-svg-V4nMS8KVmvwzdH4s .marker.cross{stroke:#333333;}#mermaid-svg-V4nMS8KVmvwzdH4s svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-V4nMS8KVmvwzdH4s .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-V4nMS8KVmvwzdH4s .cluster-label text{fill:#333;}#mermaid-svg-V4nMS8KVmvwzdH4s .cluster-label span{color:#333;}#mermaid-svg-V4nMS8KVmvwzdH4s .label text,#mermaid-svg-V4nMS8KVmvwzdH4s span{fill:#333;color:#333;}#mermaid-svg-V4nMS8KVmvwzdH4s .node rect,#mermaid-svg-V4nMS8KVmvwzdH4s .node circle,#mermaid-svg-V4nMS8KVmvwzdH4s .node ellipse,#mermaid-svg-V4nMS8KVmvwzdH4s .node polygon,#mermaid-svg-V4nMS8KVmvwzdH4s .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-V4nMS8KVmvwzdH4s .node .label{text-align:center;}#mermaid-svg-V4nMS8KVmvwzdH4s .node.clickable{cursor:pointer;}#mermaid-svg-V4nMS8KVmvwzdH4s .arrowheadPath{fill:#333333;}#mermaid-svg-V4nMS8KVmvwzdH4s .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-V4nMS8KVmvwzdH4s .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-V4nMS8KVmvwzdH4s .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-V4nMS8KVmvwzdH4s .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-V4nMS8KVmvwzdH4s .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-V4nMS8KVmvwzdH4s .cluster text{fill:#333;}#mermaid-svg-V4nMS8KVmvwzdH4s .cluster span{color:#333;}#mermaid-svg-V4nMS8KVmvwzdH4s div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-V4nMS8KVmvwzdH4s :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

HTML
CSS
JS
AMD:异步模块加载
CMD:同步模块加载
Commonjs:09年Node.js
ES-Model:15年ES6的出现
Grunt
gulp
jade
前后端分离

综上所述我们可以看出来,前端工程化绝不只是webpack或babel构建这一块,前端工程化是一个整体,从前端开始写代码 --> 如何构建 --> 如何发布测试 --> 如何上线 --> 上线后的应用状态如何监控等,这一套的流程我们把他叫做【前端工程化】。

二、工程化整体流程

**下图所示,就是我们从零开始整个前端工程化的考虑范围**
1. 从创建项目与开发阶段--> 我们要使用脚手架,对应的Eslint规范以及我们要使用什么UI组件库
2. CI --> 持续集成: 在一个集中的环境去构建我们的项目(避免不同协作人员环境不同带来的Bug)
3. CD --> 持续部署
下面面试题 【前端项目应该如何部署上线】 会对 CI/CD做详细的介绍
#mermaid-svg-QlmYtnb4aOwRk5Hh {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QlmYtnb4aOwRk5Hh .error-icon{fill:#552222;}#mermaid-svg-QlmYtnb4aOwRk5Hh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-QlmYtnb4aOwRk5Hh .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-QlmYtnb4aOwRk5Hh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-QlmYtnb4aOwRk5Hh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-QlmYtnb4aOwRk5Hh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-QlmYtnb4aOwRk5Hh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-QlmYtnb4aOwRk5Hh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-QlmYtnb4aOwRk5Hh .marker.cross{stroke:#333333;}#mermaid-svg-QlmYtnb4aOwRk5Hh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-QlmYtnb4aOwRk5Hh .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-QlmYtnb4aOwRk5Hh .cluster-label text{fill:#333;}#mermaid-svg-QlmYtnb4aOwRk5Hh .cluster-label span{color:#333;}#mermaid-svg-QlmYtnb4aOwRk5Hh .label text,#mermaid-svg-QlmYtnb4aOwRk5Hh span{fill:#333;color:#333;}#mermaid-svg-QlmYtnb4aOwRk5Hh .node rect,#mermaid-svg-QlmYtnb4aOwRk5Hh .node circle,#mermaid-svg-QlmYtnb4aOwRk5Hh .node ellipse,#mermaid-svg-QlmYtnb4aOwRk5Hh .node polygon,#mermaid-svg-QlmYtnb4aOwRk5Hh .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-QlmYtnb4aOwRk5Hh .node .label{text-align:center;}#mermaid-svg-QlmYtnb4aOwRk5Hh .node.clickable{cursor:pointer;}#mermaid-svg-QlmYtnb4aOwRk5Hh .arrowheadPath{fill:#333333;}#mermaid-svg-QlmYtnb4aOwRk5Hh .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-QlmYtnb4aOwRk5Hh .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-QlmYtnb4aOwRk5Hh .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-QlmYtnb4aOwRk5Hh .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-QlmYtnb4aOwRk5Hh .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-QlmYtnb4aOwRk5Hh .cluster text{fill:#333;}#mermaid-svg-QlmYtnb4aOwRk5Hh .cluster span{color:#333;}#mermaid-svg-QlmYtnb4aOwRk5Hh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-QlmYtnb4aOwRk5Hh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

创建项目
开发
构建
测试
上线
脚手架
规范 + Eslint
组件库
CI:持续构建
CD:持续部署
监控

为什么开篇说到后端没有工程化的概念?
我们比如Java语言,他天生就是一种企业级的开发语言,他已经把上述流程包括在里面,不需要自己在去做这些基础建设;而JS是一门脚本语言,在不断开发不断迭代的进展中演变出了前端工程化的这个概念。

三、相关面试题

1. 一个新项目由你来做技术选型,你会从那几个方面来考虑?

第二个大话题,【工程化整体流程 】都是我们需要考虑的

2. 前端项目应该如何部署上线

老规矩,先看图,下图是正常的前端发布流程

下面的流程大家觉得有什么问题吗?
很多公司都是这样的一个流程,我们要知道服务器是做什么的?服务器应该是运行一些动态的程序,比如我们的Java代码,NodeJs代码,他是动态去处理数据,处理我们客户端的请求的。但是我们打包构建好的JS是一个文件,我们把一个静态文件放置一台服务器是不是就会很浪费成本,所以下图的流程一般是后端的部署流程

#mermaid-svg-IsNJ63NtiiOgQlwJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-IsNJ63NtiiOgQlwJ .error-icon{fill:#552222;}#mermaid-svg-IsNJ63NtiiOgQlwJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IsNJ63NtiiOgQlwJ .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-IsNJ63NtiiOgQlwJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IsNJ63NtiiOgQlwJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IsNJ63NtiiOgQlwJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IsNJ63NtiiOgQlwJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IsNJ63NtiiOgQlwJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IsNJ63NtiiOgQlwJ .marker.cross{stroke:#333333;}#mermaid-svg-IsNJ63NtiiOgQlwJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IsNJ63NtiiOgQlwJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-IsNJ63NtiiOgQlwJ .cluster-label text{fill:#333;}#mermaid-svg-IsNJ63NtiiOgQlwJ .cluster-label span{color:#333;}#mermaid-svg-IsNJ63NtiiOgQlwJ .label text,#mermaid-svg-IsNJ63NtiiOgQlwJ span{fill:#333;color:#333;}#mermaid-svg-IsNJ63NtiiOgQlwJ .node rect,#mermaid-svg-IsNJ63NtiiOgQlwJ .node circle,#mermaid-svg-IsNJ63NtiiOgQlwJ .node ellipse,#mermaid-svg-IsNJ63NtiiOgQlwJ .node polygon,#mermaid-svg-IsNJ63NtiiOgQlwJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IsNJ63NtiiOgQlwJ .node .label{text-align:center;}#mermaid-svg-IsNJ63NtiiOgQlwJ .node.clickable{cursor:pointer;}#mermaid-svg-IsNJ63NtiiOgQlwJ .arrowheadPath{fill:#333333;}#mermaid-svg-IsNJ63NtiiOgQlwJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IsNJ63NtiiOgQlwJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IsNJ63NtiiOgQlwJ .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-IsNJ63NtiiOgQlwJ .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-IsNJ63NtiiOgQlwJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IsNJ63NtiiOgQlwJ .cluster text{fill:#333;}#mermaid-svg-IsNJ63NtiiOgQlwJ .cluster span{color:#333;}#mermaid-svg-IsNJ63NtiiOgQlwJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-IsNJ63NtiiOgQlwJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

开发代码
git push--触发webHook
集成
Jenkins:Docker
构建代码
发布
服务器
Nginx

前端部署一般会加上CDN(内容分发网络)
为什么要加CDN,第一优化加载速度(网络时延导致的速度过慢),第二把不需要动态处理的文件(JS/CSS/Image/Video)放在CDN节省服务器资源。

最后两个步骤,主要是快速回滚,假如我们发布到线上的代码出现了问题,再重头集成,大概需要十分钟,而这十分钟客户一直看到的是有问题的页面!
每次 HTML 加载的时候我们会先去读取版本,然后拿到对应版本的JS/CSS,这样的话所有的CSS和JS都是有对应版本的,一旦发现问题直接通过HTML 加载上一次的版本即可。

#mermaid-svg-p60nHcIWkykoLwPo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-p60nHcIWkykoLwPo .error-icon{fill:#552222;}#mermaid-svg-p60nHcIWkykoLwPo .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-p60nHcIWkykoLwPo .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-p60nHcIWkykoLwPo .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-p60nHcIWkykoLwPo .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-p60nHcIWkykoLwPo .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-p60nHcIWkykoLwPo .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-p60nHcIWkykoLwPo .marker{fill:#333333;stroke:#333333;}#mermaid-svg-p60nHcIWkykoLwPo .marker.cross{stroke:#333333;}#mermaid-svg-p60nHcIWkykoLwPo svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-p60nHcIWkykoLwPo .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-p60nHcIWkykoLwPo .cluster-label text{fill:#333;}#mermaid-svg-p60nHcIWkykoLwPo .cluster-label span{color:#333;}#mermaid-svg-p60nHcIWkykoLwPo .label text,#mermaid-svg-p60nHcIWkykoLwPo span{fill:#333;color:#333;}#mermaid-svg-p60nHcIWkykoLwPo .node rect,#mermaid-svg-p60nHcIWkykoLwPo .node circle,#mermaid-svg-p60nHcIWkykoLwPo .node ellipse,#mermaid-svg-p60nHcIWkykoLwPo .node polygon,#mermaid-svg-p60nHcIWkykoLwPo .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-p60nHcIWkykoLwPo .node .label{text-align:center;}#mermaid-svg-p60nHcIWkykoLwPo .node.clickable{cursor:pointer;}#mermaid-svg-p60nHcIWkykoLwPo .arrowheadPath{fill:#333333;}#mermaid-svg-p60nHcIWkykoLwPo .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-p60nHcIWkykoLwPo .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-p60nHcIWkykoLwPo .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-p60nHcIWkykoLwPo .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-p60nHcIWkykoLwPo .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-p60nHcIWkykoLwPo .cluster text{fill:#333;}#mermaid-svg-p60nHcIWkykoLwPo .cluster span{color:#333;}#mermaid-svg-p60nHcIWkykoLwPo div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-p60nHcIWkykoLwPo :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

开发代码
git push--触发webHook
集成
Jenkins:Docker
构建代码
HTML
JS + CSS =>CDN
Version
a. 集成

这里详细解释一下为什么要在集成的环境(也叫云构建)去进行 npm run build ?
为什么不在本地环境进行构建,要在集成的环境构建,这里核心的问题就是,没有办法保证每个人的环境(比如:npm版本、node版本)是一样的,假设不环境不一样的话,构建出来的产物就会有差异,发布上线以后出现问题很难排查。

b. 发布

前端的代码应该是运行在哪里? 运行在一台物理服务器或者云服务器上

四、大厂工程化实践及开源方案

  1. 蚂蚁金服开源的 UmiJS;
    它提前预定好很多功能,我们可以做到开箱即用,其实 UmiJS 已经是前端工程化一个很好的范例与实践(包含基础配置比如路由、mock、构建(Webpack)、部署)。

  2. 阿里开源的 飞冰
    它和 UmiJS 一样也是基于React去设计的,飞冰比 UmiJS 内置的功能要更多一点,比如:数据请求、状态管理、日志打印、菜单配置等等。

  3. 字节跳动开源的 MODERN.js
    MODERN 会比飞冰与UmiJS包含的内容更多一些,它是按照业务场景把功能做了一个更细致的分类,比如:正常网站、中后台、桌面应用、微前端等等,主要的是支持Vue。

五、迷你工程化脚手架实践

时间有限稍后给大家补上,抱歉抱歉!!!

前端工程化详解——理解与实践前端工程化相关推荐

  1. HTML5 多图片上传(前端+后台详解)

    HTML5 多图片上传(前端+后台详解) 1.参考jquery插件库 2.修改代码 3.添加的后台代码 4.删除的后台代码 1.参考jquery插件库 手机端实现多图片上传 2.修改代码 我发现他这里 ...

  2. web前端项目详解:OPPO首页进度条特效(定时轮播)

    web前端项目详解:OPP首页进度条特效(定时轮播) 知识点:布局结构分析,定位运用,页面兼容性问题,Jquery的基础运用(修改盒子样式,动画方法,简单算法,淡入淡出方法,定时器方法)代码结构 效果 ...

  3. 03_02_前端 Bootstrap详解

    前言 文章内容输出来源:拉勾教育Java就业训练营 上一阶段前端 Bootstrap详解 bootstrap 什么是Bootstrap? Bootstrap来自 Twitter,是目前最受欢迎的响应式 ...

  4. Python数据科学-技术详解与商业实践视频教程

    Python数据科学-技术详解与商业实践(八大案例) 网盘地址:https://pan.baidu.com/s/13QrR_5Er6LgWCWzSb7qOrQ 提取码:s7vw 备用地址(腾讯微云): ...

  5. 爬虫解析利器PyQuery详解及使用实践

    作者:叶庭云 整理:Lemon 爬虫解析利器 PyQuery详解及使用实践 之前跟大家分享了 selenium.Scrapy.Pyppeteer 等工具的使用. 今天来分享另一个好用的爬虫解析工具 P ...

  6. python数据科学课后答案_Python数据科学-技术详解与商业实践-第五讲作业

    作者:Ben,著有<Python数据科学:技术详解与商业实践>.<用商业案例学R语言数据挖掘>.<胸有成竹-数据分析的SAS EG进阶>作者.2005年进入数据科学 ...

  7. python数据挖掘商业案例_Python数据科学-技术详解与商业实践-第八讲作业

    作者:Ben,著有<Python数据科学:技术详解与商业实践>.<用商业案例学R语言数据挖掘>.<胸有成竹-数据分析的SAS EG进阶>作者.2005年进入数据科学 ...

  8. 内存详解-理解 JVM 如何使用 Windows 和 Linux 上的本机内存

    内存详解 理解 JVM 如何使用 Windows 和 Linux 上的本机内存 Java™ 堆耗尽并不是造成 java.lang.OutOfMemoryError 的惟一原因.如果本机内存 耗尽,则会 ...

  9. 《ONAP技术详解与应用实践》中奖名单来了!

    上周,我们进行了第二轮的赠书活动(传送门),将在活动成功参与者中抽取5位粉丝,每人赠送一本由机械工业出版社提供的<ONAP技术详解与应用实践>. 下面,我们来看看本次中奖名单吧. 5位幸运 ...

最新文章

  1. node.js(一)
  2. 从DDD看企业级问题解决方案框架
  3. 比特币的挑战者 BCH 带着开发者们来到湾区了!
  4. [Ubuntu] 启动gvim时,怎样设置一个项目的文件为打开状态
  5. 【计算机网络】网络层 : 总结 ( 功能 | 数据交换 | IP 数据报 | IPv4 地址 | IPv6 地址 | 路由选择协议 | 路由算法 )★★★
  6. jdbc驱动jar_Javagt; 连接数据库时,JDBC和Mybatis的区别
  7. CentOS中怎样安装、配置、启动Nginx
  8. python 程序运行插件_如何使Python插件在Pluma中运行?
  9. 2.2物理层传输介质
  10. ICCV2021 人脸深伪分析挑战赛 重磅来袭
  11. 重磅!谷歌大脑提出EfficientNet平衡模型扩展三个维度,取得精度-效率的最大化!...
  12. 高级GIT教程-如何使用GIT调试代码?
  13. [C#-Util]-读写文件汉字乱码
  14. 将MNIST数据集转化为png文件
  15. 游侠客php,华东推荐徒步线路之轻户外经典线路——杭宣古道
  16. ADIDAS的完整形式是什么?
  17. python绘制线段_绘制线条点图
  18. Android集成FFmpeg并实现视频转码
  19. 当天开始时间和结束时间,时间戳
  20. 请问我这段多线程代码为什么会死机?

热门文章

  1. 关于卡巴斯基7.0的新传输协议
  2. C语言中的32个关键字及含义
  3. 电脑计算机管理摄像头服务,电脑win7摄像头怎么开启(摄像头的3种打开方法)...
  4. 在Linux中使用U盘
  5. 制作多系统U盘(一个U盘两个系统,适用于win)
  6. 金升阳率先推出无电解电容AC-DC电源模块LNxx-12Bxx技术手册
  7. C primer plus 第七章 练习7:编写程序,要求输入一周的工作小时数,然后打印工资总额,税金以及净工资。
  8. Mybatis添加用户返回id
  9. 成功解决:ERROR: Cannot find command ‘git‘ - do you have ‘git‘ installed and in your PATH?
  10. 第十八次CSP认证总结