理解前端工程化

· 浏览次数 : 0

小编点评

##前端工程化概述 前端工程化是一种将前端项目从开发到发布阶段的自动化过程,旨在提升开发效率、降低开发成本。通过自动化的代码构建、测试、部署等步骤,前端工程化可以缩短开发周期,提高代码质量,提升网站性能。 ## 常见前端工程化的技术及工具 * **代码编译器:** Babel 是一个工具,可以将 JavaScript 代码转换为可执行的 JavaScript 代码。 * **预处理器:** Sass 是一个用于代码预处理的工具,可以将 Sass 代码转换为标准的 CSS 代码。 * **CSS预编译器:** Less、Sass 等工具可以将 Sass 代码转换为标准的 CSS 代码。 * **模块化:** CommonJS、ES modules 等工具可以帮助将代码模块化,提高代码的可维护性。 * **打包工具:** webpack 是一个用于模块化前端项目的打包工具,可以将多个 JavaScript 和 CSS 文件打包成一个静态资源文件。 * **脚手架:** Vue-cli、vite 等工具可以帮助快速构建前端项目。 ## 为什么要使用前端工程化? * **提高开发效率:** 自动化的代码构建、测试、部署可以减少开发人员的繁重工作量,提高开发效率。 * **降低开发成本:** 通过自动化减少开发人员的劳动量,可以降低开发成本。 * **提升代码质量:** 通过自动化测试和代码规范化,可以提升代码质量。 * **提高网站性能:** 通过优化代码结构和压缩文件,可以提升网站性能。 ## 总结 前端工程化是一个非常重要的技术,可以帮助构建更高效、更高质量的前端项目。通过使用前端工程化的工具和技术,可以极大地提升前端开发效率,降低开发成本,提升网站性能。

正文

最初对前端的观感:眼花缭乱,各种各样的工具链以及其对应的配置文件、VS Code 插件,各种技术百家争鸣,选择众多。后来才理解前端不同于后端,后端代码的运行环境相对可控,而前端代码运行在用户设备上,所以需要兼容不同的环境,而很大一部分的工具、配置都是解决兼容性的问题

TL;DR

工程化的目的:降低开发成本提高开发效率
方式:解决前端三大件(HTML, CSS, JS)存在的问题并对其进行增强,JS 通过 Babel 而 CSS 可以通过 Sass, Less, PostCSS 等工具实现进行增强,并且保证输出向后兼容的的 JS 或 CSS 代码

模块化、包管理

分解聚合:拆分复杂任务,降低复杂度(分而治之)

模块化解决 问题:1. 全局污染 2. 依赖管理 等等
JS 模块化标准(常用):1. CommonJS (Node 标准)2. ES modules(JavaScript 官方标准模块化方案)
实现:1. 浏览器只支持 ESM 2. Node 和 构建工具 上面两种标准都支持

包 (package) 管理:npm(Node.js的标准包管理器),还有其他的 pnpm 和 yarn 等

JS 工具链

JS 语言本身一直都在繁荣地发展,经常出现新的 API 和 语言特性,但是用户的运行环境(浏览器、Node等)的版本可能是五花八门的,可能会导致报错、兼容性等的问题,所以最朴素的解决方式就是把 JS 都转换为向后兼容的老版本 JS 代码。前端的运行环境更多的是在用户这边,这点不同于后端能比较自由地调整服务器运行环境,这可能就是前端缝缝补补的原因吧,修补主要有的方式:

  1. 新 API:使用 Polyfill(填充物),为其实现缺少的 API,例如 core-js 库,就实现了 ArrayflatMap 方法,这样在旧版本的 Node 环境,也可使用该方法
  2. 新语法:例如 Promise,对于这样的语法糖,就无法直接为其编写方法,需要转换代码,有点类似翻译,通过 regenerator 库可以将含有 Promise 的代码转换为向后兼容的代码

有很多这样的库用于解决某个特定的兼容性问题,一个个导入很麻烦,所以就有了 Babel,可以通过 Babel 的插件整合这些转换代码的库,需要安装对应的 Babel 插件依赖 并在 babel.config.js 中配置 plugins。这样还是很麻烦,所以我们可以直接使用 Babel 的预设,其中最常用的就是:@babel/preset-env,安装依赖以后完成以下的 babel.config.js 配置,即可开箱即用:

// common js
module.exports = {
    presets: [
        // 预设名称 & 配置
        ['@babel/preset-env', {
            targets: {
                edge: '17',
                firefox: '60',
                chrome: '67',
                safari: '11.1'
            },
            // 按需导入 polyfill,未使用的 API 不导入
            useBuiltIns: 'usage',
            corejs: '3.37.0',
        }]
    ]

    // 插件的配置方式
    // plugins: [
    //     '@babel/plugin-transform-optional-chaining'
    // ]
}

有了这种思维之后,就可以通过 转换代码 的方式任意地增强 JS 的能力,就像:JSXTypeScript ,它们最终还是会被编译为纯 JS 代码

CSS 工具链

CSS 语法缺失(逻辑、函数等等),无法进行复杂的操作,所以就有了 CSS 预编译器:Less, Sass 等等的,与 JS 的处理方式一样,可以通过工具对其进行转换,转换为最朴素的 CSS,这样就没有兼容性的问题。解决了兼容性问题还需要解决 CSS 本身的问题:

  1. 浏览器前缀 ( vendor prefixes ):类似 -webkit- 开头的样式 ,可以通过 autoprefixer 来自动添加浏览器前缀以确保网页在不同浏览器中的兼容性
  2. 压缩:减少 CSS 文件的大小,从而提高网页加载速度,相关的库 cssnano
  3. 剪枝:移除没有用到的 CSS,相关的库:purgecss
  4. 类名冲突:通过 css module 来实现,相关的库:postcss-modules

与处理 JS 的 Babel 类似,CSS 也有工具整合了上面这些工具,它就是PostCSS,安装需要的 依赖后,还需要配置 postcss.config.js。与 Babel 类似,它也可以开箱即用,需要安装依赖并配置 postcss-preset-env

module.exports = {
  map: false,
  plugins: {
    tailwindcss: {},
    'postcss-preset-env': {},
  },
};

构建工具和脚手架

开发和运行的代码不一致,开发阶段我们希望工程代码可以方便地开发维护,而在对于生产运行的代码,我们则希望它兼容性强、文件小、加载快等等。这中间就需要打包工具来进行转换,常用的打包工具有:webpack,它的主要作用:

  1. 模块化管理:使得项目结构清晰、依赖关系明确
  2. 打包编译:将各个模块按照其依赖关系进行打包编译,将它们转换为浏览器可识别的静态资源文件
  3. 资源优化:压缩 JavaScript、CSS、图片等文件,以减小文件体积,提高加载速度
  4. 代码分割:实现按需加载,提高页面加载性能
  5. 开发服务器:自动编译并运行服务(热更新),便于开发
  6. Source Map:存储了编译后代码与源代码之间的映射关系,便于调试代码

BabelPostCSS 相似,一旦有很多细碎的东西出现,就必然有工具可以进行整合并提供预设,对于整个代码工程来说,它就是脚手架:vue-cli, vite 等等,提供了交互式的界面辅助生成工程模版

参考资料

ECMAScript 6 入门 - 阮一峰
工程化大师课
What is @babel/preset-env and why do I need it?
postcss 结合 tailwindcss

与理解前端工程化相似的内容:

理解前端工程化

最初对前端的观感:眼花缭乱,各种各样的工具链以及其对应的配置文件、VS Code 插件,各种技术百家争鸣,选择众多。后来才理解前端不同于后端,后端代码的运行环境相对可控,而前端代码运行在用户设备上,所以需要兼容不同的环境,而很大一部分的工具、配置都是解决兼容性的问题 TL;DR 工程化的目的:降低开

提高工作效率的神器:基于前端表格实现Chrome Excel扩展插件

Chrome插件,官方名称extensions(扩展程序);为了方便理解,以下都称为插件。 我们开发的插件需要在浏览器里面运行,打开浏览器,通过右上角的三个点(自定义及控制)-更多工具-拓展程序-打开开发者模式。点击"加载已解压的拓展程序,选择项目文件夹,就可将开发中的插件加载进来。 插件是基于We

7个工程应用中数据库性能优化经验分享

摘要:此篇文章分别从sql执行过程、执行计划、索引数据结构、索引查询提速原理、聚焦索引、左前缀优化原则、自增主键索引这些角度谈一谈我们对数据库优化的理解。 本文分享自华为云社区《工程应用中数据库性能优化经验小结》,作者: 叶工 。 1、前言 现阶段交付的算法产品,绝大多数涉及到数据库的使用。它承载的

[转帖]RabbitMQ学习笔记01:初识与安装

https://www.cnblogs.com/alongdidi/p/rabbitmq_overview.html 原作者写的真好. 前言 本人是一名运维工程师,在此公司接触到 RabbitMQ ,平时针对此软件的工作内容就是集群的安装以及配置监控等,对其的理解也仅仅是知道其是一种消息队列的服务,

Nginx 简介、安装与配置文件详解

〇、前言 在日常工作中,Nginx 的重要性当然不言而喻。 经常用,但并不意味着精通,还会有很多不清楚的方式和技巧,那么本文就简单汇总下,帮助自己理解。 一、Nginx 简介 1.1 关于 Nginx Nginx(发音为“Engine X”)是一款轻量级和高性能的 Web 服务器、反向代理服务器、电

3xx HTTP状态码的终极指南

前言 如果你在管理一些网站,那么对HTTP重定向的理解对于可靠的网站性能至关重要。在这篇文章中,我们将全面了解一下3xx HTTP状态码,从这里你可以了解它们是如何工作的,如何更好地管理它们,以及它们对SEO的影响。 HTTP重定向的目的 URL重定向涉及到一个网页地址被映射到另一个。网站需要重定向

.NET反编译神器ILSpy怎么用?

前言 上一篇文章我们介绍了4款免费且实用的.NET反编译工具👉,这篇文章主要来说说ILSpy这个工具该如何安装和使用。 ILSpy ILSpy是一款免费、开源的 .NET 反编译工具,能够将已编译的 .NET 程序集转换为易于阅读和理解的源代码。 GitHub开源地址:https://github

国产CPU制造工艺与部分性能总结

国产CPU制造工艺与部分性能总结 背景 最近一段时间验证了很多国产CPU的性能. 感觉很多地方与之前的理解有一些偏差. 前几天总结了部分架构和指令集相关的差异 今天想着总结一下制造相关的部分. 希望能够更全面的了解国产化的相关内容. 频率相关 想到制程, 第一反应就是会影响主频这一重要属性 第一款打

容器化前后端分离-前端部署处理过程

摘要 未进行过细致测试,仅能够进行测试验证 如果需要上产生, 建议进行大量的测试工作. 理论上产品支持前后端分离. 但是DIP的导入,以及部分模板文件的下载可能存在问题 需要进行调整. 处理步骤 docker pull nginx 拉取最新的nginx镜像. 验证一下版本: docker exec

从历代GC算法角度刨析ZGC

作者:京东科技 文涛 前言 本文所有介绍仅限于HotSpot虚拟机, 本文先介绍了垃圾回收的必要手段,基于这些手段讲解了历代垃圾回收算法是如何工作的, 每一种算法不会讲的特别详细,只为读者从算法角度理解工作原理,从而引出ZGC,方便读者循序渐进地了解。 GC 是 Garbage Collection