前端构建工具

一、什么是前端构建工具?

前端构建工具就是在项目开发及编译阶段帮助我们完成那些需要反复重复的任务,比如代码压缩、编译等工作,构建工具能够大大提高我们的开发效率。

常用构建工具:grunt (JavaScript 世界的构建工具)、gulp (用自动化构建工具增强你的工作流程)、webpack (专注于构建模块化项目)、yeoman (强健的工具,库,及工作流程的组合)

二、为什么需要构建工具?

模块规范化产生,不同模块规范下产生的代码不互通,需要解决复杂应用开发代码组织的问题。

1、环境兼容。 浏览器内核不同,页面效果不统一问题(自动补全操作),解决es6在浏览器兼容问题(把源代码转化成浏览器可执行的javascript、css及html代码);

2、性能优化。 文件合并(文件过多,下载耗时,合并减少文件数量),文件压缩(比如去除多余空格和换行,替换变量名为比较短的变量名,减少文件大小);

3、开发效率。 Vendor前缀(构建工具可以自动添加CSS的Vendor前缀),单元测试(提交代码前,构建工具自动跑一遍单元测试),代码分析(使用代码分析工具,可以很好的帮助检查常见问题)。

三、构建工具变化史

javascript语言设计之初,只是作为一个简单的脚本语言用来丰富网站的功能,并不像java、c++那样有module的概念,发展到现在的模样,也经历了相当长的时间。

这段时间,可以简单归纳为:

  1. 青铜时代 - no module;
  2. 白银时代 - cjs、amd、cmd、umd、esm相继出现
  3. 黄金时代 - 组件模块化;

不同的时代,构建工具也不同

1、青铜时代

由于没有module的概念,javascript无法在语言层面实现模块之间的相互隔离、相互依赖,只能由开发人员手动处理。相应的,早期的web开发也比较简单甚至简陋。

  1. 通过对象、iife(或者闭包)的方式实现模块隔离;
  2. 通过手动确定script的加载顺序确定模板之间的依赖关系;
  3. jsp开发模式,没有专门的前端,html、js、css代码通常也由后端开发人员编写。

为了节省宽带和保密,通常需要对前端代码做压缩混淆处理。这个时候,构建工具为YUI TOOL+Ant

2、白银时代

chrome v8引擎和node的横空出世,给前端带来了无限的可能。同时,javascript的模块化标准也有了新的发展。

  1. commonjs规范,适用于node环境开发;
  2. amd、cmd规范,适用于浏览器环境;
  3. umd,兼容amd、commonjs,代码可以同时运行在浏览器和node环境;
  4. ESM,即ES6 module(这个时候还不是很成熟);

同时还出现了less、sass、es6、jslint、eslint、typescript等新的东西,前端角色也承担越来越重要的作用,慢慢的独立出来。

有了node提供的平台,大量的工具开始涌现:

  1. requirejs提供的r.js插件,可以分析amd模块依赖关系、合并压缩js、优化css;
  2. less/sass插件,可以将less/sass代码转化为css代码;
  3. babel,可以将es6转化为es5;
  4. typescript,将ts编译为js;
  5. jslint / eslint,代码检查;

这个时候,我们可以将上面的的这些操作配置成一个个任务,然后通过 Grunt / Gulp 自动执行任务。

3、黄金时代

基于Angular、Vue、React三大框架和Webpack的使用,组件模块化成为前端开发的主流模式。同时ESM规范也越来越成熟,被更多浏览器支持。

以React和Webpack为例,通常我们会将一个应用涉及到的所有的功能拆分为一个个组件,如路由组件、页面组件、表单组件、表格组件等,一个组件对应一个源文件,然后通过webpack将这些源文件打包,在开发过程中,还会通过webpack开启一个local server,实时查看代码的运行效果;

webpack是一个静态模块打包器,它会以entry指定的入口文件为起点,分析整个项目内各个源文件之间的依赖关系,构建一个模块依赖图-module graph,然后将module graph分离为多个bundle。在构建module graph的过程中,会使用loader处理源文件,将他们转化为浏览器可以识别的js、css、image、音视频等。

随着时间的发展,webpack的功能越来越强大,也迎来诸多对手。

目前来看,构建工具在整个前端体系中占据的位置是越来越重要,不懂构建工具已经无法满足日常开发。我们需要时时学习,紧跟时代的脚步,了解最新的技术,不断前进。

相关推荐
韭菜炒大葱19 分钟前
前端经典面试题:从 URL 输入到页面展示,中间经历了什么?
前端·http·面试
swipe26 分钟前
纯函数、柯里化与函数组合:从原理到源码,构建更可维护的前端代码体系
前端·javascript·面试
远山枫谷27 分钟前
uniapp + Vue 自定义组件封装:自定义样式从入门到实战
前端·vue.js
Lee川31 分钟前
JavaScript 中的 `this` 与变量查找:一场关于“身份”与“作用域”的深度博弈
前端·javascript·面试
顺遂3 小时前
基于Rokid CXR-M SDK的引导式作业辅导系统设计与实现
前端
代码搬运媛3 小时前
Generator 迭代器协议 & co 库底层原理+实战
前端
前端拿破轮3 小时前
从0到1搭建个人网站(三):用 Cloudflare R2 + PicGo 搭建高速图床
前端·后端·面试
功能啥都不会3 小时前
PM2 使用指南 - 踩坑记录
前端
HelloReader3 小时前
React 中 useState、useEffect、useRef 的区别与使用场景详解,终于有人讲明白了
前端
兆子龙3 小时前
CSS 里的「if」:@media、@supports 与即将到来的 @when/@else
前端