本文最初是由Salem Olorundare在Honeybadger Developer Blog上撰写的。
如果我告诉您,即使在浏览器支持之前,您可以使用代码中的所有现代JavaScript功能怎么办?在过去的几年中,JavaScript经历了许多更改,包括Promises,React,Arrow功能,传播运算符以及键入Javascript(例如Typescript和Flow)等框架中使用的JSX。
。JavaScript在浏览器中运行,因此需要浏览器支持才能正确解释和执行这些新功能。浏览器中新的JavaScript功能的集成需要时间,并且如果没有浏览器支持,JavaScript代码将无法执行。
编码工具(例如Babel)是解决此问题的解决方案。在本文中,您将学习以下内容:
- Babel是什么以及为什么使用它。
- 编译和转移的过程。
- 什么是Sucrase。
- Babel和Sucrase的一些替代品。
Babel是什么,它做什么?
Babel是一个免费的开源JavaScript编译器。它将您的ES6+(现代JavaScript)代码转换为ES5浏览器友好的代码,因此您可以在无需等待浏览器支持的情况下便利地使用JavaScript的新功能代码。
随着JavaScript随着新功能的添加和升级而更改,开发人员采用并使用这些新功能来构建其应用程序。不幸的是,有些浏览器不支持这些新更改。较旧的浏览器无法运行JavaScript的新功能,因为它们尚未更新或增强以处理此类任务。
以使用打字稿来构建Web应用程序。 Typescript是基于JavaScript的编程语言。为了运行Typescript代码,必须首先将其编译到Plain JavaScript中。这样做的原因是,由于浏览器没有完全支持它,因此无法直接运行Typescript。 Babel使JavaScript应用程序可以在旧浏览器和新浏览器上运行。这些浏览器不一定需要与仅添加的JavaScript功能兼容。
这是Babel如何将带有现代功能编写的JavaScript代码转移到旧浏览器可以理解的代码中的一个示例:
-
ES6箭头功能
const a = (x, y) => { return x + y };
此编译为
var a = function(x, y) { return x + y };
-
使用Backticks
模板var name = "John"; var food = "Vegetables"; `Hello, I am ${name}, and I love ${food}?`;
此编译为
var name = "John"; var food = "Vegetables"; "Hello, I am " + name + ", and I love " + food;
浏览器支持JavaScript的新功能的演变需要时间。
babel是一种JavaScript转板器,将高级JavaScript代码转换为更兼容的JavaScript形式,较旧的浏览器可以理解。它试图理解现代JavaScript代码,并将其重写为浏览器可以理解的较旧语法。
编译,转移和多填充有什么区别?
计算机或任何数字设备仅了解二进制代码。但是,我们用看起来像英语的语言编码,计算机显然不理解。计算机如何理解我们的代码作为人类开发人员并执行对它们的要求?这是编译和 transpliting 进来的地方。
编译 - 编译器是一种软件,将更高级别的代码解释为机器可以理解的机器代码或代码。在编译过程中,用一种编程语言编写的代码被翻译成另一种编程语言。
transpliting 是将源代码从一种语言转换为同一语言的不同版本的过程。转运器是一种编译器;但是,虽然编译器采用源代码并将其转换为低级代码,但Transpiler采用源代码并将其转换为相同高级的代码。
一个很好的例子是使用打字稿来构建应用程序。在Typescript可以在浏览器上运行之前,需要首先将其转移到Plain JavaScript,这允许浏览器有效地解释代码。
babel transpiles代码用高级语言写入高级代码中,可以在浏览器或其他软件中执行。
polyfilling '允许您添加不在本地存在的功能。这是在不了解此功能的旧浏览器上复制现代JavaScript代码功能的一种方法。
有时,新的语言功能包括该语言中从未存在的其他功能或内置方法。浏览器无法解释此功能;因此,它需要一个转换器(称为polyfiller)才能更改或重写此函数,以解释浏览器可以解释的功能。
babel是可用的最突出的多填料之一,可帮助浏览器不了解此新功能,以找到与新功能相同任务的类似函数。
预订和用法
Babel是开发人员易于使用的工具。按照以下步骤配置机器上的babel。
-
创建一个迷你项目并使用NPM初始化:
npm init -y
-
安装 - 运行此命令将Babel添加到您的
package.json
文件:
npm install --save-dev @babel/core @babel/cli @babel/preset-env npm install --save @babel/polyfill
-
使用以下代码添加一个
babel.config.json
文件:
{ "presets": [ [ "@babel/preset-env", { "targets": { "edge": "17", "firefox": "60", "chrome": "67", "safari": "11.1" }, "useBuiltIns": "usage", "corejs": "3.6.5" } ] ] }
-
编写您的JavaScript代码,然后将其添加到Root Directory中的文件夹中,称为
src
:
const styles = { ...defaults, color: "#f5da55", };
让我们编译此JavaScript代码并查看输出。
-
在您的终端中运行以下命令以编译JavaScript代码:
npx babel src --out-dir js
此命令编译了在
src
文件夹中编写的所有JavaScript代码,并将编译的JavaScript代码添加到js
文件夹中。输出:
"use strict"; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } const styles = _objectSpread(_objectSpread({}, defaults), {}, { color: "#f5da55" });
以上结果是我们编译的JavaScript代码的输出。
使用Babel的利弊
专利:
- Babel的基本设置相对简单。
- 有大量的社区支持以及不断的更新和改进。
cons:
- 它的编译时间很慢。
- 它需要很多依赖项,不包括安装超过269个软件包的DEV依赖性。
什么是Sucrase,与Babel有何不同?
sucrase是Babel的超级快速潜在替代品,可以更快地进行开发。它声称比Babel快20倍。
与Babel不同,Sucrase不会将大量的JS功能汇编为ES5或更低的功能,无法在较旧的浏览器中工作。取而代之的是,它假设您正在使用最近的浏览器开发,并专注于编译非标准语言扩展:JSX,Typescript和Flow。弹酶的小范围使其比Babel快得多。
babel将所有代码汇编为您的浏览器可以运行的内容,而Sucrase则专注于Babel所做的一小部分。
Sucrase利用编译器体系结构使其更具性能(就开发构建而言),但范围更低和可维护。因此,对于生产环境而言,这不是建议的选择。仅应在开发过程中考虑。
Sucrase建立在Babel的基础上,因为它的解析器(Sucrase)是从Babel Parser分叉的。这使Sucrase非常依赖Babel,并且没有Babel就不可能存在。
Sucrase设置和用法
使用Sucrase转换打字稿应用程序很简单。请按照以下步骤使用Sucrase编译您的第一个打字稿应用程序。
-
安装:
yarn add --dev sucrase
或npm install --save-dev sucrase
-
在root项目目录中创建一个
src
文件,并添加带有以下代码的打字稿文件:
function addNumbers(a: number, b: number) { return a + b; } var sum: number = addNumbers(10, 15) console.log('Sum of the two numbers is: ' +sum);
-
用Sucrase编译您的打字稿代码:
sucrase ./src -d ./js --transforms typescript,imports
命令将您的打字稿代码(.ts)转移到JS文件夹中的JavaScript代码(.js)。
输出:
"use strict"; function addNumbers(a, b) { return a + b; } var sum = addNumbers(10, 15) console.log('Sum of the two numbers is: ' +sum);
以上是您的thexpript到JavaScript代码。
使用Sucrase的利弊
专利:
- 更快的开发构建。
cons:
- Sucrase不会检查错误的代码,应始终与Linter或Type-Checker一起使用。
- Sucrase不利用插件。需要写入转换以相互合作;每个其他转换都需要大量工作。
- 该工具对原型语言扩展和即将到来的语言功能不利。 Sucrase的更快架构使新的转换更加脆弱,更难编写。
使用大型代码库时,重要的是要使用快速JavaScript编译器快速构建应用程序。
尽管Sucrase是快速应用程序开发和良好编译器的非常有生产力的工具,但它没有Babel的全部范围和多功能性。这是Sucrase不涵盖的一些功能:
- Sucrase不是类型检查器。它在不检查正确的情况下运行代码。
- Sucrase不会为IE等旧浏览器传输代码,因为它假设开发人员正在使用最近的浏览器进行开发。
- Sucrase不会检查您的代码是否错误。如果给出有效的代码,Sucrase将产生有效的代码,反之亦然。在开发过程中,应将合适的类型检查器与Sucrase一起使用以检查错误。
Sucrase和Babel的替代品
除了将Babel和Sucrase用作移植和Polyfill JavaScript代码的编译器外,还可以在构建应用程序时考虑其他编译器选项。一些替代方法如下:
其他替代方案
Eslint-Plugin-Compat
此插件在构建代码时消除了转移过程,并在应用程序中存在太现代的浏览器时,您的代码编辑器提醒您。
如果没有现代功能,您将无法没有编码,则可以手动进行多填充。如果没有,您可以在需要时简单地使用旧语法。
此插件消除了依靠转板器的需求,并使您可以控制生产代码。它可以轻松地与您的Visual Studio代码集成。
设置
-
安装:
npm install --save-dev eslint eslint-plugin-compat
-
创建以下
.eslintrc.json
文件并添加以下设置:
{ + "extends": ["plugin:compat/recommended"], + "env": { + "browser": true + }, // ... }
-
将此代码添加到您的
package.json
文件中以配置浏览器目标:
{ // ... + "browserslist": [ + "defaults" + ] }
注意:确保安装了VS Code ESLint extension。它是VS代码编辑器插件。
快速的网络编译器(SWC)
SWC是用Rust编写的超快速JavaScript编译器。它是用于生产JavaScript代码的编译,缩小和捆绑的开发人员工具。
SWC是Babel的竞争对手,因为它比Babel快20倍。它也可以用来实现更快的开发构建。
SWC设置和用法
SWC可以从Node Package Manager(NPM)中安装为软件包。以下是使机器上的SWC编译器及其使用情况的程序。
-
创建一个目录并导航到您要安装SWC的目录。
mkdir swc_project
-
初始化package.json:
npm init
-
安装SWC核心和SWC CLI工具:
npm install --save-dev @swc/core @swc/cli
-
在您的终端上运行以下命令以将文件传输:
npx swc ./filename.js
使用SWC的利弊
ProS
- 比Babel快20倍。
- 需要更少的依赖项。
cons
- 不支持所有公寓的特征。
- 有一个小社区和很少的贡献者。
闭合编译器
CLOSURE编译器是使JavaScript应用程序运行速度更快的工具。 CLOSURE通过更有效地减少和重写代码来编译JavaScript应用程序代码。它还检查类型和语法,并提供有关代码错误的警告。
关闭在代码汇编方面非常有效。它减少了JavaScript文件的大小。闭合编译器通过检查代码库中非法代码的错误和警告开发人员,帮助开发人员以更少的错误编写代码。这使代码更可维护。
打字稿编译器(TSC)
这是打字稿的默认编译器。当您的计算机上安装打字稿时,它将在全球安装。
Typescript编译器可用于使用React等工具的前端项目。这是用于基于打字稿的项目的简单工具。
运行tsc filename.ts
将您的打字稿应用于JavaScript。
结论
Babel是软件开发行业中最受欢迎,最常用的JavaScript编译器之一。
除了在开发构建过程中Babel的性能缓慢外,Babel是建立生产应用程序时要考虑的重要生产工具。不建议在生产环境中使用更快的版本。
有很多选择可以选择用于传输您的代码。在构建软件应用程序之前,必须对您的潜在客户使用良好的浏览器进行良好的分析研究,以选择合适的生产工具。