当前位置: 首页 > news >正文

Webpack: 借助 Babel+TS+ESLint 构建现代 JS 工程环境

概述

  • Webpack 场景下处理 JavaScript 的三种常用工具:Babel、TypeScript、ESLint 的历史背景、功能以及接入 Webpack 的步骤
  • 借助这些工具,我们能构建出更健壮、优雅的 JavaScript 应用

使用 Babel

  • ECMAScript 6.0(简称 ES6) 版本补充了大量提升 JavaScript 开发效率的新特性,包括 class 关键字、块级作用域、ES Module 方案、代理与反射等,使得 JavaScript 可以真正被用于编写复杂的大型应用程序,但知道现在浏览器、Node 等 JavaScript 引擎都或多或少存在兼容性问题

  • 为此,现代 Web 开发流程中通常会引入 Babel 等转译工具。Babel 是一个开源 JavaScript 转编译器,它能将高版本 —— 如 ES6 代码等价转译为向后兼容,能直接在旧版 JavaScript 引擎运行的低版本代码,例如:

    // 使用 Babel 转译前
    arr.map(item => item + 1)// 转译后
    arr.map(function (item){return item + 1;
    })
    
  • 示例中高版本的箭头函数语法经过 Babel 处理后被转译为低版本 function 语法,从而能在不支持箭头函数的 JavaScript 引擎中正确执行

  • 借助 Babel 我们既可以始终使用最新版本 ECMAScript 语法编写 Web 应用,又能确保产物在各种环境下正常运行

  • 提示:Babel 还提供了一个在线版的 REPL 页面,读者可在 babeljs.io/repl 实时体验功能效果

  • Webpack 场景下,只需使用 babel-loader 即可接入 Babel 转译功能:

1 ) 安装依赖并配置

npm i -D @babel/core @babel/preset-env babel-loader
  • 添加模块处理规则

    module.exports = {/* ... */module: {rules: [{test: /\.js$/,use: ['babel-loader'],},],},
    };
    
  • 示例中,module 属性用于声明模块处理规则,module.rules 子属性则用于定义针对什么类型的文件使用哪些 Loader 处理器,上例可解读为:

  • test: /\.js$/:用于声明该规则的过滤条件,只有路径名命中该正则的文件才会应用这条规则,示例中的 /\.js$/ 表示对所有 .js 后缀的文件生效

  • use:用于声明这条规则的 Loader 处理器序列,所有命中该规则的文件都会被传入 Loader 序列做转译处理

2 )执行编译命令

  • $ npx webpack

  • 接入后,可以使用 .babelrc 文件或 rule.options 属性配置 Babel 功能逻辑,例如:

    // 预先安装 @babel/preset-env
    // npm i -D @babel/preset-env
    module.exports = {/* ... */module: {rules: [{test: /\.js$/,use: [{loader: 'babel-loader',options: {presets: ['@babel/preset-env'],},},],},],},
    };
    
  • 特别提一下,示例中的 @babel/preset-env 是一种 Babel 预设规则集 —— Preset,这种设计能按需将一系列复杂、数量庞大的配置、插件、Polyfill 等打包成一个单一的资源包,从而简化 Babel 的应用、学习成本。

  • Preset 是 Babel 的主要应用方式之一,社区已经针对不同应用场景打包了各种 Preset 资源,例如:

  • babel-preset-react:包含 React 常用插件的规则集,支持 preset-flowsyntax-jsxtransform-react-jsx 等;

  • @babel/preset-typescript:用于转译 TypeScript 代码的规则集

  • @babel/preset-flow:用于转译 Flow 代码的规则集

  • 提示:关于 Babel 的功能、用法、原理还有非常大的学习空间,感兴趣的同学可以前往阅读官方文档:babeljs.io/docs/en/ ,这里点到为止,把注意力放回 Webpack + Babel 协作上

使用 TypeScript

  • 从 1999年 ECMAScript 发布第二个版本到 2015年发布 ES6 之间十余年时间内,JavaScript 语言本身并没有发生太大变化,语言本身许多老旧特性、不合理设计、功能缺失已经很难满足日益复杂的 Web 应用场景
  • 为了解决这一问题,社区陆续推出了一些 JavaScript 超集方言,例如 TypeScript、CoffeeScript、Flow
  • 其中,TypeScript 借鉴 C# 语言,在 JavaScript 基础上提供了一系列类型约束特性,例如:
  • 示例中,用一个数字类型的变量 num 减去字符串类型的变量 str,这在 TypeScript 的代码编译过程就能提前发现问题,而 JavaScript 环境下则需要到启动运行后才报错。

  • 这种类型检查特性虽然一定程度上损失了语言本身的灵活性,但能够让问题在编译阶段提前暴露,确保运行阶段的类型安全性,特别适合用于构建多人协作的大型 JavaScript 项目,也因此,时至今日 TypeScript 依然是一项应用广泛的 JavaScript 超集语言。

  • Webpack 有很多种接入 TypeScript 的方法,包括 ts-loaderawesome-ts-loaderbabel-loader。通常可使用 ts-loader 构建 TypeScript 代码:

1 )安装依赖并配置

  • $ npm i -D typescript ts-loader
  • 配置 Webpack
    const path = require('path');
    module.exports = {module: {rules: [{test: /\.ts$/,use: 'ts-loader'},],},resolve: {extensions: ['.ts', '.js'],}
    };
    
  • 使用 module.rules 声明对所有符合 /\.ts$/ 正则 —— 即 .ts 结尾的文件应用 ts-loader 加载器
  • 使用 resolve.extensions 声明自动解析 .ts 后缀文件,这意味着代码如 import "./a.ts" 可以忽略后缀声明,简化为 import "./a" 文件
  • 创建 tsconfig.json 配置文件,并补充 TypeScript 配置信息
    // tsconfig.json
    {"compilerOptions": {"noImplicitAny": true,"moduleResolution": "node"}
    }
    
  • 执行编译命令, $ npx webpack
  • 注意,如果项目中已经使用 babel-loader,你也可以选择使用 @babel/preset-typescript 规则集,借助 babel-loader 完成 JavaScript 与 TypeScript 的转码工作:

1 ) 安装依赖

  • $ npm i -D @babel/preset-typescript
  • 配置 Webpack
    // 预先安装 @babel/preset-env
    // npm i -D @babel/preset-env
    module.exports = {/* ... */module: {rules: [{test: /\.js$/,use: [{loader: 'babel-loader',options: {presets: ['@babel/preset-typescript'],},},],},],},
    };
    
  • 不过,@babel/preset-typescript 只是简单完成代码转换,并未做类似 ts-loader 的类型检查工作,大家需要根据实际场景选择适当工具

使用 ESLint

  • JavaScript 被设计成一种高度灵活的动态、弱类型脚本语言,这使得语言本身的上手成本极低,开发者只需要经过短暂学习就可以开始构建简单应用。
  • 但与其它编译语言相比,JavaScript 很难在编译过程发现语法、类型,或其它可能影响稳定性的错误,特别在多人协作的复杂项目下,语言本身的弱约束可能会开发效率与质量产生不小的影响,ESLint 的出现正是为了解决这一问题。
  • ESLint 是一种扩展性极佳的 JavaScript 代码风格检查工具,它能够自动识别违反风格规则的代码并予以修复,例如对于下面的示例:
源码ESLint 修复后
const foo ='foo'; let bar='bar'; console.log(foo,bar) const foo = 'foo' const bar = 'bar' console.log(foo, bar)
ESLint 配置:module.exports = { "extends": "standard" }
ESLint 报错:img
  • 这里先忽略 ESLint 配置的具体规则,样例源码存在诸多风格不统一的地方,例如 1、2 行以 ; 结尾,而第 3 行没有 ;;第一行变量以 const 声明,第二行变量以 let 声明,等等。
  • ESLint 会找出这些风格不一致的地方,并予以告警,甚至自动修复,生成如上表右上角的代码。
  • Webpack 下,可以使用 eslint-webpack-plugin 接入 ESLint 工具,步骤:

1 ) 安装依赖并配置

# 安装 webpack 依赖
yarn add -D webpack webpack-cli# 安装 eslint 
yarn add -D eslint eslint-webpack-plugin# 简单起见,这里直接使用 standard 规范
yarn add -D eslint-config-standard eslint-plugin-promise eslint-plugin-import eslint-plugin-node
  • 在项目根目录添加 .eslintrc 配置文件,内容:

    // .eslintrc
    {"extends": "standard"
    }
    
  • 提示:关于 ESLint 配置项的更多信息,可参考:eslint.org/docs/user-g…

  • 添加 webpack.config.js 配置文件,补充 eslint-webpack-plugin 配置:

    // webpack.config.js
    const path = require('path')
    const ESLintPlugin = require('eslint-webpack-plugin')module.exports = {entry: './src/index',mode: 'development',devtool: false,output: {filename: '[name].js',path: path.resolve(__dirname, 'dist')},// 添加 eslint-webpack-plugin 插件实例plugins: [new ESLintPlugin()]
    }
    

2 ) 执行编译命令

  • $ npx webpack
  • 配置完毕后,就可以在 Webpack 编译过程实时看到代码风格错误提示:

img

  • 除常规 JavaScript 代码风格检查外,我们还可以使用适当的 ESLint 插件、配置集实现更丰富的检查、格式化功能,这里推荐几种使用率较高第三方扩展,建议读者跟进学习:

  • eslint-config-airbnb:Airbnb 提供的代码风格规则集,算得上 ESLint 生态第一个成名的规则集合

  • eslint-config-standard:Standard.js 代码风格规则集,史上最便捷的统一代码风格的方式

  • eslint-plugin-vue:实现对 Vue SFC 文件的代码风格检查

  • eslint-plugin-react:实现对 React 代码风格检查

  • @typescript-eslint/eslint-plugin:实现对 TypeScript 代码风格检查

  • eslint-plugin-sonarjs:基于 Sonar 的代码质量检查工具,提供圈复杂度、代码重复率等检测功能

综合示例

  • 最后,我们再串联上述三种工具,构建一套功能完备的 JavaScript 应用开发环境,步骤:

  • 安装基础依赖:

    npm i -D webpack webpack-cli \# babel 依赖@babel/core @babel/cli @babel/preset-env babel-loader \# TypeScript 依赖typescript @typescript-eslint/parser @typescript-eslint/eslint-plugin \@babel/preset-typescript \# ESLint 依赖eslint eslint-webpack-plugin
    
  • 创建 webpack.config.js 配置文件并输入:

    const path = require('path')
    const ESLintPlugin = require('eslint-webpack-plugin')module.exports = {entry: './src/index.ts',mode: 'development',devtool: false,output: {filename: '[name].js',path: path.resolve(__dirname, 'dist')},module: {rules: [{test: /\.ts$/,use: {loader: 'babel-loader',options: { presets: ['@babel/preset-typescript'] }}}]},plugins: [new ESLintPlugin({ extensions: ['.js', '.ts'] })]
    }
    
  • 注意,此处使用 @babel/preset-typescript 插件转译 TypeScript 代码。

  • 创建 .eslintrc 文件并输入:

    {"parser": "@typescript-eslint/parser","plugins": ["@typescript-eslint"],"extends": ["plugin:@typescript-eslint/recommended"]
    }
    
  • 之后只需执行 npx webpack 命令即可完成编译操作,例如:

src/index.ts 源码编译结果
const say = (statements: string) => { console.log(statements) }; // @ts-ignore say("Tecvan"); /******/ (() => { // webpackBootstrap var __webpack_exports__ = {}; /*!**********************!*\ !*** ./src/index.ts ***! \**********************/ const say = statements => { console.log(statements); }; // @ts-ignore say("Tecvan"); /******/ })() ;
img
  • 至此,我们就搭建了一个支持 Babel + TypeScript + ESLint 的开发环境,读者可在此基础上修改各项工具配置,定制适合自己项目的开发环境。

总结

  • 本文介绍了 ESLint、TypeScript、Babel 三类工程化工具的历史背景、功能,以及在 Webpack 中接入这些工具的具体步骤。
  • 这三种工具各自补齐了 JavaScript 语言某些薄弱环节:
    • Babel 提供的语言转译能力,能在确保产物兼容性的同时,让我们大胆使用各种新的 ECMAScript 语言特性;
    • TypeScript 提供的类型检查能力,能有效提升应用代码的健壮性;
    • ESLint 提供的风格检查能力,能确保多人协作时的代码一致性
  • 它们已成为构建现代 JavaScript 应用的基础设施

相关文章:

Webpack: 借助 Babel+TS+ESLint 构建现代 JS 工程环境

概述 Webpack 场景下处理 JavaScript 的三种常用工具:Babel、TypeScript、ESLint 的历史背景、功能以及接入 Webpack 的步骤借助这些工具,我们能构建出更健壮、优雅的 JavaScript 应用 使用 Babel ECMAScript 6.0(简称 ES6) 版本补充了大量提升 JavaSc…...

孩子不想上学,父母应如何教育?“强迫教育”会激起孩子反抗心理

上周末朋友聚会,都是家有上学娃的年纪,闲聊中,话题自然少不了孩子的上学问题。其中,不少朋友都有抱怨过同一个问题:孩子不想上学,即使人到了学校,心也不在学校。   事实上,孩子出现…...

Python深度学习技术

原文链接:Python深度学习技术 近年来,伴随着以卷积神经网络(CNN)为代表的深度学习的快速发展,人工智能迈入了第三次发展浪潮,AI技术在各个领域中的应用越来越广泛。Transformer模型(BERT、GPT-…...

ECharts 雷达图案例002 - 诈骗性质分析

ECharts 雷达图案例002 - 诈骗性质分析 📊 ECharts 雷达图案例002 - 诈骗性质分析 深入挖掘数据背后的故事,用可视化手段揭示诈骗行为的模式和趋势。 🔍 案例亮点 创新的数据展示方式,让复杂的诈骗数据一目了然。定制化的雷达图…...

想远程控制手机,用哪个软件好?

很多人都想知道安卓系统或iOS系统要如何实现手机远程控制手机、电脑远程控制手机,分别需要用到什么软件,这篇文章一次说清楚。 注意,安卓系统需要是7.0及以上版本,iOS系统需要是11及以上版本。具体使用步骤请点击关注,…...

数字内容“遍地开花”,AI技术如何创新“造梦”?

文 | 智能相对论 作者 | 陈泊丞 这是春晚舞台西安分会场《山河诗长安》的一幕:“李白”现世,带领观众齐颂《将进酒》,将中国人骨子里的豪情与浪漫演绎得淋漓尽致。 这又是浙江义乌商品市场里的另一幕:只会说几个英文单词的女老板…...

MySQL集群如何实现读写分离

数据源配置:定义了主从数据库的连接池。读写分离规则:通过MasterSlaveRuleConfiguration定义了主从数据库的读写分离规则。负载均衡算法:定义了从数据库的负载均衡算法。创建ShardingDataSource:使用数据源和读写分离规则创建了Sh…...

一分钟剪辑1000条视频的云微客矩阵,怎么做到的?

当我们打开短视频软件时,就会有大量风格迥异的短视频犹如潮水般涌现在我们面前,这些短视频不仅配置了加粗的标题,下方还配置了字幕,中间则播放着视频,就是这样简易的视频,往往总能获得较高的播放量&#xf…...

简单案例比较Lambda和方法引用的差别

1.打印列表元素 正常使用 List<String> list Arrays.asList("a", "b", "c");for (String str: list){System.out.println(str);}Lambda表达式 list.forEach(e -> System.out.println(e));方法引用 list.forEach(System.out::println…...

10 个最佳 AI 代码生成器

人工智能的兴起极大地影响了编码和开发领域。 人工智能驱动的代码生成器有助于简化编码流程、自动化日常任务&#xff0c;甚至预测和建议代码片段。 下面&#xff0c;我们介绍一些最好的人工智能代码生成器、它们的独特功能&#xff0c;以及它们如何彻底改变您的编程体验。 1.…...

Eureka服务发现机制解析:服务实例的唯一标识

引言 Eureka是Netflix开源的服务发现框架&#xff0c;它是Spring Cloud体系中的核心组件之一。在微服务架构中&#xff0c;服务实例的动态注册与发现是实现服务间解耦和通信的关键。Eureka通过提供服务注册中心&#xff0c;使得各微服务实例能够注册自己并发现其他服务实例。本…...

操作系统实训复习笔记(基于命名管道与信号的进程间通信)

目录 基于命名管道与信号的进程间通信 第1关&#xff1a;命名管道与信号IPC操作考查 基于命名管道与信号的进程间通信 第1关&#xff1a;命名管道与信号IPC操作考查 &#xff08;没啥好说的&#xff0c;不会的操作系统考试就靠记呗&#xff01;&#xff01;&#xff09; slee…...

数字化转型第三步:数字化业务创新与发展,提升收入和利润

引言&#xff1a;之前笔者的文章发布了企业数字化转型业务部分&#xff0c;如【开源节流】如何通过数字化转型增强盈利能力&#xff1f;企业供应链数字化转型如何做&#xff1f;让企业盈利能力增强再飞一会 【财务数字化转型之底座】集团企业财务数据中台系统建设方案 等文章&a…...

SSM爱心捐赠物资维护系统-计算机毕业设计源码09536

摘要 随着信息技术的快速发展&#xff0c;计算机应用已经进入成千上万的家庭。随着物资数量的增加&#xff0c;物资库存管理也存在许多问题。物资数据的处理量正在迅速增加&#xff0c;原来的手工管理模式不适合这种形式。使用计算机可以完成数据收集、处理和分析&#xff0c;减…...

​中国9大流域地图SHP数据

九大流域片区是指中国境内九个主要流域片区。 分别包括东南诸河区、内陆河区、松辽河流区、海河流域区、淮河流域区、珠江流域片、西南诸河片、长江流域片和黄河流域片等。 如果这九大流域数据对你有用&#xff0c;请在文末查看该数据的领取方法。 中国9大流域图 流域&…...

android Switch/case with R.id.XXXX in android doesn‘t work 错误: 需要常量表达式解决方案

出现需要常量表达式 R.id.xxx 表达式错误的处理方法 出现的原因是因为: 使用 Android Gradle 插件 8.0.0 时&#xff0c;默认情况下&#xff0c;您的所有 R 类资源都不再声明为 final/constant&#xff08;因此在 switch 语句中不起作用&#xff09;。 如果您在 Android Studi…...

vue3-openlayers marker 光晕扩散(光环扩散)(postrender 事件和 render 方法)

本篇介绍一下使用 vue3-openlayers marker 光晕扩散&#xff08;光环扩散&#xff09;&#xff08;postrender 事件和 render 方法&#xff09; 1 需求 marker 光晕扩散&#xff08;光环扩散&#xff09; 2 分析 marker 光晕扩散&#xff08;光环扩散&#xff09;使用 post…...

新型防勒索病毒方案分享无需依靠病毒库

MCK具备可信系统&#xff0c;数据库保护&#xff0c;场景白名单&#xff0c;文件保护四大功能。如何运用在防勒索病毒中 在防勒索病毒的问题上&#xff0c;MCK主机的加固功能显得尤为重要。MCK的四大功能——可信系统、数据库保护、场景白名单以及文件保护&#xff0c;为我们在…...

《Mybatis-Plus》系列文章目录

什么是 MyBatis-Plus&#xff1f; Mybatis-Plus是一个在MyBatis基础上进行增强和扩展的开源Java持久层框架。 Mybatis-Plus&#xff08;简称MP&#xff09;旨在简化开发、提高效率&#xff0c;通过提供一系列便捷的功能和工具&#xff0c;大幅度减少开发人员编写重复代码的时…...

在Matplotlib中,`xlim()` 函数用于设置x轴的显示范围,原因和作用如下:

在Matplotlib中&#xff0c;xlim() 函数用于设置x轴的显示范围&#xff0c;原因和作用如下&#xff1a; 1. **控制显示范围**&#xff1a; xlim() 允许用户指定x轴的最小值和最大值&#xff0c;从而控制图表显示的数据范围。 2. **改善可视化**&#xff1a; 通过设置x轴的范围…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...