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 应用的基础设施

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/743477.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】进程 | 控制块pcb | task_struct | 创建子进程fork

目录 Ⅰ. 进程的概念(Process) 1. 什么是进程? 2. 多进程管理 3. 进程控制块(PCB) task_struct 的结构 Ⅱ. 进程查看与管理 1. 使用指令查看进程 2. /proc 查看进程信息 3. 获取进程 ID 4. 创建子进程 原因…

Vue2-表单与v-model

1.Vue表单使用 表单输入绑定&#xff1a;表单输入绑定 — Vue.js #v-model双向数据绑定new Vue({template: <div>/* 用户修改 , vue-data数据同步修改(内存) */<input v-model"message" placeholder"edit..."><p>message: {{message}}&…

2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024,8月2日-4)

2024年虚拟现实、图像和信号处理国际学术会议&#xff08;ICVISP 2024&#xff09;将于2024年8月2-4日在中国厦门召开。ICVISP 2024将围绕“虚拟现实、图像和信号处理”的最新研究领域&#xff0c; 为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提…

Python 参数类型

一 理解Python中的Parameters & Arguments Parameters&#xff1a;形参 Arguments&#xff1a;实参 二 Python的实参&#xff08;Arguments&#xff09;类型 实参类型总结 位置参数&#xff08;Positional Arguments&#xff09; &#xff1a;函数调用时通过入参的顺序来…

Younger 数据集:人工智能生成神经网络

设计和优化神经网络架构通常需要广泛的专业知识&#xff0c;从手工设计开始&#xff0c;然后进行手动或自动化的精细化改进。这种依赖性成为快速创新的重要障碍。认识到从头开始自动生成神经网络架构的复杂性&#xff0c;本文引入了Younger&#xff0c;这是一个开创性的数据集&…

【Unity】RPG2D龙城纷争(五)关卡编辑器之地图编辑

更新日期&#xff1a;2024年6月25日。 项目源码&#xff1a;本章发布 索引 简介关卡编辑器窗口类&#xff08;LevelEditor&#xff09;一、定义关卡编辑器窗口类二、两种编辑模式三、地块编辑模式1.关卡模板2.打开编辑窗口3.编辑器基本属性4.地块模板5.重新生成地图6.地图刷子7…

基于优化包络相关的Loran-C(罗兰C)信号天地波识别算法及MATLAB仿真代码和实测信号处理

引言 Loran-C接收信号处理中&#xff0c;完成信号的捕获后需要进行信号的跟踪&#xff0c;Loran-C信号的跟踪按照信号处理流程分为天地波识别、周期识别和正向过零点跟踪三个步骤。Loran-C信号通过天波和地波两种方式到达接收点&#xff0c;导致接收到信号为地波和天波的合成信…

YOLOv5改进(八)--引入Soft-NMS非极大值抑制

文章目录 1、前言2、各类NMS代码实现2.1、general.py 3、各类NMS实现3.1、Soft-NMS3.2、GIoU-NMS3.3、DIoU-NMS3.4、CIoU-NMS3.5、EIoU-NMS 4、目标检测系列文章 1、前言 目前yolov5使用的是NMS进行极大值抑制&#xff0c;本篇文章是要将各类NMS添加到yolov5中&#xff0c;同时…

性能优化-布局优化

性能优化-布局优化 屏幕的UI刷新机制 布局的选择 优化控件的使用 原生View的优化 1、屏幕的UI刷新机制 超过16ms会感觉卡顿&#xff0c; 刷新率&#xff08;Refresh Rate&#xff09;&#xff1a;指一秒内刷新屏幕的次数&#xff0c;例如60HZ&#xff1b; 帧率&#xff08;F…

菲律宾媒体PR发稿:谷歌SEO优化.关键词排名.谷歌收录

1. 引言 在菲律宾&#xff0c;媒体行业的发展日新月异&#xff0c;尤其是在线媒体。为了在这个竞争激烈的市场中脱颖而出&#xff0c;各家媒体纷纷寻求谷歌SEO优化、提升关键词排名和增加谷歌收录的方法。本文将围绕菲律宾的几大主要在线媒体&#xff0c;如菲律宾在线日志Jour…

优化系统小工具

一款利用VB6编写的系统优化小工具&#xff0c;系统优化、桌面优化、清理垃圾、查找文件等功能。 下载:https://download.csdn.net/download/ty5858/89432367

WPS复制后转置粘贴

1. WPS复制后转置粘贴 复制-》右键-》顶部第一行-》粘贴行列转置&#xff0c;如下图&#xff1a; 2. Excel office365 本地版 2. Excel office365 在线版

孙子兵法的笔记

系列文章目录 孙子兵法的笔记 三十六计的笔记 文章目录 系列文章目录1、始计第一【原文】【译文】 1、始计第一 用兵始于计谋&#xff0c;善善策出自“庙算”&#xff0c;而精确的“庙算”又来自对各种因素的侦测考察。 孙子在第一章中非常具体地提出了“五事”“七计”的考察标…

缓冲池管理器

开发环境搭建 克隆 git clone https://github.com/cmu-db/bustub.git cd bustub/ 切换分支 git checkout -b branchname v20221128-2022fall 创建docker镜像 docker build . -t bustub_img 创建容器 docker create -it --name bustub_container -v “E:/cmu/bustub”:“/bustu…

自然语言处理课程论文:《Attention is all you need》复现与解读

目录 1.背景介绍 1.1 文献介绍 1.2 研究背景 1.3 知识概述 1.3.1 机器翻译 1.3.2 attention机制与self-attention机制 2.数据来源与处理 2.1 数据集描述 2.2 数据处理 3. 模型架构 ​​​​​​​3.1 Positional Embedding ​​​​​​​3.2 Multi-Head Attention ​​​​​…

[UE虚幻引擎] DTSpeechVoice 文字转语音播放 插件说明

本插件可以在UE中使用蓝图把文本转成语音播放&#xff0c;播放的声音引擎是使用Windows自带的语音引擎&#xff0c;支持Win10&#xff0c;Win11。 系统设置 首先确认电脑是否有语音系统&#xff0c;一般正常安装的电脑都是自带的。 如果要播放多语言的&#xff0c;请自己下载其…

突发!OpenAI停止不支持国家API,7月9日开始执行

6月25日凌晨&#xff0c;有部分开发者收到了OpenAI的信&#xff0c;“根据数据显示&#xff0c;你的组织有来自OpenAl目前不支持的地区的API流量。从7月9日起&#xff0c;将采取额外措施&#xff0c;停止来自不在OpenAI支持的国家、地区名单上的API使用。” 但这位网友表示&am…

【宠粉赠书】SQLServer2022:从入门到精通

为了回馈粉丝们的厚爱&#xff0c;今天小智给大家送上一套数据库学习的必备书籍——《SQL Server 2022从入门到精通》。下面我会详细给大家介绍这套图书&#xff0c;文末留有领取方式。 图书介绍 《SQL Server 2022从入门到精通》系统全面地介绍SQL Server 2022数据库应用与开…

文献阅读:通过双线性建模来破译神经元类型连接的遗传密码

文献介绍 文献题目 Deciphering the genetic code of neuronal type connectivity through bilinear modeling 研究团队 Mu Qiao&#xff08;美国加州理工学院&#xff09; 发表时间 2024-06-10 发表期刊 eLife 影响因子 7.7 DOI 10.7554/eLife.91532.3 摘要 了解不同神经元…

【C++STL】Vector扩容机制

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…